如何创建没有着色器的现代程序?

时间:2013-04-02 18:59:10

标签: c++ opengl

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

init函数:

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参数。

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

那么我应该使用的最新功能是只创建init func更改绘图功能,但不使用着色器? 如果这是可用的,那么pSlot和nSlot的价值是多少? (我认为0和2,因为着色器中的旧gl_Vertex和gl_normal(或类似的东西)使用这些数字)

2 个答案:

答案 0 :(得分:4)

如果你忽略了着色器,那么你就会遇到3.0之前的顶点属性(位置,颜色,法线,texcoords,颜色索引)。您应该使用glVertexPointerglColorPointerglNormalPointer和家庭,而不是通用glVertexAttribPointer。您无需使用glBindAttribLocation,因为通用(编号)属性用于着色器。

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

绘图函数(glDrawArrays *,gl(Multi)DrawElements *)看起来与固定函数相同。兼容性配置文件可以让你摆脱固定功能,仍然使用GL3功能,如实例化。

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

答案 1 :(得分:3)

我以为别人会给出正式答案。但是这里是:

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