我正试图让我的渲染函数工作。我用的是顶点数组。这是我的顶点结构。
struct Vertex
{
float x, y, z; // The x, y and z floating point values
float u, v; // The u - v texture coordinates
float padding[3]; // needs to be multiple of 32
};
这是我的渲染代码:
// Render the mesh
void WLD::render(GLuint* textures, long curRegion, CFrustum cfrustum)
{
int num = 0;
// Set up my indices
GLuint indicies[3];
// Cycle through the PVS
while(num < regions[curRegion].visibility.size())
{
int i = regions[curRegion].visibility[num];
if(!regions[i].dead && regions[i].meshptr != NULL)
{
if(cfrustum.BoxInFrustum(regions[i].meshptr->min[0], regions[i].meshptr->min[2], regions[i].meshptr->min[1], regions[i].meshptr->max[0], regions[i].meshptr->max[2], regions[i].meshptr->max[1]))
{
// Cycle through every polygon in the mesh and render it
for(int j = 0; j < regions[i].meshptr->polygonCount; j++)
{
// Assign the index for the polygon to the index in the huge vertex array
indicies[0] = regions[i].meshptr->poly[j].vertIndex[0];
indicies[1] = regions[i].meshptr->poly[j].vertIndex[1];
indicies[2] = regions[i].meshptr->poly[j].vertIndex[2];
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &verticies[0].x);
// Texture index
int tex = regions[i].meshptr->poly[j].tex;
// Need to bind this to the polygon I render.
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &verticies[0].u);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indicies);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
}
}
num++;
}
}
参数之一,GLuint* textures包含所有加载的纹理。因此,line int tex = regions[i].meshptr->poly[j].tex;是这个特定多边形的纹理索引。当我渲染它时,我如何将它绑定到每个多边形上?如果你有任何问题,请告诉我。
我知道我需要使用glClientActiveTexture(),但一个,它说它是未定义的,我找不到正确的头,二,我不知道它是如何使用的。我找不到任何好的例子。那么我如何,如果多边形引用纹理索引4,当我用glClientActiveTexture渲染时,将它绑定到多边形。
你想做的通常是不可能的。你通常不会尝试用多个纹理渲染单个三角形流(glDraw*
调用)。好吧,至少不是你的意思。
单个绘制调用中的每个三角形必须与该绘制调用中的其他三角形从相同的纹理集合中提取。
一般的解决方案是将图像组合成单个纹理。这通常被称为"纹理图集"。在这种情况下,顶点上的纹理坐标描述了纹理图集(这是一个单一的纹理)中提取图像数据的位置。
如果你正在使用GL 4.0支持的硬件(D3D11)和GLSL,那么你可以玩一些技巧来动态选择基于任意计算的16种纹理。对于早期的硬件,你可以使用着色器选择纹理。但是这两种情况都比正确地处理数据要慢。
您可以使用当前的方法完成此操作。你不需要glClientActiveTexture
。这个功能是用于多纹理,我想每个多边形只有一个纹理应用。因此,在绘制多边形之前,只需使用glBindTexture(GL_TEXTURE_2D, textures[tex])
绑定必要的纹理,不要忘记使用glEnable(GL_TEXTURE_2D)
(如果不使用着色器)。
但是,尽管它有效,这显然不是最好的方法。顶点数组是用来一次渲染多个原语(三角形)的(一次调用glDrawElements
),而你错误地使用它们来渲染单个三角形。第一个也是最简单的想法是至少根据纹理索引对多边形进行排序,然后在一次调用glDrawElements
时渲染具有相同纹理的所有三角形。看看Nicol对更高级方法的回答。