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

时间:2015-05-20 02:21:58

标签: java opengl lwjgl

我试图在某些方面渲染一个具有不同颜色的立方体作为练习练习,但问题是当我沿着y轴旋转立方体时,我仍然可以看到面向不同侧面的不同颜色面。相机。我已经尝试将代码分成单独的glBegin()块用于每一方,我已经尝试在谷歌上寻找答案而没有运气。根据{{​​3}}上的Microsoft文档,“glcolor3变体明确指定新的红色,绿色和蓝色值,并隐式地将当前的alpha值设置为1.0(完全强度)。”因此透明度应该不是问题...

glColor3f

以下是多维数据集的呈现代码:

@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 );
}

2 个答案:

答案 0 :(得分:1)

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

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

glClear( GL_COLOR_BUFFER_BIT )行替换为:

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

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

答案 1 :(得分:0)

您需要enable Z-testing

 glEnable(GL_DEPTH_TEST);

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

 glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );