gpt4 book ai didi

java - 如何在 OpenGL 中渲染具有不同颜色侧面的立方体?

转载 作者:行者123 更新时间:2023-12-01 11:31:37 25 4
gpt4 key购买 nike

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

Here is the picture representing the problem

这是立方体的渲染代码:

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

最佳答案

您似乎没有使用深度测试。

OpenGL 按照您指定的顺序绘制形状,因此如果您最后绘制红色面,其片段(即像素)将覆盖之前绘制的绿色面。由于您(大概)希望看到“前面”的面实际上出现在前面,因此您必须告诉 OpenGL 不要绘制位于已绘制事物“后面”的片段。

glClear( GL_COLOR_BUFFER_BIT ) 行替换为:

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

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

关于java - 如何在 OpenGL 中渲染具有不同颜色侧面的立方体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30339238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com