首页 文章

使用glDrawElement的OpenGL渲染问题

提问于
浏览
0

当谈到我应该用于我的OpenGL延迟渲染的函数时,我有点困惑 .

我有一个VBO列表(顶点缓冲对象)

每一个代表一种类型的顶点,如一个可能是(位置颜色)

我也有一个用于减价

当我想渲染不同的对象时,我的问题来了

我使用directX方式,你1)激活你的顶点缓冲区2)激活你的索引缓冲区3)然后你在绘图调用上指定你的原始类型从顶点缓冲区的起始顶点,最小顶点索引,顶点计数,开始指责和原始计数

与openGL失去因为我可以使用:

glDrawElements - 但它使用渲染模式,对象计数,indice字节类型和索引

这基本上告诉我它将在VBO的开头呈现,如果我有多个对象,它将无法帮助我 .

任何人都知道openGL具有什么渲染功能,我可以在VBO中指定从哪里开始渲染并指定我的起始顶点位置?我希望有人有任何想法= \

3 回答

  • 0

    你有几个选择 .

    您可以在绘制该对象之前通过发出更多 glVertexAttribPointer 调用来重新定位每个特定对象的顶点数据的开始 . 或者你可以使用glDrawElementsBaseVertex,在那里你可以指定一个顶点索引,该索引可以添加所有索引 .

    后者应该可以在任何仍然支持的非英特尔硬件上使用 .

  • 1

    glDrawElements不是从VBO的开头开始,而是从指定start的指针开始 .

    如果你有一个VBO并且你想从它的后半部分开始渲染,那么你将字节偏移设置为从glVertexAttribPointer的最后一个属性开始 .

  • 0

    编辑:我刚刚意识到,如果你不使用着色器,这可能不适用,但由于我不熟悉传统的OpenGL,我不确定我的帖子对你有什么好处 . 您使用/定位的是什么版本?

    我最近问了一个关于glDrawElements here的问题 . 希望我发布的内容给出一些解释/示例 .

    我理解它的方式:你的索引是由你决定的,所以如果你想从第二个顶点开始,你可以尝试(一个基本的骨架,没有glVertexAttribPointer调用等,但我可以添加那些,如果你想):

    const float VBOdata = {
        //Some X and Y  coordinates for triangle1 (in the first quadrant)
        //(z = 0, w = 1 and are not strictly necessary here)
         0.0f,  1.0f, 0.0f, 1.0f //index 0
         0.0f,  0.0f, 0.0f, 1.0f  //1
         1.0f,  0.0f, 0.0f, 1.0f  //2
    
        //Some X and Y coordinates for triangle2 (in the second quadrant)
         0.0f, -1.0f, 0.0f, 1.0f  //3
         0.0f,  0.0f, 0.0f, 1.0f  //4
        -1.0f,  0.0f, 0.0f, 1.0f  //5
    
        //Now some color data (all white)
         1.0f, 1.0f, 1.0f, 1.0f,  //0
         1.0f, 1.0f, 1.0f, 1.0f,  //1
         1.0f, 1.0f, 1.0f, 1.0f,  //2
    
         1.0f, 1.0f, 1.0f, 1.0f,  //3
         1.0f, 1.0f, 1.0f, 1.0f,  //4
         1.0f, 1.0f, 1.0f, 1.0f,  //5
        };
    
    const GLubyte indices[] = {
        3, 4, 5, 
    };
    
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, indices);
    

    其中GL_TRIANGLES是基元的类型,3是“索引”内部的元素数,GL_UNSIGNED_BYTE是如何解释它们,“indices”只是数组的名称 .

    这应该只绘制第二个三角形 . 您也可以尝试glDrawElementsBaseVertex,但我自己并没有亲自尝试过 . 我收集的是你将从0开始生成/显式编码你的索引,但给出一个偏移量,使它实际读取0偏移量,1偏移量,依此类推 .

    这有帮助吗?

相关问题