OpenGL黑屏/没有绘制?

Posted

技术标签:

【中文标题】OpenGL黑屏/没有绘制?【英文标题】:OpenGL black screen/nothing drawn? 【发布时间】:2011-12-22 20:46:01 【问题描述】:

为什么这段代码会产生黑屏(什么都没画...)?

我正在创建一个 Pong 克隆,但如果不让它工作,我就无法继续。

#include <GL/glut.h>

struct Rectangle 
    int x;
    int y;
    int width;
    int height;
;

struct Ball 
    int x;
    int y;
    int radius;
;

typedef struct Rectangle Rectangle;
typedef struct Ball Ball;

Rectangle rOne, rTwo;
Ball ball;

void display(void);
void reshape(int w, int h);
void drawRectangle(Rectangle *r);

int main(int argc, char* argv[]) 

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(800,600);
    glutCreateWindow("Pong");
    gluOrtho2D(0,0,800.0,600.0);

    rOne.x = 100;
    rOne.y = 100;
    rOne.width = 100;
    rOne.height = 50;   

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();

    return 0;



void display(void) 
    glClear(GL_COLOR_BUFFER_BIT);

    drawRectangle(&rOne);

    glFlush();
    glutSwapBuffers();


void reshape(int w, int h) 
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,0,(GLfloat)w,(GLfloat)h);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


void drawRectangle(Rectangle *r) 
    glBegin(GL_QUADS);
        glVertex2i(r->x,r->y);
    glVertex2i(r->x+(r->width-1),r->y);
    glVertex2i(r->x+(r->width-1),r->y+(r->height-1));
    glVertex2i(r->x,r->y+(r->height-1));
    glEnd();

【问题讨论】:

首先,您的意思可能是:gluOrtho2D(0, 800, 0, 600);。在reshape 函数中调用此函数后,不要加载恒等模型视图矩阵。 你为什么接受这个答案?一般来说,你不只是接受某人回应的第一件事。通常等待更多答案并选择最佳。你知道的,能解决你问题的那个。 【参考方案1】:

您正在请求宽度为零的正射投影:

gluOrtho2D(0,0,(GLfloat)w,(GLfloat)h);

这可能是你的意思:

gluOrtho2D(0,(GLfloat)w,0,(GLfloat)h);

例子:

#include <GL/glut.h>

typedef struct 
    int x;
    int y;
    int width;
    int height;
 Rect;

typedef struct 
    int x;
    int y;
    int radius;
 Ball;

Rect rOne, rTwo;
Ball ball;

void display(void);
void reshape(int w, int h);
void drawRectangle(Rect *r);

int main(int argc, char* argv[]) 

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(800,600);
    glutCreateWindow("Pong");

    rOne.x = 100;
    rOne.y = 100;
    rOne.width = 100;
    rOne.height = 50;   

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();

    return 0;


void display(void) 

    glClear(GL_COLOR_BUFFER_BIT);

    drawRectangle(&rOne);

    glFlush();
    glutSwapBuffers();


void reshape(int w, int h)

    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,(GLfloat)w,0,(GLfloat)h);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


void drawRectangle(Rect *r) 

    glBegin(GL_QUADS);
    glVertex2i(r->x,r->y);
    glVertex2i(r->x+(r->width-1),r->y);
    glVertex2i(r->x+(r->width-1),r->y+(r->height-1));
    glVertex2i(r->x,r->y+(r->height-1));
    glEnd();

【讨论】:

【参考方案2】:

你的问题在这里:

gluOrtho2D(0,0,800.0,600.0);

gluOrtho2D 不像 glViewport。 gluOrtho2D的参数是:

gluOrtho2D(left, right, bottom, top);

所以你必须这样称呼它

gluOrtho(0, w, 0, h);

【讨论】:

以上是关于OpenGL黑屏/没有绘制?的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅当你运行OpenGL程序的时候,程序并不绘制任何内容,并且白屏和黑屏的时候怎么排查?

我的OpenGL学习进阶之旅当你运行OpenGL程序的时候,程序并不绘制任何内容,并且白屏和黑屏的时候怎么排查?

OS X OpenGL 3.2 核心(黑屏)

OpenGL代码适用于GLFW,但不适用于Qt OpenGL

OpenGL 和 Glut 中的黑屏

将 CIFilter 应用于 OpenGL 渲染到纹理