GLUT: пустое окно

Я успешно скомпилировал этот код, используя последнюю версию freeglut, но постоянно получаю пустое окно, заполненное цветом, указанным в функции glClearColor. Эта простая программа взята из учебника по интерактивной компьютерной графике, предоставленного моим колледжем. Скопировал слово в слово, все равно не работает. Он должен отображать 2 вращающихся квадрата.

Я использую gcc на машине с Windows 7:

$ 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();
}

person Vlatko    schedule 03.01.2013    source источник


Ответы (2)


Вы никогда не звоните reshape(). Таким образом, используется матрица проекции по умолчанию, которая помещает (0,0) в центр экрана и имеет «радиус» вида, равный 1. В результате ваши квадраты отображаются далеко за пределами экрана.

Вызов reshape() с соответствующими параметрами перед попыткой рендеринга должен работать. Что вы действительно хотели бы сделать, так это установить его как glutReshapeFunc(), чтобы матрица проекции автоматически подстраивалась под изменение размера. Это легко сделать:

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

Область просмотра теперь должна автоматически подстраиваться под изменение размера окна.

person atomicinf    schedule 03.01.2013
comment
На самом деле действительно разумным решением было бы установить матрицу проекции в функции отображения, где это действительно должно быть. (Это манипуляция состоянием рисования) - person datenwolf; 03.01.2013

Классическая ловушка — отбраковка обратной стороны. Не уверен, что это относится к вашему случаю, но попробуйте позвонить

glDisable( GL_CULL_FACE );

перед рисованием и посмотрите, есть ли разница.

person Laserallan    schedule 03.01.2013