opengl纹理

opengl纹理,opengl,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 Vec

我正在尝试在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);
glActiveTexture(GL_纹理7);
glGenTextures(1,&法线);
glBindTexture(GL_纹理_2D,法线);
texel=新矢量3f*[256];
对于(int i=0;i<256;++i){
texel[i]=新矢量3f[256];
}
此->设置_法线();
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexImage2D(GL_纹理2D、0、3、256、256、0、GL_RGB、GL_浮点、Texel);

void设置_normals(){
对于(int i=0;i<256;++i){
对于(int j=0;j<256;++j){
texel[i][j][0]=0.0f;
texel[i][j][1]=1.0f;
texel[i][j][2]=0.0f;
}
}
}
其中矢量3f为:typedef float Vector3f[3]

而texel是:向量3f**texel

当我使用正交矩阵(适用于加载的纹理)将此纹理绘制到屏幕四边形时,我得到


我不确定为什么它没有完全呈现绿色,也不确定是什么原因导致它内部出现黑色条纹。非常感谢您的帮助。

您的数组需要是连续的,因为
glTexImage2D()
不接受任何类型的跨步或行映射参数:

texels = new Vector3f[256*256];

谢谢,只是出于兴趣你知道有没有办法使用多维数组?也许通过使用glPixelstoref更改一些参数?我不这么认为,至少不是您创建阵列的方式<代码>新< /Cord>可以返回几乎没有任何与先前分配的规范关系的内存地址。@ Bunnit:C和C++动态“多维”数组不是你所想的。实际上,只有索引操作符链中的最后一次取消引用才指向数据。前面的所有索引运算符都将解引用到更多指针的数组中。
texels = new Vector3f[256*256];