我的程序(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)发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 这里到底发生了啥? [关闭]

这里发生了啥你不能比较 C++ 中的 if(mychar1 == 'ä' || mychar2 == 'Ä') 吗?

cuda 究竟为 opengl 应用程序做了啥?

c++中扩展欧几里得算法的递归到底发生了啥?

OpenGL不在C++中绘制三角形

android“强制关闭”内存到底发生了啥