我正在尝试使用“n”个纹理绘制一个任意对象(示例中为6个),每个面都有一个(但可能不同)纹理。
使用单个纹理时,一切正常,但我很难让2D纹理数组工作。
这是对象:
struct Vertex3f { float x, y, z; };
struct ObjectVertexfMT { // MT stands for Multi Texture
struct Vertex3f coord;
struct Vertex3f texcoord;
struct Vertex3f normal;
};
struct ObjectVertexfMT GLEngine_CubeMT[] = {
// x, y, v, u, v, r, nx, ny, nz
// Front
{ -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
{ 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
{ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f },
{ -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f },
// Back
{ -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f },
{ 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f },
{ 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f },
{ -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f },
// Top
{ -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 2.0f, 0.0f, 1.0f, 0.0f },
{ -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f },
{ 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 2.0f, 0.0f, 1.0f, 0.0f },
// Bottom
{ -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f },
{ -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f },
{ 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 3.0f, 0.0f, -1.0f, 0.0f },
{ 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 3.0f, 0.0f, -1.0f, 0.0f },
// Right
{ 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 4.0f, 1.0f, 0.0f, 0.0f },
{ 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 4.0f, 1.0f, 0.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 4.0f, 1.0f, 0.0f, 0.0f },
{ 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 4.0f, 1.0f, 0.0f, 0.0f },
// Left
{ -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 5.0f, -1.0f, 0.0f, 0.0f },
{ -1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 5.0f, -1.0f, 0.0f, 0.0f },
{ -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 5.0f, -1.0f, 0.0f, 0.0f },
{ -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 5.0f, -1.0f, 0.0f, 0.0f }
};
请注意,“r”参数对于每个四边形是不同的(表示我想要在该特定四边形中的纹理的索引)。
我正在注册纹理:
struct texInfo {
int width, height;
unsigned char *data;
};
// Loads texture from filename in a texInfo structure -- always 32 bit depth
struct texInfo *loadTexture(const char* filename);
unsigned int register3DTexture(const char *filenames[], unsigned int texcount) {
unsigned int ret;
unsigned int i;
struct texInfo *tex;
glGenTextures(1, &ret);
glBindTexture(GL_TEXTURE_2D_ARRAY, ret);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, 4, 256, 256, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
for (i = 0; i < texcount; i++) {
tex = loadTexture(filenames[i]);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, tex->width, tex->height, 1, GL_RGBA, GL_UNSIGNED_BYTE, tex->data);
free(tex);
}
return(ret);
}
...然后我画:
glPushMatrix();
glClientActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, textures[0]); // Same behaviour if I change to GL_TEXTURE_2D
glTranslatef(pos.x, pos.y, pos.z);
glRotatef(rot_angle, rot.x, rot.y, rot.z);
glBindBuffer(GL_ARRAY_BUFFER, VobObject[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VobObject[1]);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(struct ObjectVertexfMT), 0);
glNormalPointer(GL_FLOAT, sizeof(struct ObjectVertexfMT), (void*)(sizeof(float) * 6));
// Textures
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(struct ObjectVertexfMT), (void*)(sizeof(float) * 3));
glDrawElements(GL_QUADS, m_vertexcount, GL_UNSIGNED_SHORT, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glPopMatrix();
正确绘制了对象,但没有纹理。
另外几个问题:
假设它有效,这是实现目标的最佳方法吗?
“subtextures”可以具有不同的“主”纹理尺寸(
glTexImage3D()
上的宽度和高度参数可能不同
来自glTexSubImage3D()
)的那些?
答案 0 :(得分:1)
您必须使用着色器才能使用数组纹理。您不能将它们与固定功能渲染一起使用。
“subtextures”可以具有不同的“主”纹理尺寸(glTexImage3D()上的宽度和高度参数可能与glTexSubImage3D()中的参数不同吗?
这个问题很困惑。就像C ++数组一样,纹理数组的元素都是相同的。如果在C ++中有一个int[30]
数组,则每个元素的大小为30个整数。数组纹理也是如此。 2D数组纹理作为一个整体具有宽度和高度,对于数组中的所有纹理都是相同的。
glTexSubImage3D
(及类似函数)不会影响纹理的尺寸。它所做的就是将像素数据上传到纹理中的某个位置。只有glTexImage3D
(和类似的函数)会影响纹理的尺寸。