OpenGL多维数据集未正确渲染
在OpenGL中渲染立方体时出现问题。我正在绘制两个立方体,一个是线立方体,以原点为中心,另一个是偏移原点的实心立方体。我已经映射了一些关键点,将对象旋转到原点,使整个场景可以围绕原点旋转 问题是,当我渲染场景时,当线立方体应该位于另一个实体立方体的前面时,它不能正确显示自己 在上图中,彩色立方体应该位于金属线立方体的后面。i、 e.绿色导线立方体应位于顶部 此外,多维数据集的行为也不正常 在我绕x轴(当前水平线)旋转一点之后 多维数据集缺少面,无法正确渲染。 我做错了什么 我已经编写了以下代码 请注意,rotateX、rotateY、rotateZ映射到关键点,是我的全局旋转变量OpenGL多维数据集未正确渲染,opengl,Opengl,在OpenGL中渲染立方体时出现问题。我正在绘制两个立方体,一个是线立方体,以原点为中心,另一个是偏移原点的实心立方体。我已经映射了一些关键点,将对象旋转到原点,使整个场景可以围绕原点旋转 问题是,当我渲染场景时,当线立方体应该位于另一个实体立方体的前面时,它不能正确显示自己 在上图中,彩色立方体应该位于金属线立方体的后面。i、 e.绿色导线立方体应位于顶部 此外,多维数据集的行为也不正常 在我绕x轴(当前水平线)旋转一点之后 多维数据集缺少面,无法正确渲染。 我做错了什么 我已经编写了以下
//The Initialize function, called once:
void Init(){
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Depth Buffer Setup // Enables Depth Testing
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glEnable(GL_LIGHTING);
}
void draw(){
//The main draw function
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity ();
gluPerspective(45, 640/480.0, .5, 100);
glMatrixMode(GL_MODELVIEW); //select the modelview matrix.
glLoadIdentity ();
gluLookAt(0,0,5,
0,0,0,
0,1,0);
glRotatef(rotateX,1,0,0);
glRotatef(rotateY,0,1,0);
glRotatef(rotateZ,0,0,1);
drawScene(); // this just draws the main axis lines,
glutWireCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-2,1,0);
drawNiceCube();
glPopMatrix();
glutSwapBuffers();
}
drawNiceCube()的代码仅使用GL_四边形,而drawWireCube是内置GLUT的
编辑:
我已将完整代码发布在,如果没有很好的文档记录,很抱歉。您是否也请求了一个带有深度缓冲区的窗口
glutInitDisplayMode( ... | GLUT_DEPTH | ...);
更新:
你在什么地方启用了人脸剔除
glEnable(GL_CULL_FACE);
这可能是顺时针旋转的原因 10.090面部剔除是如何工作的?为什么不使用曲面法线 OpenGL面剔除计算窗口坐标空间中填充图元的有符号区域。当窗口坐标为逆时针顺序时,符号区域为正,顺时针方向时为负。应用程序可以使用glFrontFace()指定要解释为前向或后向原语的顺序(逆时针或顺时针)。应用程序可以通过调用glCullFace()指定剔除正面或背面。最后,必须通过调用glEnable(GL_CULL_face);,启用面剔除 OpenGL使用原语的窗口空间投影来确定面剔除,原因有两个。要创建有趣的照明效果,通常需要指定与近似曲面不正交的法线。如果将这些法线用于面剔除,可能会导致某些基本体被错误剔除。此外,点积剔除方案可能需要矩阵求逆,这并不总是可能的(即,在矩阵奇异的情况下),而DC空间中的有符号区域总是被定义的 但是,一些OpenGL实现支持GL_EXT_cull_顶点扩展。如果存在此扩展,则应用程序可以指定对象空间中的同质眼睛位置。根据当前法线与从顶点到眼睛的向量的点积,顶点标记为剔除。如果剔除了基本体的所有顶点,则不会渲染该基本体。在许多情况下,使用此扩展 从
您还可以阅读datenwolf解决了我的问题。我引述他的话:
“@Jonathansinbahan:您的部分代码是多余的,但缺少了一些东西:您忘记调用Init();在创建GLUT窗口后,深度测试和所有其他状态都无法启用。我建议您根本不要使用Init,而是将其代码移到绘图代码中,它实际上就属于这个位置。”是的,在我使用的主要函数中:glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);嗨,我没有使用glEnable(GL_CULL_FACE);所以我真的不知道它是被淘汰了还是怎么了。谢谢@乔纳桑辛巴汉:嗯,有些东西把你的深度排序搞砸了。请您将程序的完整源代码发布到pastebin.com,以便我/我们可以测试并修复它好吗?@JonathanSimbahan:您的部分代码是多余的,但缺少一些内容:您忘记调用
Init()代码>创建GLUT窗口后,深度测试和所有其他状态都不会启用。例如,我建议你根本不要使用Init,把它的代码移到绘图代码中,它实际上就属于这个代码。你我的朋友是个天才。我崇拜你的美貌。我将以你的名义建立一个邪教组织。