我想我可能会极大地误解了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 );
}
答案 0 :(得分:3)
好吧,您的代码包含几个问题。首先,您没有设置视口(请参阅glViewport
文档)。接下来,您应该知道OpenGL
是一个状态机,最好在每次渲染迭代之前设置所有必需的状态。这包括设置视口和投影。所以glViewport
并且设置投影矩阵在语义上属于绘图命令,而不是窗口管理命令。
在你的情况下,从程序执行的角度来看,没有区别,但只要你引入动画和事件循环,这就变得很重要。另外请记住,如果渲染过程需要,您可以随时更改视口投影参数,例如在屏幕的一角绘制小地图叠加层。
答案 1 :(得分:3)
你的相机俯视负Z轴,所以你的glTranslatef调用正在移动相机后面的几何体,而不是前面。