2014-09-23 2 views
0

glDrawElements 함수를 사용하여 큐브를 그리려고했지만 아래의 간단한 코드로도 검은 색 화면 만 나타납니다. 도움이된다면, 나는 Xcode 6에서 프로그래밍 중입니다.OpenGL glDrawElements 전용 검정색 화면

// 
// main.cpp 
// Copyright (c) 2014 Guilherme Cardoso. All rights reserved. 
// 

#include <iostream> 
#include <OpenGL/OpenGL.h> 
#include <GLUT/GLUT.h> 
#include <vector> 
#include <math.h> 

const GLfloat width = 500; 
const GLfloat height = 500; 

GLubyte cubeIndices[24] = {0,3,2,1,2,3,7,6 
    ,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4}; 

GLfloat vertices[][3] = 
{{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
    {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, 
    {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; 

GLfloat colors[][3] = 
{{0.0,0.0,0.0},{1.0,0.0,0.0}, 
    {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, 
    {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}}; 

void display(){ 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glColorPointer(3, GL_FLOAT, 0, colors); 
    glVertexPointer(3, GL_FLOAT, 0, vertices); 

    //glDrawArrays(GL_QUADS, 0, 24); 
    glDrawElements(GL_QUADS, 24,GL_UNSIGNED_BYTE, cubeIndices); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glutSwapBuffers(); 
} 

void mouse(int button, int state, int x, int y){ 

} 

void keyboard(unsigned char key, int x, int y){ 
    if(key=='q' || key == 'Q') exit(0); 
} 

void init(){ 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,width ,height, 0); 
    glMatrixMode(GL_MODELVIEW); 

    glClearColor (1.0, 1.0, 1.0,1.0); 
    //glColor3f(0.0,0.0,0.0); 
} 

void idle(){ 

} 

int main(int argc, char **argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(width, height); 
    glutCreateWindow("Assignment 3"); 
    glutPositionWindow(0, 0); 


    glutDisplayFunc(display); 
    glutMouseFunc(mouse); 
    glutKeyboardFunc(keyboard); 
    glutIdleFunc(idle); 

    init(); 
    glutMainLoop(); 
} 

나는 이미 튜토리얼을 확인했으며, 내가하는 일과별로 다르지 않습니다.

답변

1

실제로 코드는 입방체를 잘 그립니다. 자세히 보면 : P

enter image description here

주요 문제는 당신의 투사이다. 초기 GL보기 볼륨은 -1에서 1 입방체입니다. 그리는 의 큐브는 -1에서 1입니다. gluOrtho2D을 호출하면 OpenGL 좌표의 투영법이 정의됩니다.이 투영법은 픽셀과 동일하게 만들지 만, 큐브가 -1 대 1이면 두 픽셀 만 크고 나머지는 오프 스크린입니다.

대신

... 1로 Z 차원을 -1 설정하는 gluOrtho2D을 삭제하고 단지 당신이 X/Y 설정하고, 약간 더 큰 돌출부를 만들 수 있습니다

glOrtho(-2, 2, -2, 2, -2, 2); 

참고 : @derhass에서 알 수 있듯이 glClear을 호출하는 것이 특히 중요합니다 (이 기능을 사용하지 않으면 마지막 그리기 호출의 큐브가 업데이트 된 큐브를 숨 깁니다).

2

색상 및 특히 깊이 버퍼를 지우지 마십시오. display() 기능의 시작 부분에 그렇게해야합니다.

또한 매트릭스 설정이 약간 이상합니다. 픽셀에 대해 정사영을 설정했지만 [-1,1] 범위의 정육면체를 그리면 화면의 너비가 2 픽셀이됩니다.

+0

명확한 기능을 넣습니다. glClearColor (1.0, 1.0, 1.0,1.0); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 디스플레이 기능에 여전히 아무것도,하지만 내가 0,1로 ortho를 변경하면 너무 작아서, 나는 (150,150,150) 같은 점을 넣으려고했지만, 여전히 아무것도. – Myrium

+0

@Myrium : 포인트 z = 150이보기 볼륨 밖에 있기 때문에 가능성이 높습니다. 'gluOrtho2D'를 사용하면 z = [** - 1 **, ** 1 **] 범위의 점만 볼 수 있습니다. –

+0

@ AndonM.Coleman, 나는 (0,500,500,0)에 오르 소를 시도했지만 아직 아무것도하지 않았다. – Myrium

관련 문제