Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建没有着色器的现代程序?_C++_Opengl - Fatal编程技术网

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

C++ 如何创建没有着色器的现代程序?,c++,opengl,C++,Opengl,我创建了一个使用旧函数(vertexpointer)的程序,我想用现代函数使它更快。 我认为我应该创建一个纯粹的、新的,但我认为在创建一个新的之前,我可以在这里问这个问题。 我试图替换其中一个绘图函数,但其他函数也出了问题 init函数: glGenBuffers(10,vbo); glBindBuffer(GL_ARRAY_BUFFER,vbo[0]); glBufferData(GL_ARRAY_BUFFER,sizeof(float)*vertSize,vert,GL_DYNAMIC_DR

我创建了一个使用旧函数(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
参数

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

那么,我应该只创建init func更改drawing func而不使用着色器的最新功能是什么?
如果这是可访问的,pSlot和nSlot的值是多少?(我认为是0和2,因为着色器中的旧gl_顶点和gl_法线(或类似的东西)使用这些数字)

如果忽略着色器,那么就只能使用3.0之前的顶点属性(位置、颜色、法线、texcoords、颜色索引)。您应该使用
glVertexPointer
glColorPointer
glNormalPointer
和族,而不是通用的
glvertexattributepointer
。无需使用
glBindAttribLocation
,因为通用(编号)属性用于着色器

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

对于固定函数和固定函数,绘图函数(glDrawArrays*、gl(多)抽屉元素*)看起来相同。兼容性配置文件应该允许您使用固定功能,并且仍然使用GL3功能,如实例化


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

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


不,如果没有着色器,您不能使用现代(可编程)OpenGL。

我更喜欢使用glGetAttribLocation注意:在将位置绑定到属性后不要忘记链接程序更多详细信息:在现代OpenGL中,您必须实现着色器。没有办法。抱歉,如果我不清楚,我正在尝试忽略着色器。:)我知道,但不是现代的openGL,有点不那么现代。如果它是绝对不可识别的,那么什么是最新的openGL?什么不必使用它?好吧,如果你想要的不是立即模式,而是顶点数组,那么你很难告诉这个现代openGL。顶点阵列已经有超过15年的历史了。如果要使用通用顶点属性,则还必须告诉OpenGL如何处理这些属性,这意味着要编写着色器。后者会很现代。谢谢!我想我可以稍微修改一下我的程序。我必须扔掉矩阵堆栈,还有很多东西……如果你对使用固定函数没意见,你到底想让你的程序现代化些什么?我想在程序开始时把数据复制到GPU上。我问的是“什么”,而不是“为什么”。什么更快?API的哪些部分?例如,顶点缓冲区对象比客户端顶点数组快,但您已经在使用它们了抱歉,我误解了,但现在已修复。