使用 glDrawElements、Index Buffer 和启用的 GL_CULL_FACE 横向绘制圆柱体

Posted

技术标签:

【中文标题】使用 glDrawElements、Index Buffer 和启用的 GL_CULL_FACE 横向绘制圆柱体【英文标题】:Draw cylinder lateral with glDrawElements, Index Buffer and enabled GL_CULL_FACE 【发布时间】:2015-04-17 18:06:50 【问题描述】:

我需要这个:

我必须使用glDrawElements 和这个:glEnable(GL_CULL_FACE)

我尝试了什么:

...

glm::vec3   CMyApp::GetCylinderUV(float u, float v)

    u *= 2* 3.1415f;
    float r = 1;

    return glm::vec3(r * cosf(u), 2 * v, r * sinf(u));


...

glEnable(GL_CULL_FACE);

...

Vertex vert[(N+1)*(M+1)];
for (int i=0; i<=N; ++i)
    for (int j=0; j<=M; ++j)
    
        float u = i/(float)N;
        float v = j/(float)M;

        vert[i + j*(N + 1)].p = GetCylinderUV(u, v);
        vert[i + j*(N+1)].c = glm::normalize( vert[i + j*(N+1)].p );
    

...

GLushort indices[3*2*(N)*(M)];
for (int i=0; i<N; ++i)
    for (int j=0; j<M; ++j)
    
        //      (i,j+1)
        //        o-----o(i+1,j+1)
        //        |\    |           a = p(u_i, v_i)
        //        | \   |           b = p(u_i+1, v_i)
        //        |  \  |           c = p(u_i, v_i+1)
        //        |   \ |           d = p(u_i+1, v_i+1)
        //        |    \|
        //  (i,j) o-----o(i+1, j)
        indices[6*i + j*3*2*(N) + 0] = (i)      + (j)*  (N+1);
        indices[6*i + j*3*2*(N) + 1] = (i+1)    + (j)*  (N+1);
        indices[6*i + j*3*2*(N) + 2] = (i)      + (j+1)*(N+1);
        indices[6*i + j*3*2*(N) + 3] = (i+1)    + (j)*  (N+1);
        indices[6*i + j*3*2*(N) + 4] = (i+1)    + (j+1)*(N+1);
        indices[6*i + j*3*2*(N) + 5] = (i)      + (j+1)*(N+1);
    

glDrawElements( GL_TRIANGLES,
                3*2*(N)*(M),
                GL_UNSIGNED_SHORT,
                0);

还有不好的结果:

但它可以通过删除glEnable(GL_CULL_FACE); 来修复,但我必须使用它。

【问题讨论】:

【参考方案1】:

就您的几何而言,您可以使用两个绘图通道来完成此操作(并保留glEnable(GL_CULL_FACE))。

Pass1 - 使用glFrontFace(GL_BACK) 渲染。这将渲染管的“后部”部分 Pass2 - 使用glFrontFace(GL_FRONT) 渲染。这将渲染管的“前”部分。

希望这会有所帮助!

【讨论】:

【参考方案2】:

终于找到了我的问题的答案:

GetCylinderUV 中我否定了你:u *= -2 * 3.1415f;。需要将外侧翻过来。

【讨论】:

以上是关于使用 glDrawElements、Index Buffer 和启用的 GL_CULL_FACE 横向绘制圆柱体的主要内容,如果未能解决你的问题,请参考以下文章

使用 glDrawElements 很难理解索引

我不明白的 glDrawElements 的使用

OpenGL:glDrawElements 不绘制

使用 glDrawElements 绘制 std::vector

为啥 glBufferSubData 需要等到 glDrawElements 不使用 VBO?

OpenGL - 使用 glDrawElements 错误地映射纹理