OpenGL gluperspective()

时间:2011-11-15 22:53:36

标签: opengl

我想我可能会极大地误解了gluperspective()的使用并需要帮助。

我目前有这个代码产生一个空白的黑屏(从我认为我理解的,它应该产生两个正方形,一个更近,一个距离更远)。它没有这样做,我需要理解为什么不。

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <GL/glu.h>
#include "functionfile.h"

int main(int argc, char **argv)
{
init_perspective(640, 480);

glTranslatef(0,0,10);
glColor4f(1.0,1.0,1.0,1.0);

glBegin(GL_QUADS);
glVertex3f(0,  0,0);
glVertex3f(10, 0,0);
glVertex3f(10,10,0);
glVertex3f(0, 10,0);
glEnd();

glLoadIdentity();
glTranslatef(0,0,50);

glBegin(GL_QUADS);
glVertex3f(0,   0, 0);
glVertex3f(10,  0, 0);
glVertex3f(10, 10, 0);
glVertex3f(0,  10, 0);
glEnd();

glLoadIdentity();

SDL_GL_SwapBuffers();

SDL_Delay(2000);

SDL_Quit();

return 0;
}

// from header file "functionfile.h" 

void init_perspective(int width, int height)

{

SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(width, height, 32, SDL_OPENGL);
SDL_WM_SetCaption( "OpenGL Test", NULL );

glClearColor( 0, 0, 0, 0 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(45, width/height, 1, 100);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glClear( GL_COLOR_BUFFER_BIT );

}

2 个答案:

答案 0 :(得分:3)

好吧,您的代码包含几个问题。首先,您没有设置视口(请参阅glViewport文档)。接下来,您应该知道OpenGL是一个状态机,最好在每次渲染迭代之前设置所有必需的状态。这包括设置视口和投影。所以glViewport并且设置投影矩阵在语义上属于绘图命令,而不是窗口管理命令。

在你的情况下,从程序执行的角度来看,没有区别,但只要你引入动画和事件循环,这就变得很重要。另外请记住,如果渲染过程需要,您可以随时更改视口投影参数,例如在屏幕的一角绘制小地图叠加层。

答案 1 :(得分:3)

你的相机俯视负Z轴,所以你的glTranslatef调用正在移动相机后面的几何体,而不是前面。