OpenGL多维数据集未正确渲染

OpenGL多维数据集未正确渲染,opengl,Opengl,在OpenGL中渲染立方体时出现问题。我正在绘制两个立方体,一个是线立方体,以原点为中心,另一个是偏移原点的实心立方体。我已经映射了一些关键点,将对象旋转到原点,使整个场景可以围绕原点旋转 问题是,当我渲染场景时,当线立方体应该位于另一个实体立方体的前面时,它不能正确显示自己 在上图中,彩色立方体应该位于金属线立方体的后面。i、 e.绿色导线立方体应位于顶部 此外,多维数据集的行为也不正常 在我绕x轴(当前水平线)旋转一点之后 多维数据集缺少面,无法正确渲染。 我做错了什么 我已经编写了以下

在OpenGL中渲染立方体时出现问题。我正在绘制两个立方体,一个是线立方体,以原点为中心,另一个是偏移原点的实心立方体。我已经映射了一些关键点,将对象旋转到原点,使整个场景可以围绕原点旋转

问题是,当我渲染场景时,当线立方体应该位于另一个实体立方体的前面时,它不能正确显示自己

在上图中,彩色立方体应该位于金属线立方体的后面。i、 e.绿色导线立方体应位于顶部

此外,多维数据集的行为也不正常

在我绕x轴(当前水平线)旋转一点之后

多维数据集缺少面,无法正确渲染。 我做错了什么

我已经编写了以下代码 请注意,rotateX、rotateY、rotateZ映射到关键点,是我的全局旋转变量

//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,把它的代码移到绘图代码中,它实际上就属于这个代码。你我的朋友是个天才。我崇拜你的美貌。我将以你的名义建立一个邪教组织。