【问题标题】:OpenGL glDrawElements only Black Screen仅 OpenGL glDrawElements 黑屏
【发布时间】:2025-12-06 05:25:04
【问题描述】:

我试图使用 glDrawElements 函数绘制一个立方体,但即使是下面的简单代码也只会给我一个黑屏。如果有帮助,我正在 XCode 6 上编程。

//
//  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();
}

我已经查看了一些教程,与我正在做的没有太大的不同。

【问题讨论】:

    标签: c++ xcode opengl


    【解决方案1】:

    您永远不会清除颜色,尤其是深度缓冲区。您应该在 display() 函数的开头执行此操作。

    另外,您的矩阵设置有点奇怪。您为像素设置了一些正交投影,但尝试在 [-1,1] 范围内绘制一个立方体,因此它在屏幕上的宽度为 2 个像素。

    【讨论】:

    • 我把清除函数 glClearColor (1.0, 1.0, 1.0,1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);在显示功能上,仍然没有,但是如果我将正交更改为 0,1,它太小了,我尝试输入 (150,150,150) 之类的点,但仍然没有。
    • @Myrium:这很可能是因为 z=150 点超出了您的观看量。使用 gluOrtho2D 只会看到 z=[-1,1] 范围内的点。
    • @AndonM.Coleman,我在 (0,500,500,0) 上尝试了正射,但仍然没有
    【解决方案2】:

    实际上,您的代码可以很好地绘制立方体。仔细看:P

    主要问题是您的投影。初始 GL 观察体积是一个 -1 比 1 的立方体,但您正在绘制的立方体 -1 比 1。对 gluOrtho2D 的调用定义了 OpenGL 坐标中的投影,您可以与像素相同,但由于您的立方体是 -1 比 1,因此它只有两个像素大,其余的都在屏幕外。

    相反,删除 gluOrtho2D,它将 Z 维度 -1 设置为 1,并且只允许您设置 X/Y ,并创建一个稍大的投影...

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

    注意:正如@derhass 建议的那样,调用glClear 很重要,尤其是在启用深度测试的情况下(没有它,上次绘制调用的立方体将隐藏更新的立方体)。

    【讨论】: