C++ 使用glDrawRangeElements()进行渲染时工作不正常

C++ 使用glDrawRangeElements()进行渲染时工作不正常,c++,opengl,render,C++,Opengl,Render,这是我上一个问题的后续问题。我所有的问题都在我的最后一个帖子中得到了回答,但这是我遇到的一个新错误。在中间模式下渲染时,一切看起来都很棒 事实上: 现在,我使用glDrawRangeElements()进行渲染,看看会发生什么: 以前有人见过这样的东西吗?看起来有些指数只是在中间,这根本没有意义。< /P> 这是我用来渲染关卡的函数 void WLD::renderIntermediate(GLuint* textures, long curRegion, CFrustum cfrustum

这是我上一个问题的后续问题。我所有的问题都在我的最后一个帖子中得到了回答,但这是我遇到的一个新错误。在中间模式下渲染时,一切看起来都很棒

事实上:

现在,我使用glDrawRangeElements()进行渲染,看看会发生什么:

以前有人见过这样的东西吗?看起来有些指数只是在中间,这根本没有意义。< /P> 这是我用来渲染关卡的函数

void WLD::renderIntermediate(GLuint* textures, long curRegion, CFrustum cfrustum)
{
    // Iterate through all of the regions in the PVS
    for(int i = 0; i < regions[curRegion].visibility.size(); i++)
    {
        // Grab a visible region
        int vis = regions[curRegion].visibility[i];

        // Make sure it points to a mesh
        if(regions[vis].meshptr == NULL)
            continue;

        // Make sure it is in our PVS
        if(!cfrustum.BoxInFrustum(regions[vis].meshptr->minX, regions[vis].meshptr->minY, regions[vis].meshptr->minZ, regions[vis].meshptr->maxX, regions[vis].meshptr->maxY, regions[vis].meshptr->maxZ))
            continue;

        // Optional: Only render the region we are in (for testing)
        //if(vis != curRegion)
        //  continue;

        // Now find the ID of the zone mesh in the array
        int id = regions[vis].meshptr->id;

        // Figure out how many calls we will have to do to render it (different textures)
        int calls = zmeshes[id].numPolyTex;

        int count = 0;

        // Render each call in batches
        for(int j = 0; j < calls; j++)
        {

            // Bind the correct texture
            glBindTexture(GL_TEXTURE_2D, textures[zmeshes[id].polyTexs[j].texIndex]);

            // Set up rendering states
            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);

            errorLog.writeSuccess("Drawing debug: ID: %i - Min: %i - Max: %i - Polys in this call %i - Count: %i - Location: %i", id, zmeshes[id].minmax[j].min, zmeshes[id].minmax[j].max, zmeshes[id].polyTexs[j].polyCount, zmeshes[id].polyTexs[j].polyCount * 3, count);

            glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &zmeshes[id].vertices[0].x);
            glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &zmeshes[id].vertices[0].u);

            // Draw
            glDrawRangeElements(GL_TRIANGLES, zmeshes[id].minmax[j].min, zmeshes[id].minmax[j].max, zmeshes[id].polyTexs[j].polyCount * 3, GL_UNSIGNED_SHORT, zmeshes[id].indices + count);

            // End of rendering - disable states
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_TEXTURE_COORD_ARRAY);

            // Add the number of indices rendered
            count += zmeshes[id].polyTexs[j].polyCount * 3;

        }
    }
}
void-WLD::renderIntermediate(GLuint*纹理、长电流、CFrustum CFrustum)
{
//遍历PV中的所有区域
对于(int i=0;i<区域[curRegion].visibility.size();i++)
{
//抓住一个可见区域
int vis=区域[curRegion]。可见性[i];
//确保它指向网格
if(区域[vis].meshptr==NULL)
继续;
//确保它在我们的PVS中
如果(!cfrustum.boxInforustum(区域[vis].meshptr->minX,区域[vis].meshptr->minY,区域[vis].meshptr->minZ,区域[vis].meshptr->maxX,区域[vis].meshptr->maxY,区域[vis].meshptr->maxZ))
继续;
//可选:仅渲染我们所在的区域(用于测试)
//如果(vis!=当前区域)
//继续;
//现在在阵列中找到分区网格的ID
int id=区域[vis].meshptr->id;
//计算出我们需要进行多少次调用才能渲染它(不同的纹理)
int calls=zmeshes[id].numPolyTex;
整数计数=0;
//成批呈现每个调用
for(int j=0;j

我已经做了大量的调试信息,表明我的最小/最大值设置正确。在这一点上,我认为这可能是索引错误,因此我将继续查看/重写该函数。

设法使其工作。非常感谢在另一个论坛上有人准确地将他的问题标注在原点的第三个顶点的位置


似乎我需要将索引数据类型从int改为short。工作起来很有魅力,我的FPS增加了1500%。

设法让它工作起来。非常感谢在另一个论坛上有人准确地将他的问题标注在原点的第三个顶点的位置


似乎我需要将索引数据类型从int改为short。效果很好,我的FPS增加了1500%。

好的,看起来它们好像都在原点(0,0,0)合并。不可思议的奇怪。有人有什么建议吗?好的,看来他们都在原点(0,0,0)合并。不可思议的奇怪。有人有什么建议吗?