SDL OpenGL代码似乎没有深度

时间:2012-08-03 22:33:55

标签: windows opengl sdl codeblocks

我在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;
}

3 个答案:

答案 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值不能设置为零,这会导致深度缓冲区中所有图元的深度值与此相同。