2014-09-23 104 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,它只有兩個像素大,其餘的是屏幕外。

相反,降gluOrtho2D,這臺ž尺寸-1到1之間,只允許你設置X/Ÿ,並創建一個稍微大一點的投影......

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); 在顯示功能上,仍然沒有什麼,但如果我將ortho更改爲0,1,它太小了,我試圖把點(150,150,150),但仍然沒有。 – Myrium 2014-09-23 19:36:37

+0

@Myrium:這很可能是因爲z = 150的點超出了您的觀看量。使用'gluOrtho2D'只能看到z = [** - 1 **,** 1 **]的區域。 – 2014-09-23 21:02:51

+0

@ AndonM.Coleman,我嘗試與ortho(0,500,500,0),仍然沒有 – Myrium 2014-09-23 21:06:06