【问题标题】:Issues with basic OpenGL rendering?基本 OpenGL 渲染的问题?
【发布时间】:2014-01-16 06:13:39
【问题描述】:

我是 OpenGL 的完全初学者,只是想学习(暂时从 freeglut 开始)。到目前为止,我有以下代码应该绘制一些基本的 3D 对象。问题是无论我在渲染函数中放入什么(尽管它确实执行了),它都只显示一个空白窗口。

#include "stdafx.h"
#include <iostream>
#include "dependente\glew\glew.h"
#include "dependente\freeglut\glut.h"

void render()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_DEPTH_TEST);

    glTranslatef(-1.5f, 1.0f, -6.0f);                                     // Translate back and to the left

    glPushMatrix();                                                         // Push the current modelview matrix on the matrix                         // Rotate on all 3 axis
    glBegin(GL_TRIANGLES);                                                // Draw a pyramid
    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of front face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Left of front face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);                                    // Right of front face

    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of right face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);                                    // Left of right face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Right of right face

    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of back face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Left of back face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Right of back face

    glColor3f(1.0f, 0.0f, 0.0f);                                      // Red
    glVertex3f(0.0f, 1.0f, 0.0f);                                     // Top of left face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Left of left face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Right of left face
    glEnd();

    // Render a quad for the bottom of our pyramid
    glBegin(GL_QUADS);
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Left/right of front/left face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(1.0f, -1.0f, 1.0f);                                    // Right/left of front/right face
    glColor3f(0.0f, 1.0f, 0.0f);                                      // Green
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Right/left of right/back face
    glColor3f(0.0f, 0.0f, 1.0f);                                      // Blue
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Left/right of right/back face
    glEnd();
    glPopMatrix();

    glTranslatef(3.0f, 0.0f, 0.0f);                                        // Translate right
    glPushMatrix();                                                         // Push the current modelview matrix on the matrix stack                         // Rotate the primitive on all 3 axis
    glBegin(GL_QUADS);
    // Top face
    glColor3f(0.0f, 1.0f, 0.0f);                                   // Green
    glVertex3f(1.0f, 1.0f, -1.0f);                                   // Top-right of top face
    glVertex3f(-1.0f, 1.0f, -1.0f);                                   // Top-left of top face
    glVertex3f(-1.0f, 1.0f, 1.0f);                                   // Bottom-left of top face
    glVertex3f(1.0f, 1.0f, 1.0f);                                   // Bottom-right of top face

    // Bottom face
    glColor3f(1.0f, 0.5f, 0.0f);                                  // Orange
    glVertex3f(1.0f, -1.0f, -1.0f);                                  // Top-right of bottom face
    glVertex3f(-1.0f, -1.0f, -1.0f);                                  // Top-left of bottom face
    glVertex3f(-1.0f, -1.0f, 1.0f);                                  // Bottom-left of bottom face
    glVertex3f(1.0f, -1.0f, 1.0f);                                  // Bottom-right of bottom face

    // Front face
    glColor3f(1.0f, 0.0f, 0.0f);                                  // Red
    glVertex3f(1.0f, 1.0f, 1.0f);                                  // Top-Right of front face
    glVertex3f(-1.0f, 1.0f, 1.0f);                                  // Top-left of front face
    glVertex3f(-1.0f, -1.0f, 1.0f);                                  // Bottom-left of front face
    glVertex3f(1.0f, -1.0f, 1.0f);                                  // Bottom-right of front face

    // Back face
    glColor3f(1.0f, 1.0f, 0.0f);                                 // Yellow
    glVertex3f(1.0f, -1.0f, -1.0f);                                 // Bottom-Left of back face
    glVertex3f(-1.0f, -1.0f, -1.0f);                                 // Bottom-Right of back face
    glVertex3f(-1.0f, 1.0f, -1.0f);                                 // Top-Right of back face
    glVertex3f(1.0f, 1.0f, -1.0f);                                 // Top-Left of back face

    // Left face
    glColor3f(0.0f, 0.0f, 1.0f);                                   // Blue
    glVertex3f(-1.0f, 1.0f, 1.0f);                                   // Top-Right of left face
    glVertex3f(-1.0f, 1.0f, -1.0f);                                   // Top-Left of left face
    glVertex3f(-1.0f, -1.0f, -1.0f);                                   // Bottom-Left of left face
    glVertex3f(-1.0f, -1.0f, 1.0f);                                   // Bottom-Right of left face

    // Right face
    glColor3f(1.0f, 0.0f, 1.0f);                                   // Violet
    glVertex3f(1.0f, 1.0f, 1.0f);                                   // Top-Right of left face
    glVertex3f(1.0f, 1.0f, -1.0f);                                   // Top-Left of left face
    glVertex3f(1.0f, -1.0f, -1.0f);                                   // Bottom-Left of left face
    glVertex3f(1.0f, -1.0f, 1.0f);                                   // Bottom-Right of left face
    glEnd();
    glPopMatrix();

    glTranslatef(-1.5f, -3.0f, 0.0f);                                     // Back to center and lower screen
    glPushMatrix();
    glColor3f(1.0f, 1.0f, 0.0f);                                          // Yellow
    glutSolidSphere(1.0f, 16, 16);                                        // Use GLUT to draw a solid sphere
    glScalef(1.01f, 1.01f, 1.01f);
    glColor3f(1.0f, 0.0f, 0.0f);                                          // Red
    glutWireSphere(1.0f, 16, 16);                                         // Use GLUT to draw a wireframe sphere
    glPopMatrix();
}

void initGlut(int argc, char* argv[]) {
    std::cout << "Initialise OpenGL..." << std::endl;

    glutInit(&argc, argv);
    int iScreenWidth = glutGet(GLUT_SCREEN_WIDTH);
    int iScreenHeight = glutGet(GLUT_SCREEN_HEIGHT);

    glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowPosition(120, 120);
    glutInitWindowSize(600, 600);

    glutCreateWindow("OpenGL");

    // Register GLUT callbacks
    glutDisplayFunc(render);

    // Setup initial GL State
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClearDepth(1.0f);

    glShadeModel(GL_SMOOTH);
    glutMainLoop();
    std::cout << "Initialise OpenGL: Success!" << std::endl;
}

int _tmain(int argc, char* argv[])
{
    initGlut(argc, argv);
    return 0;
}

希望有更多经验的人能让我知道我缺少什么明显的东西。

【问题讨论】:

  • 看起来你没有投影矩阵,这是渲染 3D 对象所必需的
  • 我刚刚注意到的另一件事是最后一行“初始化 OpenGL:成功!” initGlut 函数的函数永远不会打印到控制台中。愚蠢的问题,这与投影矩阵有关吗?
  • 不,glutMainLoop() 应该是一个无限循环,它只获取事件并响应它们。您可能希望将调用上方的打印语句移至glutMainLoop()
  • 投影矩阵是通过将矩阵模式设置为GL_PROJECTION 并调用glFrustumgluPerspective 来创建透视矩阵来设置的。这个矩阵将顶点变成了我们在屏幕上看到的“图片”,更远的物体看起来更小。
  • 您可能真的想查看一个教授现代 OpenGL 的教程,例如 this。您使用的称为“固定功能”,这意味着 OpenGL 为您完成了大部分实际渲染工作。但是,这会造成不良习惯,并导致人们实际上不知道幕后发生的事情。现代 OpenGL“核心配置文件”实际上迫使您编写自己的着色器并创建自己的缓冲区,从而更深入地了解这些东西的实际工作原理。

标签: c++ opengl render glut freeglut


【解决方案1】:

这是我调试“OpenGL 没有绘制任何东西”问题的方法:

  1. 将此代码添加到我的render() 函数的开头:glClearColor (1, 1, 0, 1); glClear (GL_COLOR_BUFFER_BIT); 如果输出变为黄色,它正在调用您的render() 函数并正确清除输出。然后,您可以删除该代码或将其注释掉。如果输出没有变黄,那么您的 render() 函数没有被调用,或者它被调用了,但是您的 OpenGL 状态设置为不绘制到屏幕上。 (也许当时是错误的上下文,或者当前 FBO 的颜色附件不是您认为的那样。)

  2. 尝试以原点为中心绘制一个没有纹理或着色器的白色三角形。如果它出现,那么您尝试绘制的其他几何图形可能是错误的。如果它没有出现,问题可能是您的矩阵计算(投影或模型视图矩阵)。 (您是否将“相机”指向您认为自己所在的位置?您的对象是否被绘制在您认为的位置?)它也可能是照明、混合或深度测试。为了确定,我将所有这些都关闭以进行此类测试。 (有关如何打开和关闭它们,请参阅glEnable()/glDisable()。)

  3. 如果这些东西有效,我开始打开我在上面关闭的东西:纹理、着色器、照明、混合、深度测试。我一次打开一个,直到出现问题。

如果没有出错,那么我的对象的几何形状可能是错误的。

【讨论】:

  • 我的代码显然没有通过第一次测试。根本没有渲染。我在上面读到投影矩阵可能丢失了。对不起这个愚蠢的问题,但你能告诉我一个投影矩阵的基本例子吗?
  • 哇,好的,我相信这是一个很好的解释,尽管老实说我希望得到一个更简单的答案。像一个神奇的,解决一切的“默认值”:))
  • @Eugen 没有“默认值”,这完全取决于您的场景以及您希望一切看起来像什么。如果你不理解这个理论,你将一事无成。
  • 查找glFrustum()。为您的场景设置一些合理的默认值是一个简单的调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多