2011-05-09 232 views
2

我想在opengl中創建一個可以加載到着色器並動態改變的法線貼圖,雖然目前我被困在如何創建紋理。opengl紋理

我目前有這樣的:

glActiveTexture(GL_TEXTURE7); 
glGenTextures(1, &normals); 
glBindTexture(GL_TEXTURE_2D, normals); 
texels = new Vector3f*[256]; 

for(int i = 0; i < 256; ++i){ 
    texels[i] = new Vector3f[256]; 
} 
this->setup_normals(); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_FLOAT, texels); 

...

void setup_normals(){ 
for(int i = 0; i < 256; ++i){ 
     for(int j = 0; j < 256; ++j){ 
      texels[i][j][0] = 0.0f; 
      texels[i][j][1] = 1.0f; 
      texels[i][j][2] = 0.0f; 
     } 
    } 
} 

其中Vector3f是:typedef的浮動Vector3f [3];

和texels是:Vector3f ** texels;

當我使用正交矩陣(它適用於加載的紋理)將此紋理繪製到screenquad時,我得到this

我不確定爲什麼它不會顯示爲完全綠色,還有什麼導致黑色條紋出現在它內部。任何幫助讚賞。

回答

1

你的陣列需要是連續的,因爲glTexImage2D()不採取任何形式的步幅或行映射參數:

texels = new Vector3f[256*256]; 
+0

這並就感謝你,只是出於興趣,你知道有什麼辦法使用多維數組?也許通過使用glPixelstoref更改一些參數? – 2011-05-09 03:24:55

+0

我不這麼認爲,至少不是你創建數組的方式。 'new'幾乎可以返回任何內存地址,並且與先前的分配沒有規定的關係。 – genpfault 2011-05-09 03:38:37

+1

@Bunnit:C和C++動態「多維」數組並不是你可能認爲的那樣。只有索引操作符鏈中的最後一次解除引用實際上指向數據。所有前面的索引運算符都解引用更多指針的數組。 – datenwolf 2011-05-11 08:35:37