如何在OpenGL中渲染具有不同颜色的边的立方体?

我尝试在某些边上渲染一个具有不同颜色的立方体作为练习,但问题是,当我沿着Y轴旋转立方体时,仍然可以通过面向相机的侧面看到不同的颜色侧。 我已经尝试将代码分解为单独的glBegin()块,并且我尝试在谷歌上搜索没有运气的答案。 根据glColor3f上的Microsoft文档,“glcolor3变体明确指定了新的红色,绿色和蓝色值,并隐式设置当前alpha值为1.0(全强度)。”,所以透明度不应该成为问题......

这是代表问题的图片

以下是该立方体的渲染代码:

@Override public void render() 
{
    glPushMatrix( );
    {
        glTranslatef( 0, 0, -4 );
        glRotatef( x, 0, 1, 0 );

        glColor3f( 0f, 1f, 0f );

        glBegin( GL_QUADS );
        {
            glVertex3f( -1, 1, 1 );
            glVertex3f( -1, -1, 1 );
            glVertex3f( 1, -1, 1 );
            glVertex3f( 1, 1, 1 );

            glVertex3f( -1, 1, -1 );
            glVertex3f( -1, -1, -1 );
            glVertex3f( 1, -1, -1 );
            glVertex3f( 1, 1, -1 );

            glVertex3f( -1, 1, -1 );
            glVertex3f( -1, 1, 1 );
            glVertex3f( 1, 1, 1 );
            glVertex3f( 1, 1, -1 );

            glVertex3f( -1, -1, -1 );
            glVertex3f( -1, -1, 1 );
            glVertex3f( 1, -1, 1 );
            glVertex3f( 1, -1, -1 );

            glVertex3f( -1, 1, -1 );
            glVertex3f( -1, -1, -1 );
            glVertex3f( -1, -1, 1 );
            glVertex3f( -1, 1, 1 );

            glColor3f( 1f, 0f, 0f );
            glVertex3f( 1, 1, -1 );
            glVertex3f( 1, -1, -1 );
            glVertex3f( 1, -1, 1 );
            glVertex3f( 1, 1, 1 );
        }

        glEnd( );
    }

    glPopMatrix( );
}

这是我的渲染循环:

protected void render( )
{
    glClear( GL_COLOR_BUFFER_BIT );
    glLoadIdentity( );

    for ( IGameObject gameObject : gameObjects )
        gameObject.render( );

    glfwSwapBuffers( window );
}

您需要启用Z测试:

 glEnable(GL_DEPTH_TEST);

将您的调用更改为glClear以清除深度缓冲区:

 glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );

它看起来像你没有使用深度测试。

OpenGL以您告诉它的顺序绘制形状,所以如果您最后绘制红色面部,其碎片(即像素)会覆盖之前绘制的绿色面部。 既然你(大概)想要看到“前面”的面孔实际出现在前面,你必须告诉OpenGL不要绘制已经绘制的“背后”事物的碎片。

glClear( GL_COLOR_BUFFER_BIT )行替换为:

glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LESS );
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BIT );

这告诉OpenGL每次它要绘制一个片段时,它应该将它的深度与已绘制的深度进行比较,并且如果它比旧的片段更远,则丢弃新的片段。 它还会清除深度缓冲区,以便屏幕上的每个像素都“无限”地远离,这样,立方体的面将全部位于背景之前。 这样可以防止在靠近相机的地方出现绿色的一面时出现红色的脸。

链接地址: http://www.djcxy.com/p/81841.html

上一篇: How do you render a cube with different colored sides in OpenGL?

下一篇: 3D Rotation around Local Axes