【问题标题】:3D Cube Drawing, Only One Side Is Always On Top3D 立方体绘图,只有一侧始终在顶部
【发布时间】:2015-02-14 19:56:41
【问题描述】:

我正在使用 OpenGL C++ 绘制形状,特别是立方体。在我当前的项目中,我设法正确地绘制了一个立方体,但是当相机直接放在立方体上时,只有最后绘制的立方体一侧不会透明。正面观察时,立方体的前两侧完全透​​明。有没有办法解决这个问题?这是picture。如您所见,前两侧没有显示。这是我的代码:

Main.cpp:

#include "Render.h"
#include <stdlib.h>

int screenHeight = 500;
int screenWidth = 500;
int screenFPS = 60;

void MainLoop(int val);

int main(int argc, char* args[])
{
    glutInit(&argc, args);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(screenWidth, screenHeight);
    glutInitWindowPosition(350, 80);
    glutCreateWindow("Cube");
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //glOrtho(0.0f, screenWidth, screenHeight, 0.0f, 0.0f, 1.0f);
    gluPerspective(40, 1, 0.5, 20);
    glutDisplayFunc(Render);
    glViewport(0, 0, screenWidth, screenHeight);
    glutKeyboardFunc(HandleKeys);
    glutIdleFunc(Animation);
    glutTimerFunc(1000 / screenFPS, MainLoop, 0);
    glutMainLoop();
    return 0;
}

void MainLoop(int val)
{
    Render();
    glutTimerFunc( 1000 / screenFPS, MainLoop, val );
}

渲染.cpp:

#include "Render.h"
#include <iostream>
#include <stdlib.h>
#include <windows.h>

GLfloat xRot, yRot, zRot;

void Render()
{
    std::cout << xRot << " " << yRot << " " << zRot << "\n";
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0,0.0,-10.5);
    glRotatef(yRot, 1.0, 0.0, 0.0);
    glRotatef(yRot, 0.0, 1.0, 0.0);
    glRotatef(zRot, 0.0, 0.0, 1.0);
    glBegin(GL_QUADS);
       glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f,-1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
       glColor4f(1.0f, 0.5f, 0.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
        glVertex3f(-1.0f,-1.0f, 1.0f);
        glVertex3f(-1.0f,-1.0f,-1.0f);
        glVertex3f( 1.0f,-1.0f,-1.0f);
       glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f,-1.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
       glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f,-1.0f);
        glVertex3f(-1.0f,-1.0f,-1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
        glVertex3f( 1.0f, 1.0f,-1.0f);
       glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f,-1.0f);
        glVertex3f(-1.0f,-1.0f,-1.0f);
        glVertex3f(-1.0f,-1.0f, 1.0f);
       glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f, 1.0f,-1.0f);
        glVertex3f( 1.0f, 1.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f, 1.0f);
        glVertex3f( 1.0f,-1.0f,-1.0f);
    glEnd();
    glutSwapBuffers();
}
void Animation()
{
    yRot += 0.03;
    xRot += 0.08;
    Render();
}
void HandleKeys(unsigned char key, int x, int y)
{
    if(key == 27)
        exit(0);
    else if(key == 'w')
        yRot += 0.55;
    else if(key == 'a')
        xRot -= 0.55;
    else if(key == 's')
        yRot -= 0.55;
    else if(key == 'd')
        xRot += 0.55;
}

渲染.h

#include "GLLib.h"
extern int screenHeight;
extern int screenWidth;
extern int screenFPS;
void Render();
void Animation();
void HandleKeys(unsigned char key, int x, int y);

最后是我的库 GLLib.h:

#ifndef GLLIB_H
#define GLLIB_H
#include <GL/freeglut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#endif

【问题讨论】:

  • 四边形是否从任何其他角度出现,以便您可以在某个点看到绿色或橙色的一面?
  • 我不知道,我没能看到那些面。

标签: c++ opengl 3d cube


【解决方案1】:

可能所有面都画得很好。问题是您没有深度缓冲区。因此,绘制的所有内容都会替换之前绘制的内容,无论它是在之前绘制的几何体的前面还是后面。

要使用深度缓冲区,您必须在初始化期间请求它:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

并在开始渲染之前启用深度测试:

glEnable(GL_DEPTH_TEST);

那么,在开始渲染每一帧的时候,除了颜色缓冲区之外,还需要清除深度缓冲区:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

这将确保最前面的面是可见的,而它们后面的面是隐藏的,与绘制顺序无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多