0

我在 PC 上运行此代码(在 code::blocks 10.05 中编译)
当我使用 GLUT(GL Utiltiy Toolkit)做基本的 OpenGL 代码时,一切正常。
现在,当我尝试更改平移函数的 z 轴(第三个参数)时,我正在通过 SDL 框架运行 OpenGL 代码,几何图元(四边形)的位置似乎没有深度,并且要么显示覆盖当深度达到某一点时,整个屏幕或完全消失。
我错过了什么吗?:/

#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;
}
4

3 回答 3

0

我想我知道答案:

在正交投影中(投影和透视分割后):

Zb = -2/(fn) -(f+n)/((fn)*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 值不能设置为零,这会导致深度缓冲区中所有图元的深度值与此值相同。

于 2012-12-21T11:34:25.083 回答
0

我不知道你的问题的原因,但我在你的代码中发现了一个问题。渲染一帧后,您清除了颜色帧缓冲区​​,但您忘记清除深度缓冲区。所以,使用 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 在您的主要功能中并查看效果。

于 2012-12-21T07:31:49.803 回答
0

当您说深度时,您指的是透视效果吗?如果你想让更远的东西看起来更小,你需要使用透视投影矩阵(参见 gluPerspective)。

您当前正在使用正交投影 (glOrtho),它没有任何透视效果。

于 2012-08-03T22:56:14.123 回答