我正在尝试学习OpenGL。我尝试了一些我在book中找到的代码,但程序的输出只是一个白色屏幕,输出应该是Sierpinski三角形。
可能有什么不对?我正在开发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;
}
答案 0 :(得分:1)
在你的例子中,你似乎错过了着色器程序附件阶段。当使用可编程管道时,你必须提供至少一个顶点和片段着色器编译成着色器程序。然后在渲染循环中,在调用glDrawArrays()或任何其他之前几何相关的方法你必须通过glUseProgram绑定着色器程序。否则你的GPU不知道如何处理顶点数据。看看this伟大的教程,它详细解释了你需要知道的所有入门知识现代OpenGL。我认为,当你在OSX上工作时,你将不得不使用某些API方法的扩展,因为它支持GL 3.2,如果我没记错的话。
如何附加着色器?我真的什么都不知道。
好吧,看,你必须知道如何去做,否则你就无法继续编写OpenGL应用程序。仔细阅读教程,以便扎实地掌握着色器程序的工作原理以及为什么需要它们。
答案 1 :(得分:1)
最后! 代码完整,着色器按原样连接。
.h
中包含的Angel.h
个文件存在问题,而<OpenGL/OpenGL.h>
应该是<OpenGL/gl3.h>
APPLE
。要更改的第二件事是删除函数glGenVertexArrayAPPLE
和glBindVertexArrayAPPLE
的{{1}}后缀。
显然苹果及其OpenGL的实现存在问题,可能不是所有的东西都与他们的东西兼容,但是我把这个话题交给了专家,如果有人在那里请澄清一下。