我在PC上运行此代码(在代码:: blocks 10.05中编译)
当我以前用GLUT(GL Utiltiy Toolkit)做基本的OpenGL代码时,一切正常。
现在,当我尝试更改平移函数的z轴(第三个参数)时,我正在通过SDL框架运行OpenGL代码几何图元(四边形)的位置3D空间似乎没有深度并且要么显示覆盖整个屏幕,要么在深度达到某一点时完全消失。
我错过了什么吗? :/
#include <sdl.h>
#include <string>
#include "sdl_image.h"
#include "SDL/SDL_opengl.h"
#include <gl\gl.h>
// Declare Constants
const int FRAMES_PER_SECOND = 60;
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
// Create Event Listener
SDL_Event event;
// Declare Variable Used To Control How Deep Into The Screen The Quad Is
GLfloat zpos(0);
// Loop Switches
bool gamestarted(false);
bool exited(false);
// Prototype For My GL Draw Function
void drawstuff();
// Code Begins
void init_GL() {
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glViewport(0, 0, 640, 513); // Viewport Change
glOrtho(0, 640, 0, 513, -1.0, 1.0); // Puts Stuff Into View
}
bool init() {
SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(640, 513, 32, SDL_OPENGL);
return true;
}
void drawstuff() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, zpos);
glColor3f(0.5f,0.5f,0.5f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
}
int main (int argc, char* args[]) {
init();
init_GL();
while(exited == false) {
while( SDL_PollEvent( &event ) ) {
if( event.type == SDL_QUIT ) {
exited = true;
}
if( event.type == SDL_MOUSEBUTTONDOWN ) {
zpos-=.1;
}
}
glClear( GL_COLOR_BUFFER_BIT);
drawstuff();
SDL_GL_SwapBuffers();
}
SDL_Quit();
return 0;
}
答案 0 :(得分:0)
当你说深度时,你会提到透视效果吗?如果你想让更远的东西看起来更小,你需要使用透视投影矩阵(参见gluPerspective)。
您目前正在使用正投影(glOrtho),它没有任何透视效果。
答案 1 :(得分:0)
我不知道您的问题的原因,但我发现您的代码存在问题。 渲染一帧后,清除了颜色帧缓冲区,但是忘记清除深度缓冲区。所以,使用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);在你的主要功能中看到效果。
答案 2 :(得分:0)
我想我知道anwser:
在正投影中(在投影和透视分割之后):
Zb = -2 /(f-n) - (f + n)/((f-n)* Z)
Zb:深度缓冲区中的z值
Z:你给出的顶点的z值
在你的情况下:glOrtho(0,640,0,513,-1.0,1.0);
f = 1.0,n = -1.0
所以你的Zb总是-2 /(f - n)= -1,这会导致所有基元的深度相同。
你可以参考红皮书的附录C.2.5。有一个用于正投影的矩阵,之后是透视分割。 在透视投影中要记住另一个提示,即zNear值不能设置为零,这会导致深度缓冲区中所有图元的深度值与此相同。