2014-09-23 216 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