我正在尝试在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 float Vector3f [3];
和texels是:Vector3f ** texels;
当我使用正交矩阵(适用于加载的纹理)将此纹理绘制到screenquad时,我得到。
我不确定为什么它看起来不是完全绿色,也是导致黑色条纹出现的原因。任何帮助表示赞赏。
答案 0 :(得分:1)
您的数组需要连续,因为glTexImage2D()
不采用任何类型的步幅或行映射参数:
texels = new Vector3f[256*256];