-2

我创建了一个使用旧函数(顶点指针)的程序,我想用现代函数让它更快。
我认为我应该创造一个纯粹的、新的,但我想在我创造一个新的之前我可以在这里问这个问题。
我试图替换其中一个绘图函数,其他的也出错了!

初始化函数:

glGenBuffers(10,vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*vertSize,vert,GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,vbo[1]);
glBufferData(GL_ARRAY_BUFFER,sizeof(float)*normalsSize,normals,GL_DYNAMIC_DRAW);
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(pSlot);
glEnableVertexAttribArray(nSlot);
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
glVertexAttribPointer(pSlot,3,GL_FLOAT,GL_FALSE,0,0);
glBindBuffer(GL_ARRAY_BUFFER,vbo[1]);
glVertexAttribPointer(nSlot,3,GL_FLOAT,GL_FALSE,0,0);

我对画法没有概念...

我应该使用这些:

glBindAttribLocation(prog, pSlot, "inVer");
glBindAttribLocation(prog, nSlot, "inNorm");

但它需要一个prog参数。

问题是如果我使用着色器,我应该重写整个程序,如果我错了,请告诉我,如何在不为投影矩阵、模型视图矩阵创建制服的情况下创建着色器,并直接使用矩阵堆栈。

那么我应该使用什么最新的东西来只创建初始化函数来改变绘图函数,而不是使用着色器呢?如果这是可用的,pSlot 和 nSlot 的值是多少?(我认为是 0 和 2,因为着色器中旧的 gl_Vertex 和 gl_normal (或类似的东西)使用这些数字)

4

2 回答 2

4

如果您忽略着色器,那么您将被 3.0 之前的顶点属性(位置、颜色、法线、texcoords、颜色索引)困住。您应该使用glVertexPointer,和家庭glColorPointerglNormalPointer而不是通用的glVertexAttribPointer。您无需使用,glBindAttribLocation因为通用(编号)属性适用于着色器。

您已经在使用缓冲区对象,这对性能非常有利。

绘图函数 (glDrawArrays*, gl(Multi)DrawElements*) 对于固定函数和 . 兼容性配置文件应该让您摆脱固定功能并仍然使用 GL3 功能,如实例化。

为什么要这样做?我不知道; 着色器简化了很多...

于 2013-04-02T19:40:23.733 回答
3

我以为其他人会给出官方答案。但这里是:

不,你不能使用没有着色器的现代(可编程)OpenGL。

于 2013-04-02T19:41:50.170 回答