我的程序(c++ 中的 openGL)发生了啥?
Posted
技术标签:
【中文标题】我的程序(c++ 中的 openGL)发生了啥?【英文标题】:What's going on with my program (openGL in c++)?我的程序(c++ 中的 openGL)发生了什么? 【发布时间】:2013-10-23 07:43:55 【问题描述】:我从 openGL 和 c++ 开始,我想知道为什么我在窗口上看不到任何东西。这是我的代码:
#include <GLUT/GLUT.h>
#include <stdlib.h>
void init()
glClearColor(0, 0, 1, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -10);
void display()
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3i(-0.5, -0.5, 0);
glVertex3i(0, 0.5, 0);
glVertex3i(0.5, -0.5, 0);
glEnd();
int main(int argc, char **argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE| GLUT_RGBA);
glutInitWindowPosition(200, 200);
glutInitWindowSize(400, 400);
glutCreateWindow("Window");
init();
glutDisplayFunc(display);
glutMainLoop();
我有几个问题:
如果我像这样运行程序,我看到的只是一个白色窗口...我不是将颜色设置为蓝色吗?
当我在显示功能末尾执行glutSwapBuffers()
并运行程序时,我看到没有三角形的蓝色窗口。所以,我认为glutSwapBuffers()
函数只适用于双缓冲。
最重要的是,我的三角形到底在哪里? O.o 我不是将带有glTranslatf()
功能的相机在z 轴上转换为-10 吗?如果您想知道我为什么使用 gluPerspective,我不得不说我正在尝试新事物,但如果我使用 gluOrtho2D(),它们都不起作用。
我不知道我是否遗漏了什么或什么。也许我需要搜索更多关于此的信息,但我认为大部分代码都是正确的。
【问题讨论】:
一个非常好的主意是一个不同的问题标题。 【参考方案1】:1 & 2) 使用单缓冲区时,您不必调用glutSwapBuffers()
。但是你必须调用glFlush()
,所以绘制命令是在GPU上执行的。
3) 我注意到您正在创建具有双坐标的顶点,但您正在调用 glVertex** 函数的整数版本(小数部分将被截断) - 这意味着您将绘制大小为零的三角形。
使用glVertex3d()
或glVertex3f()
代替glVertex3i()
。
小提示:在最新的 OpenGL 中不推荐使用中间模式。
【讨论】:
好的,回答了第三个问题!谢谢!但是,即使我使用单个缓冲区,我也只会在执行“glutSwapBuffers()”时看到三角形......有什么想法吗? 像魔术一样工作!但是,如果我使用单个缓冲区,你能解释一下为什么 glutSwapBuffers() 会起作用吗? 内部调用 glFlush(); @Johny:您很可能使用的是使用合成图形系统的操作系统。它们已经成为标准超过 6 年了。使用合成器,基本上所有东西都会被强制双缓冲。合成器需要某种唤醒呼叫,通知它图片已准备好呈现,这本质上是复制缓冲区交换;这是通过 BufferSwap 调用完成的。长话短说:如今,单一缓冲操作已变得相当无用。所以不要费心使用它。以上是关于我的程序(c++ 中的 openGL)发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章