【问题标题】:GLUT: blank windowGLUT:空白窗口
【发布时间】:2012-12-17 09:19:46
【问题描述】:

我使用最新的 freeglut 成功编译了此代码,但我不断得到一个空白窗口,其中填充了 glClearColor 函数中指定的颜色。这个简单的程序来自我大学提供的交互式计算机图形教科书。我一个字一个字地抄了下来,还是不行。它应该呈现 2 个旋转的正方形。

我在 windows 7 机器上使用 gcc:

$ gcc -Iinlude -Llib -o sample.exe sample.cpp -lfreeglut -lopengl32

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>

void rashape(int width, int height);
void display();
void renderScene();
void animate(int value);
void drawSquare();
int angle = 0;

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(600, 300);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Primjer animacije");
    glutDisplayFunc(display);
    glutTimerFunc(20, animate, 0);
    glutMainLoop();
}

void animate(int value) {
    angle++;
    if(angle >= 360) kut = 0;
    glutPostRedisplay();
    glutTimerFunc(20, animate, 0);
}

void display() {
    glClearColor(1.0f, 0.2f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    renderScene();
    glutSwapBuffers();
}

void reshape(int width, int height) {
    glDisable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width-1, 0, height-1, 0, 1);
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    glMatrixMode(GL_MODELVIEW);
}

void drawSquare() {
    glBegin(GL_QUADS);
    glVertex2f(  0.0f,   0.0f);
    glVertex2f(100.0f,   0.0f);
    glVertex2f(100.0f, 100.0f);
    glVertex2f(  0.0f, 100.0f);
    glEnd();
}

void renderScene() {
    glPointSize(6);
    glColor3f(0.3f, 1.0f, 0.3f);

    glPushMatrix();
    glTranslatef( 150.0f, 160.0f, 0.0f);
    glScalef(1.5f, 1.5f, 1.0f);
    glRotatef((float)kut, 0.0f, 0.0f, 1.0f);
    glTranslatef(-50.0f, -50.0f, 0.0f);
    drawSquare();
    glPopMatrix();

    glPushMatrix();
    glTranslatef( 400.0f, 160.0f, 0.0f);
    glScalef(1.5f, 1.5f, 1.0f);
    glRotatef(-(float)kut, 0.0f, 0.0f, 1.0f);
    glTranslatef(-50.0f, -50.0f, 0.0f);
    drawSquare();
    glPopMatrix();
}

【问题讨论】:

    标签: c++ opengl gcc freeglut


    【解决方案1】:

    你永远不会打电话给reshape()。因此,使用了默认投影矩阵,它将(0,0) 放在屏幕的中心,并且视图“半径”为 1。因此,您的正方形被渲染到远离屏幕的地方。

    在尝试渲染任何内容之前使用适当的参数调用reshape() 应该可以工作。但是,您真正想做的是将其设置为glutReshapeFunc(),以便投影矩阵自动调整以调整大小。这很容易做到:

    int main(int argc, char ** argv)
    {
        // ... stuff ...
        glutReshapeFunc(reshape);
        // ... more stuff ...
    }
    

    视口现在应该会根据窗口大小自动调整。

    【讨论】:

    • 实际上真正明智的解决方案是在显示函数中设置投影矩阵,这实际上属于。 (这是一个绘图状态操作)
    【解决方案2】:

    一个典型的陷阱是背面剔除。不确定它是否适用于您的情况,但请尝试致电

    glDisable( GL_CULL_FACE );
    

    在绘制之前,看看是否有所作为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多