我创建了一个使用旧函数(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(或类似的东西)使用这些数字)
答案 0 :(得分:4)
如果你忽略了着色器,那么你就会遇到3.0之前的顶点属性(位置,颜色,法线,texcoords,颜色索引)。您应该使用glVertexPointer
,glColorPointer
,glNormalPointer
和家庭,而不是通用glVertexAttribPointer
。您无需使用glBindAttribLocation
,因为通用(编号)属性用于着色器。
您已经在使用缓冲区对象,这对性能非常有利。
绘图函数(glDrawArrays *,gl(Multi)DrawElements *)看起来与固定函数相同。兼容性配置文件可以让你摆脱固定功能,仍然使用GL3功能,如实例化。
为什么这样?我不知道;着色器简化了很多......
答案 1 :(得分:3)
我以为别人会给出正式答案。但是这里是:
不,你不能使用没有着色器的现代(可编程)OpenGL。