【问题标题】:Why are some of my cube faces not rendering the way I'd like them to?为什么我的一些立方体面没有按照我想要的方式渲染?
【发布时间】:2013-03-24 14:55:46
【问题描述】:

正面在左边;右脸在右边

左侧的背面;左脸右脸

经过一些调试,我得出了几个结论:

  • 面部剔除(在照片中关闭)似乎使情况变得更糟。

  • 深度缓冲(在照片中打开)似乎无济于事。

面部剔除使用glFrontFace( GL_CW ) | glFrontFace( GL_CCW )glCullFace( GL_BACK_FACE ) 结合使用。

更新

这是 Need4Sleep 提供的代码 sn-p 的结果:

(注意:GL_LESS 深度比较本身似乎并没有改变任何东西)

左前脸;右面右面 - 面剔除开启


代码概览

顶点和颜色在结构中按顶点颜色排序,称为simdColorVertex_t,其中结构的颜色和顶点分量均由 4 个浮点数组成,每个浮点数在各自的数组中:

typedef float simdVec4_t[ 4 ];

typedef struct simdColorVert4_s
{
    simdVec4_t position;
    simdVec4_t color;
}
simdColorVert4_t;

彩色立方体类

构造函数创建其各自的程序。然后指定顶点和索引数据,并绑定到各自的缓冲区:

(为简洁起见省略了着色器程序的创建)

    const float S = 0.5f;

    const simdColorVert4_t vertices[] =
    {
        /*! Positions */                    /*! Colors */           /*! Indices */
        { {  S,  S,  S, 1.0f },     { 0.0f, 0.0f, 1.0f, 1.0f } },   //! 0

        { { -S,  S,  S, 1.0f },     { 1.0f, 0.0f, 0.0f, 1.0f } },   //! 1

        { { -S, -S,  S, 1.0f },     { 0.0f, 1.0f, 0.0f, 1.0f } },   //! 2

        { {  S, -S,  S, 1.0f },     { 1.0f, 1.0f, 0.0f, 1.0f } },   //! 3

        { {  S,  S, -S, 1.0f },     { 1.0f, 1.0f, 1.0f, 1.0f } },   //! 4

        { { -S,  S, -S, 1.0f },     { 1.0f, 0.0f, 0.0f, 1.0f } },   //! 5

        { { -S, -S, -S, 1.0f },     { 1.0f, 0.0f, 1.0f, 1.0f } },   //! 6

        { {  S, -S, -S, 1.0f },     { 0.0f, 0.0f, 1.0f, 1.0f } }    //! 7
    };


    const GLubyte indices[] =
    {
        1, 0, 2,    2, 0, 3,    //! Front Face

        3, 6, 4,    4, 0, 3,    //! Right Face

        3, 6, 2,    2, 6, 7,    //! Bottom Face

        7, 6, 4,    4, 5, 7,    //! Back Face

        7, 5, 2,    2, 1, 5,    //! Left Face

        5, 1, 4,    4, 0, 1,    //! Top Face
    };

    //! The prefix BI_* denotes an enum, standing for "Buffer Index"

    {
        glBindBuffer( GL_ARRAY_BUFFER, mBuffers[ BI_ARRAY_BUFFER ] );
        glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_DYNAMIC_DRAW );
        glBindBuffer( GL_ARRAY_BUFFER, 0 );

        glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mBuffers[ BI_ELEMENT_BUFFER ] );
        glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( indices ), indices, GL_DYNAMIC_DRAW );
        glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
    }

从那里(仍在构造函数中)创建并绑定顶点数组,以及其各自的属性和缓冲区数据:

    glBindVertexArray( mVertexArray );

    glBindBuffer( GL_ARRAY_BUFFER, mBuffers[ BI_ARRAY_BUFFER ] );

    glEnableVertexAttribArray( 0 );
    glEnableVertexAttribArray( 1 );

    glVertexAttribPointer( 0, 4, GL_FLOAT, GL_FALSE, sizeof( float ) * 8, ( void* ) offsetof( simdColorVert4_t, simdColorVert4_t::position ) );
    glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, sizeof( float ) * 8, ( void* ) offsetof( simdColorVert4_t, simdColorVert4_t::color ) );

    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mBuffers[ BI_ELEMENT_BUFFER ] );

    glBindVertexArray( 0 );

杂项

在多维数据集初始化之前,调用了这个函数:

void MainScene::setupGL( void )
{
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glDepthRange( 0.0f, 1.0f );

    glClearDepth( 1.0f );

    int width, height;

    gvGetWindowSize( &width, &height );

    glViewport( 0, 0, width, height );
}

并且在调用mCube->draw(...)函数之前清除深度缓冲区。

我认为我在这里做错了什么很明显,但我不确定它可能是什么。在弄乱了背面剔除并在正面的逆时针和顺时针缠绕顺序之间移动之后,它只会让事情变得更糟。有什么想法吗?

【问题讨论】:

  • 你的实际绘图调用是什么样的?
  • 其实,没关系。您的索引显然是错误的。第二个面使用位于立方体对角的顶点。
  • 明天我会重新编辑索引。如果可行,我会通知您 - 如果您愿意,请随时发布该评论作为答案。
  • 没关系 - 我刚刚编辑了它们,效果很好。非常感谢。如果您发布答案,我将很乐意接受。 =)

标签: c++ opengl depth-buffer


【解决方案1】:

尝试将这段代码添加到程序的顶部

//screen cleared as blue
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);

这是来自我编写的纹理立方体程序,您可能已经实现了其中一些功能,但据我所知,您可能缺少glDepthFunc(GL_LESS)

【讨论】:

  • 我很欣赏这个建议,不幸的是,这似乎使情况变得更糟。起初我通过将深度函数设置为 GL_LESS 进行了尝试,但这并没有改变任何东西。然而,一旦我打开面部剔除功能,事情就变得更糟了。我用结果的屏幕截图更新了我的帖子(面部剔除)。
  • 你能把你的整个代码贴在像 pastebin 这样的东西上吗?如果我看到整个程序,我可以提供进一步的帮助。
【解决方案2】:

根据@JasonD 关于有缺陷的索引绘制顺序的通知,索引已编辑如下:

const GLubyte indices[] =
{
    1, 0, 2,    2, 0, 3,    //! Front Face

    3, 7, 4,    4, 0, 3,    //! Right Face (edited)

    3, 7, 2,    2, 6, 7,    //! Bottom Face (edited)

    7, 6, 4,    4, 5, 6,    //! Back Face

    6, 5, 2,    2, 1, 5,    //! Left Face (edited)

    5, 1, 4,    4, 0, 1,    //! Top Face
};

如果将上述指标与问题中提到的原始指标进行比较,不难发现人为错误的缺陷之美!

(不用说,立方体现在可以正确渲染)

【讨论】:

  • 很好,从没想过将索引视为来源!
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2014-11-18
  • 2015-06-16
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多