2012-08-07 8 views
0

이 코드는 빨간색 책, 예 2-15 (코드는 책의 코드와 정확하게 일치하지 않음)의 코드입니다. 내가 기록한 메모를 잘 보살펴주세요. http://www.opengl.org/resources/libraries/glut/spec3/node21.htmlOpenGL qeustion : 왜 glutSwapBuffer() 함수가 작동하지 않습니까?

#include <fstream> 
#include <stdlib.h> 
#include <GL/glew.h> 
#include <GL/glut.h> 
#pragma comment(lib,"glew32.lib") 
using namespace std; 
#define BUFFER_OFFSET(offset) ((GLubyte *)NULL+offset) 
#define XStart    -0.8 
#define XEnd    0.8 
#define YStart    -0.8 
#define YEnd    0.8 
#define NumXPoints   11 
#define NumYPoints   11 
#define NumPoints   (NumXPoints * NumYPoints) 
#define NumPointsPerStrip (2*NumXPoints) 
#define NumStrips   (NumYPoints-1) 
#define RestartIndex  0xffff 

void display(void) 
{ 
    int i,start; 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f(1,1,1); 
    glDrawElements(GL_TRIANGLE_STRIP,NumStrips*(NumPointsPerStrip+1),GL_UNSIGNED_SHORT,BUFFER_OFFSET(0)); 
    //glFlush();//it works,show a white square with black backgroud 
    glutSwapBuffers();///it doesn't work,show what tha area looked like before 

} 

void init (void) 
{ 
    GLuint vbo,ebo; 
    GLfloat *vertices; 
    GLushort *indices; 
    glewInit(); 
    glGenBuffers(1,&vbo); 
    glBindBuffer(GL_ARRAY_BUFFER,vbo); 
    glBufferData(GL_ARRAY_BUFFER,2*NumPoints*sizeof(GLfloat),NULL,GL_STATIC_DRAW); 
    vertices=(GLfloat *)glMapBuffer(GL_ARRAY_BUFFER,GL_WRITE_ONLY); 
    if(vertices==NULL) 
    { 
     fprintf(stderr,"Unable to map vertex buffer\n"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     int i,j; 
     GLfloat dx=(XEnd-XStart)/(NumXPoints-1); 
     GLfloat dy=(YEnd-YStart)/(NumYPoints-1); 
     GLfloat *tmp=vertices; 
     int n=0; 
     for(j=0;j<NumYPoints;++j) 
     { 
      GLfloat y=YStart+j*dy; 
      for(i=0;i<NumXPoints;++i) 
      { 
       GLfloat x=XStart + i*dx; 
       *tmp++=x; 
       *tmp++=y; 
      } 
     } 
     glUnmapBuffer(GL_ARRAY_BUFFER); 
     glVertexPointer(2,GL_FLOAT,0,BUFFER_OFFSET(0)); 
     glEnableClientState(GL_VERTEX_ARRAY); 
    } 
    glGenBuffers(1,&ebo); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo); 

    glBufferData(GL_ELEMENT_ARRAY_BUFFER,NumStrips*(NumPointsPerStrip+1)*sizeof(GLushort),NULL,GL_STATIC_DRAW); 
    indices=(GLushort *)glMapBuffer(GL_ELEMENT_ARRAY_BUFFER,GL_WRITE_ONLY); 
    if(indices==NULL) 
    { 
     fprintf(stderr,"Unable to map index buffer\n"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     int i,j; 
     GLushort *index=indices; 
     for(j=0;j<NumStrips;++j) 
     { 
      GLushort bottomRow=j*NumYPoints; 
      GLushort topRow=bottomRow+NumYPoints; 
      for(i=0;i<NumXPoints;++i) 
      { 
       *index++=topRow+i; 
       *index++=bottomRow+i; 
      } 
      *index++=RestartIndex; 
     } 
     glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); 

    } 
    glPrimitiveRestartIndex(RestartIndex); 
    glEnable(GL_PRIMITIVE_RESTART); 
} 


void reshape (int w, int h) 
{ 

    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D (-1,1,-1,1); 
    glViewport (0,0,w,h); 
} 

void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) { 
     case 27: 
      exit(0); 
      break; 
    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize (200, 200); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow (argv[0]); 
    init(); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc (keyboard); 
    glutMainLoop(); 
    return 0; 
} 

는 말한다 : 그것을 반환하기 전에
암시 glFlush이 glutSwapBuffers에 의해 이루어집니다. 후속 OpenGL 명령은 glutSwapBuffers를 호출 한 직후에 발행 할 수 있지만 버퍼 교환이 완료 될 때까지 실행되지 않습니다.
사용중인 레이어가 이중 버퍼링되지 않으면 glutSwapBuffers는 아무 효과가 없습니다.

사용중인 레이어가 이중 버퍼링되었는지 여부를 어떻게 알 수 있습니까? 이중 버퍼링 예제를 제공하십시오.이 코드는 이중 버퍼링입니까? 당신의 main 기능에

답변

4

, 당신은 GLUT_DOUBLE 할 필요가

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 

를 호출합니다. glutInitDisplayMode()에 대한 설명서를 참조하십시오.

+0

답장을 보내 주셔서 감사합니다.^_^그 점이 있습니다. –

+1

문제 없습니다. StackOverflow에 오신 것을 환영합니다. 정답이 질문에 올바르게 대답하면 [받아들이 기] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)라고 생각해야합니다. –

+0

답변을 수락했습니다. (¯ε (# ¯) –

관련 문제