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

Posted

技术标签:

【中文标题】纹理顶点数组中的每个多边形 - OpenGL【英文标题】:Texturing each polygon in vertex array - OpenGL 【发布时间】:2011-10-22 01:34:21 【问题描述】:

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

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 渲染时将其绑定到多边形。

【问题讨论】:

也许一个解决方案是创建一个纹理图集。唯一的问题是获得正确的纹理坐标,但这可以通过类和 XML 在客户端完成。这样你就不用担心切换纹理了。 您在滥用顶点数组。顶点数组的想法是,您在单个 glDrawElements 调用中批量处理大量三角形,而不是为每个三角形切换顶点数组指针并让 glDrawElements 只调用一个三角形。也不需要将顶点结构填充为 32 的倍数(无论如何?)。 @datenwolf 但在他的情况下,这似乎是必要的,因为他希望每个多边形都具有不同的纹理(尽管还有其他方法)。 @Christian Rau:他可以为此 opengl.org/wiki/Array_Texture 使用纹理数组,但我同意纹理图集可能是明智的解决方案。 @Moniker:如果您坚持原来的方法,请尝试首先对每个纹理的三角形进行排序,在渲染过程中尽可能少地交换纹理。这是并且一直是一个好主意 (tm)。 【参考方案1】:

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

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

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

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

【讨论】:

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

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

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

【讨论】:

以上是关于纹理顶点数组中的每个多边形 - OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学输出图元_10_多边形填充区_8_OpenGL顶点数组

如何在OpenGL中将像素作为纹理绘制到多边形?

渲染镶嵌对象的最佳方式 (OpenGL)

用opengl实现网格[重复]

使用 OpenGL C++ 渲染到纹理

如何在opengl中平滑多个四边形的纹理