如何显示opengl的结果?

时间:2014-08-15 05:57:39

标签: c++ opengl

我是OpenGL的新手。我想从蓝皮书(OpenGL superbible第6版)中学习它。

当我使用Visual Studio 2013编译第一个程序时,一切都很顺利,只是出现一个白色窗口,然后程序退出code 0

该计划是:

// Include the "sb6.h" header file
#include "sb6.h"
// Derive my_application from sb6::application
class my_application : public sb6::application
{
public:
    // Our rendering function
    void render(double currentTime)
    {
        // Simply clear the window with red
        static const GLfloat red[] = { 1.0f, 0.0f, 0.0f, 1.0f };
        glClearBufferfv(GL_COLOR, 0, red);
    }
};
// Our one and only instance of DECLARE_MAIN
DECLARE_MAIN(my_application);

我认为编译和构建过程都正常,因为result code 0。但我无法弄清楚为什么我没有看到红色输出窗口。请帮帮我。

1 个答案:

答案 0 :(得分:1)

您基本上处理的是实时应用程序,这意味着渲染帧只需要很少的时间。渲染帧意味着,OpenGL将采用您用于定义场景的所有命令(几何,缓冲区的设置,着色器等)并尽可能快地渲染1帧。通常,如果您的应用程序需要是实时的,那么它必须能够渲染这个场景超过每秒30帧。

那么基本上OpenGL的作用是渲染这个帧,然后退出。通常(你在帖子中没有说你用什么框架来创建你的应用程序,GLUT,GLFW?你说你使用蓝皮书的代码但不确定它使用哪个OpenGL lib,它显然是其他东西的包装) ,但一个典型的OpenGL应用程序这样做(在伪c / c ++代码中,假设一些任意框架来处理键盘/鼠标事件等):

bool run = true;

main() {
    ...
    while (run) {
        event e = get_event(e); // this is a key, or mouse event
        process_event(e);
        render_frame();
    }
    ...
}

void processe_event(event e)
{
    if (e.type == KEYBOARD_EVENT && e.value == ESC) { run = false; return; }
    ...
}

这个想法是你在无限循环中运行渲染功能。因此,每次程序迭代循环时,它都会向屏幕呈现openGL场景的内容。当然,由于它是一个无限循环,窗口会停留在屏幕上,直到您决定终止该程序(或实现一些在使用某些特定键时转义循环的机制,通常是转义键)。

实现此功能的最基本方法是使用无限循环:

while (1) {
    render_frame();
}

并执行ctrl + c或中断/终止程序。这样你就不必处理密钥等,然后你至少可以看到你的程序做了什么,然后继续学习如何使用密钥。

Aslo我不确定你的代码会做什么。首先,如果您使用双缓冲区(通常是这些天的默认值),您将需要切换缓冲区以查看执行某些操作的清除函数。其次,您需要为场景添加一些几何体。但是,请注意,如果您使用OpenGL4,则需要声明并使用着色器查看任何内容,并且这在第一次使用时并不容易。

请注意,可能无限循环嵌入在宏DECLARE_MAIN中,但是这是使用代码/框架的问题,就像您在示例中显示的那样,您不知道代码中其他地方发生了什么,以及如何事情编码。例如,缓冲区交换可能发生在宏DECLARE_MAIN中。一般来说,我理解为什么他们使用宏来教导人们(因为它隐藏了如何使OpenGL应用程序工作的所有复杂性),但是挫折是它阻止你真正理解事物的工作原理。我个人认为这不是教图形特别是OpenGL的最好方法。

蓝皮书很棒,但我也建议你在网上找到一些例子,它展示了如何在GL中渲染一个简单的三角形,例如:

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/

他们在网上很多,这很简单,很好解释等等。

您首先需要选择框架。如果可以,我推荐GLFW。

此外,虽然尚未为此编写有关OpenGL的课程,但我建议您以后再查看www.scratchapixel.com。它将解释OpenGL的工作原理并逐步指导您运行一个简单的应用程序。

如果您还有其他问题,请在评论中添加。