5

我正在尝试让我的渲染功能正常工作。我正在使用顶点数组。这是我的顶点结构。

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* 纹理包含所有加载的纹理。所以行 int tex = region[i].meshptr->poly[j].tex; 返回的值 是这个特定多边形的纹理索引。渲染时如何将其绑定到每个多边形?如果您有任何问题,请告诉我。

我知道我需要使用 glClientActiveTexture() 但是一,它说它是未定义的,我找不到正确的标题,二,我不知道它是如何使用的。我找不到任何好的例子。那么,如果说多边形引用纹理索引 4,我该如何在使用 glClientActiveTexture 渲染时将其绑定到多边形。

4

2 回答 2

3

您尝试做的事情通常是不可能的。您通常不会尝试glDraw*使用多个纹理渲染单个三角形流(调用)。好吧,无论如何,不​​是你的意思。

单个绘制调用中的每个三角形都必须与该绘制调用中的每个其他三角形从同一组纹理中提取。

一般的解决方案是将图像组合成一个纹理。这通常称为“纹理图集”。在这种情况下,顶点上的纹理坐标描述了从纹理图集(这是单个纹理)中提取图像数据的位置。

如果您使用支持 GL 4.0 的硬件 (D3D11) 和 GLSL,那么您可以使用一些技巧来根据任意计算在 16 个纹理之间动态选择。对于早期的硬件,您可以使用着色器在纹理之间进行选择。但这两种情况都比仅仅正确地按摩数据要慢。

于 2011-08-08T02:26:27.347 回答
1

你可以用你正确的方法做到这一点。你不需要glClientActiveTexture。此功能用于多重纹理,我想每个多边形都只应用了一个纹理。因此,只需使用绑定必要的纹理,并且在绘制多边形之前glBindTexture(GL_TEXTURE_2D, textures[tex])不要忘记(如果不使用着色器)。glEnable(GL_TEXTURE_2D)

但是虽然它有效,但这显然不是最好的方法。顶点数组可以一次性渲染多个图元(三角形)(一次调用glDrawElements),而您误用它们来渲染单个三角形。第一个也是最简单的想法是至少按纹理索引对多边形进行排序,然后在一次调用中渲染所有具有相同纹理的三角形glDrawElements。查看 Nicol 的答案以获得更高级的方法。

于 2011-08-08T13:42:06.590 回答