C++ GLUT:空白窗口

C++ GLUT:空白窗口,c++,opengl,gcc,freeglut,C++,Opengl,Gcc,Freeglut,我使用最新的freeglut成功地编译了这段代码,但我不断得到一个空白窗口,其中填充了glClearColor函数中指定的颜色。这个简单的程序来自我的学院提供的交互式计算机图形学教材。我一个字一个字地抄了下来,但还是不起作用。它应该使2个正方形旋转 我在windows 7计算机上使用gcc: $gcc-Iinlude-Llib-o sample.exe sample.cpp-lfreeglut-lopengl32 #include <stdio.h> #include <std

我使用最新的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();
}
#包括
#包括
#包括
#包括
空隙形状(内部宽度、内部高度);
void display();
void renderScene();
无效动画(int值);
void drawSquare();
内倾角=0;
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_双精度);
glutInitWindowSize(600300);
glutInitWindowPosition(0,0);
glutCreateWindow(“Primjer animacije”);
glutDisplayFunc(显示器);
glutTimerFunc(20,动画,0);
glutMainLoop();
}
无效动画(int值){
angle++;
如果(角度>=360)kut=0;
再发现();
glutTimerFunc(20,动画,0);
}
无效显示(){
glClearColor(1.0f、0.2f、1.0f、1.0f);
glClear(GLU颜色缓冲位);
glLoadIdentity();
renderScene();
glutSwapBuffers();
}
空洞重塑(整型宽度、整型高度){
glDisable(GLU深度测试);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,宽度-1,0,高度-1,0,1);
GLVIEW(0,0,(GLsizei)宽度,(GLsizei)高度);
glMatrixMode(GLU模型视图);
}
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);
格伦德();
}
void renderScene(){
gl点大小(6);
GL3F(0.3f,1.0f,0.3f);
glPushMatrix();
GLTRANSTEF(150.0f、160.0f、0.0f);
glScalef(1.5f,1.5f,1.0f);
glRotatef((浮动)kut,0.0f,0.0f,1.0f);
GLTRANSTEF(-50.0f,-50.0f,0.0f);
drawSquare();
glPopMatrix();
glPushMatrix();
GLTRANSTEF(400.0f、160.0f、0.0f);
glScalef(1.5f,1.5f,1.0f);
glRotatef(-(浮动)kut,0.0f,0.0f,1.0f);
GLTRANSTEF(-50.0f,-50.0f,0.0f);
drawSquare();
glPopMatrix();
}

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

glDisable( GL_CULL_FACE );

在绘图之前,看看是否有区别。

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

glDisable( GL_CULL_FACE );

在绘图之前,查看是否有影响。

您从未调用
重塑()。因此,使用默认的投影矩阵,将
(0,0)
置于屏幕中心,视图“半径”为1。因此,您的方块将被渲染到远离屏幕的地方

在尝试渲染任何内容之前,使用适当的参数调用
restrape()
。不过,您真正想要做的是将其设置为
glutreformefunc()
,以便投影矩阵自动调整大小。这很容易做到:

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

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

您永远不会调用
重塑()。因此,使用默认的投影矩阵,将
(0,0)
置于屏幕中心,视图“半径”为1。因此,您的方块将被渲染到远离屏幕的地方

在尝试渲染任何内容之前,使用适当的参数调用
restrape()
。不过,您真正想要做的是将其设置为
glutreformefunc()
,以便投影矩阵自动调整大小。这很容易做到:

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

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

实际上,真正合理的解决方案是在显示功能中设置投影矩阵,这实际上是它所属的位置。(这是一种绘图状态操作)实际上,真正合理的解决方案是在显示函数中设置投影矩阵,这实际上属于该函数。(这是图形状态操纵)