如何在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?