0

我正在尝试学习 OpenGL。我尝试了我在这本书中找到的一些代码,但程序的输出只是一个白屏,输出应该是谢尔宾斯基三角形。

有什么问题?我正在 Mac OS X 10.8 和 Xcode 4.5 上开发

#include "Angel.h"
#include <iostream>

const int numPoints = 5000;
typedef vec2 point2;

void init(){

    point2 points[numPoints];
    point2 vertices[3] = {
        point2(-1.0, -1.0), point2(0.0, 1.0), point2(1.0, -1.0)
    };

    points[0] = point2(0.25, 0.5);

    for (int k = 1; k < numPoints; k++) {
        int j = rand()%3;
        points[k] = (points[k-1]+vertices[j])/2.0;
    }

    GLuint program = InitShader("vertex.glsl", "fragment.glsl");
    glUseProgram(program);

    GLuint abuffer;
    glGenVertexArraysAPPLE(1, &abuffer);
    glBindVertexArrayAPPLE(abuffer);

    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

    GLuint location = glGetAttribLocation(program, "vPosition");
    glEnableVertexAttribArray(location);
    glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

    glClearColor(1.0, 1.0, 1.0, 1.0);

}


void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_POINTS, 0, numPoints);
    glFlush();
}

int main(int argc, char** argv){

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_3_2_CORE_PROFILE);

    glutInitWindowSize(640, 480);

    glutCreateWindow("Sierpinski Gasket");

    init();

    glutDisplayFunc(display);

    glutMainLoop();

    return 0;
}
4

2 回答 2

1

在您的示例中,您似乎错过了着色器程序附加阶段。使用可编程管道时,您必须提供至少一个编译到着色器程序中的顶点和片段着色器。然后在渲染循环中,在调用 glDrawArrays() 或任何其他几何相关方法之前你必须通过 glUseProgram 绑定着色器程序。否则你的 GPU 不知道如何处理顶点数据。看看这个很棒的教程,它非常详细地解释了你开始使用现代 OpenGL 所需要知道的一切。我认为,如果我没记错的话,在 OSX 上工作时,您将不得不对某些 API 方法使用扩展,因为它支持 GL 3.2。

如何附加着色器?我真的什么都不知道。

好吧,看,你必须知道如何去做,否则你无法继续编写 OpenGL 应用程序。仔细阅读教程,以牢牢掌握着色器程序的工作原理以及为什么需要它们。

于 2013-01-26T16:59:41.073 回答
1

最后 !代码已完成,着色器按应有的方式附加。

.h中包含的文件有问题Angel.h,而不是<OpenGL/OpenGL.h>应该是<OpenGL/gl3.h>. 要更改的第二件事是删除APPLE函数的后缀glGenVertexArrayAPPLEglBindVertexArrayAPPLE.

显然,Apple 及其 OpenGL 的实现存在问题,可能并非所有的东西都与他们所拥有的兼容,但我将这个话题交给了专家,如果有人在那里请澄清这一点。

于 2013-01-27T20:46:40.113 回答