2013-03-18 4 views
5

मेरे कार्यक्रम नीचे एक सरल प्रकाश के द्वारा प्रकाशित रोटेशन में एक घन प्रदर्शित करना चाहिए का उपयोग कर सही नहीं। समस्या यह है कि घन चमक रहा है। जब मैं कॉल glEnable (GL_DEPTH_TEST) को वापस लेने घन चमकती नहीं है, लेकिन मैं इसे अंदर चेहरे देख सकते हैं (यह एक सामान्य बात है कोई गहराई परीक्षण न होने के कारण)। हालांकि यह कॉल आवश्यक है। इसलिए मुझे समझ में नहीं आता कि इस फ़ंक्शन का कॉल सही तरीके से क्यों काम नहीं करता है।प्रदर्शन glEnable (GL_DEPTH_TEST)

#include <iostream> 
#include <SDL/SDL.h> 
#include <gl/glut.h> 

const static int WIDTH = 640; 
const static int HEIGHT = 480; 

GLfloat angle = 0.0f; 

static GLfloat position[4] = {0.0, 50.0, -50.0, 1.0}; 
static GLfloat diffuse[3] = {0.64, 0.64, 0.64}; 
static GLfloat specular[3] = {0.64, 0.64, 0.64}; 
static GLfloat emissive[3] = {0.0, 0.0, 1.0}; 

static GLfloat vertices[72] = 
{ 
    1.000000, -1.000000, -1.000000,  //V1 
    1.000000, -1.000000, 1.000000,  //V2 
    -1.000000, -1.000000, 1.000000,  //V3 
    -1.000000, -1.000000, -1.000000, //V4 

    1.000000, 1.000000, -0.999999,  //V5 
    -1.000000, 1.000000, -1.000000,  //V8 
    -1.000000, 1.000000, 1.000000,  //V7 
    0.999999, 1.000000, 1.000001,  //V6 

    1.000000, -1.000000, -1.000000,  //V1 
    1.000000, 1.000000, -0.999999,  //V5 
    0.999999, 1.000000, 1.000001,  //V6 
    1.000000, -1.000000, 1.000000,  //V2 

    1.000000, -1.000000, 1.000000,  //V2 
    0.999999, 1.000000, 1.000001,  //V6 
    -1.000000, 1.000000, 1.000000,  //V7 
    -1.000000, -1.000000, 1.000000,  //V3 

    -1.000000, -1.000000, 1.000000,  //V3 
    -1.000000, 1.000000, 1.000000,  //V7 
    -1.000000, 1.000000, -1.000000,  //V8 
    -1.000000, -1.000000, -1.000000, //V4 

    1.000000, 1.000000, -0.999999,  //V5 
    1.000000, -1.000000, -1.000000,  //V1 
    -1.000000, -1.000000, -1.000000, //V4 
    -1.000000, 1.000000, -1.000000  //V8 
}; 

static GLfloat normals[72] = 
{ 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 

    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 

    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 

    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 

    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 

    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000 
}; 

static void  eventListener(SDL_Event *pEvent, bool *pContinue) 
{ 
    while (SDL_PollEvent(pEvent)) 
    { 
     switch(pEvent->type) 
     { 
     case SDL_QUIT: 
      *pContinue = false; 
      break; 
     case SDL_KEYDOWN: 
      switch (pEvent->key.keysym.sym) 
      { 
      case SDLK_ESCAPE: 
       *pContinue = false; 
       break; 
      } 
     } 
    } 
} 

static void  beginRender(void) 
{ 
    /*Perspective*/ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glViewport(0, 0, WIDTH, HEIGHT); 
    gluPerspective(60.0, (float)(WIDTH/HEIGHT), 0.0f, 1000.0f); 
    gluLookAt(0.0f, 0.0, 7.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 

    /*Clear screen*/ 

    glClearDepth(1.0f); 
    glClearColor(0.13f, 0.12f, 0.13f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    /*Prepare model transformations*/ 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    /*Light settings*/ 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    /*Depth test*/ 

    glEnable(GL_DEPTH_TEST); //PROBLEM COMES FROM HERE 
} 

static void  renderFrame(void) 
{ 
    /*light position*/ 

    glLightfv(GL_LIGHT0, GL_POSITION, position); 

    /*Model transformations*/ 

    glPushMatrix(); 
    glRotatef(angle, 0.0f, 1.0f, 1.0f); 

    /*Light materials*/ 

    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, specular); 
    glMaterialfv(GL_FRONT, GL_EMISSION, emissive); 
    glMateriali(GL_FRONT, GL_SHININESS, 10); 

    /*Model rendering*/ 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glNormalPointer(GL_FLOAT, 0, normals); 

    glDrawArrays(GL_QUADS, 0, 24); 

    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    angle += 0.010f; 
    glPopMatrix(); 
} 

static void  endRender(void) 
{ 
    glFlush(); 
    SDL_GL_SwapBuffers(); 
} 

static void  startRendering(void) 
{ 
    bool  continuer = true; 
    SDL_Event event; 

    while (continuer) 
    { 
     eventListener(&event, &continuer); 
     beginRender(); 
     renderFrame(); 
     endRender(); 
    } 
} 

int    main(int ac, char **av) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("Test luminosity",NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL | SDL_DOUBLEBUF); 

    startRendering(); 
    SDL_Quit(); 
    return (0); 
} 

यहाँ glEnable (GL_DEPTH_TEST) के साथ स्क्रीन है (चेहरे चमकती रहे हैं)

enter image description here

और यह कॉल के बिना (कोई चमकती प्रदर्शन नहीं बल्कि गहराई परीक्षण):

यहाँ मेरी कोड है

enter image description here

मैंने सफलता के बिना कई कोड संयोजन की कोशिश की।

किसी को भी मेरी मदद कर सकते है?

आपकी मदद के लिए अग्रिम धन्यवाद।

उत्तर

8

आपका पास कतरन विमान ठीक से सेट नहीं है, इसलिए आपका जेड बफरिंग काम नहीं कर रहा।

gluPerspective(60.0, (float)(WIDTH/HEIGHT), 0.0f, 1000.0f); 
              ^^^^ 

इसे उचित दूरी पर सेट करें - जहां तक ​​आप रह सकते हैं।

इसके अलावा, प्रक्षेपण मैट्रिक्स में कैमरा उन्मुखीकरण (यानी दृश्य को बदलने) डाल नहीं है ...

अंत में, ध्यान दें कि इस कार्यक्षमता का सबसे हटाई गई है, और जीएल के नए संस्करण में अब उपलब्ध नहीं । की सिफारिश की दृष्टिकोण अपनी खुद की मैट्रिक्स गणना संभाल, और ज्यामिति रेंडर करने के लिए प्रोग्राम पाइपलाइन का प्रयोग है।

+0

हैलो, आप अपने जवाब के लिए बहुत बहुत धन्यवाद। मैट्रिक्स और ज्यामिति प्रबंधन के बारे में मैं आपके जैसे मैट्रिक्स प्रबंधन और शेडर्स का उपयोग करने जा रहा हूं। यह मेरा मुख्य उद्देश्य है। सबको धन्यवाद। अलविदा। – user1364743

संबंधित मुद्दे