0

私はこのコードをPCで実行しています(code :: blocks 10.05でコンパイルされ
ています)GLUT(GL Utiltiy Toolkit)を使用して基本的なOpenGLコードを実行していたとき、すべてが正常に機能しました。
変換関数のz軸(3番目のパラメーター)を変更しようとすると、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;
}
4

3 に答える 3

0

問題の理由はわかりませんが、コードに問題があります。1つのフレームをレンダリングした後、カラーフレームバッファをクリアしましたが、深度バッファをクリアするのを忘れました。したがって、glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);を使用します。メイン関数で効果を確認してください。

于 2012-12-21T07:31:49.803 に答える
0

深さを言うとき、あなたは遠近効果を指しますか?遠くのものを小さく見せたい場合は、透視投影行列(gluPerspectiveを参照)を使用する必要があります。

現在、正投影(glOrtho)を使用していますが、これには遠近効果はありません。

于 2012-08-03T22:56:14.123 に答える
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 に答える