如何显示opengl的结果
How to show the result of opengl?
我是OpenGL的新手。我想从蓝皮书(OpenGL超级圣经第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
。但是我不明白为什么我没有看到一个红色的输出窗口。
你基本上是在处理一个实时应用程序,这意味着渲染一个帧只需要很少的时间。渲染一帧意味着,OpenGL将使用你用来定义场景的所有命令(几何,缓冲区设置,着色器等),并尽可能快地渲染一帧。一般来说,如果你的应用程序需要实时,它必须能够以每秒30帧以上的速度渲染这个场景。
OpenGL做的基本上是渲染这个帧,然后退出。通常(你不会在你的帖子中说你使用哪个框架来创建你的应用程序,GLUT, GLFW?好吧,你说你使用蓝皮书中的代码,但不确定它使用的是哪个OpenGL库,它显然是对其他东西的包装),但一个典型的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或中断/终止程序。这样你就不需要处理键了,你至少可以看到你的程序是做什么的,然后继续学习如何使用键。
我也不确定你的代码会做任何事情。首先,如果您使用双缓冲区(目前通常是默认的),您将需要切换缓冲区,以查看即使是clear函数也在执行某些操作。其次,你将需要添加一些几何到你的场景。然而,请注意,如果你使用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是如何工作的,并指导你一步一步地获得一个简单的应用程序运行。
如果你有更多的问题,请在评论中添加。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- OpenGL大的3D纹理(>2GB)非常慢
- 序列化,没有库的整数,得到奇怪的结果
- OpenGL - 阴影贴图/深度贴图给出奇怪的结果
- OpenGL -- 多个 glDrawArrays() 调用仅显示第一个的结果
- OpenGl 2d 纹理重复(不同设备上的结果不同)
- glGetUniformLocation OpenGL ES 2.0(在ipad 3 iOS 7.0.3上返回错误结果)
- 渲染到纹理,然后在OpenGL中将结果渲染到屏幕
- 如何显示opengl的结果
- OpenGL计算着色器-奇怪的结果