C++ 顶点数组中每个多边形的纹理处理-OpenGL

C++ 顶点数组中每个多边形的纹理处理-OpenGL,c++,opengl,vertex-array,C++,Opengl,Vertex Array,我正在尝试让我的渲染功能正常工作。我使用的是顶点数组。这是我的顶点结构 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 }

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

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++;
    }
}
//渲染网格
void WLD::render(GLuint*纹理、长区域、CFrustum CFrustum)
{
int num=0;
//设置我的索引
胶合指数[3];
//在PVS中循环
while(nummin[0],区域[i].meshptr->min[2],区域[i].meshptr->min[1],区域[i].meshptr->max[0],区域[i].meshptr->max[2],区域[i].meshptr->max[1]))
{
//循环遍历网格中的每个多边形并进行渲染
对于(int j=0;jpolygonCount;j++)
{   
//将多边形的索引指定给巨大顶点数组中的索引
标记[0]=区域[i]。网格PTR->多边形[j]。垂直索引[0];
标记[1]=区域[i]。meshptr->多边形[j]。垂直索引[1];
标记[2]=区域[i].网格PTR->多边形[j].垂直索引[2];
glEnableClientState(GL_顶点_数组);
glvertexinter(3,GL_FLOAT,sizeof(Vertex),&vertices[0].x);
//纹理指数
int-tex=regions[i].meshptr->poly[j].tex;
//需要将其绑定到我渲染的多边形。
glEnableClientState(GL_纹理_坐标_阵列);
glTexCoordPointer(2,GL_浮点,sizeof(顶点),&vertices[0].u);
元素(三角形,3,无符号整数,标记);
glDisableClientState(GL_顶点_数组);
glDisableClientState(GL_纹理_坐标_数组);
}
}
}
num++;
}
}
其中一个参数GLuint*纹理包含所有加载的纹理。因此,行int-tex=regions[i].meshptr->poly[j].tex返回的值;是此特定多边形的纹理索引。渲染时如何将其绑定到每个多边形?如果你有任何问题,请告诉我


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

通常不可能尝试这样做。通常不会尝试使用多个纹理渲染单个三角形流(一个
glDraw*
调用)。无论如何,不是你说的那样

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

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


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

您可以使用currect方法来实现这一点。您不需要
glClientActiveTexture
。该函数用于多重纹理,我假设每个多边形只应用了一个纹理。因此,在绘制多边形之前,只需使用
glBindTexture(GL\u texture\u 2D,textures[tex])
绑定必要的纹理,不要忘记使用
glEnable(GL\u texture\u 2D)
(如果不使用着色器)


但是,尽管它有效,但这显然不是最好的方法。顶点数组用于一次性渲染多个基本体(三角形)(一次调用
gldrawerelements
),而您会错误地使用它们渲染单个三角形。第一个也是最简单的想法是,至少按纹理索引对多边形排序,然后在一次调用
glpaurements
中渲染具有相同纹理的所有三角形。查看Nicol的答案,了解更高级的方法。

那么我的计划是什么?渲染每个区域时,使用匹配的纹理索引渲染每个多边形的组。你建议怎么做?@Moniker:建议做什么?您还没有说您实际渲染的是什么。你所说的就是你有一些三角形,你想把一些纹理和它们联系起来。这是粒子系统吗?这是某种瓷砖地图吗?这是从建模器导出的网格吗?你在渲染什么?这是一个旧游戏的区域。它具有链接到网格的各种区域。这些网格包含x数量的多边形和y数量的顶点。我有一个PVS,它是一个潜在的可见部分,所以如果我站在区域3,它会生成一个区域列表,我可以从我当前的位置看到这些区域。然后,我通过一个平截头体对这些潜在可见区域进行排序,以确定哪个区域是可见的。这些区域包含指向巨大顶点列表中顶点的多边形。每个多边形在纹理列表中都有索引。例如,多边形6具有区域5……的一部分,参考顶点1234、1263和1253。它还具有纹理参考。所以我想渲染特定区域中的所有多边形。问题是每个多边形都有一个关联的纹理。任何想法。我可以画一个UML图,我愿意为此支付任何帮助。认真地在这方面花钱寻求帮助。谢谢你。@Nicol但用他目前的代码,这绝对是可能的,尽管不是最快/最聪明的方法。也许一个解决方案是创建一个纹理图谱。这个