opengl纹理

时间:2011-05-09 02:52:41

标签: 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 float Vector3f [3];

和texels是:Vector3f ** texels;

当我使用正交矩阵(适用于加载的纹理)将此纹理绘制到screenquad时,我得到this

我不确定为什么它看起来不是完全绿色,也是导致黑色条纹出现的原因。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您的数组需要连续,因为glTexImage2D()不采用任何类型的步幅或行映射参数:

texels = new Vector3f[256*256];