Opengl 固定函数与着色器-帮助理解概念上的差异
我的背景:几个月前,我第一次开始使用OpenGL进行实验,没有什么特别的目的,只是为了好玩。我开始阅读OpenGL红皮书,甚至用很多不同的光源制作了一个行星系统。这持续了一个月,我对openGL的兴趣消失了。大约一周前它又醒来了,正如我从一些so帖子中收集到的,红皮书已经过时,OpenGL超级圣经是一个更好的学习资源。所以我开始读它。我喜欢着色器的概念,但由于我对固定管道的旧记忆和着色器的新概念的转变,我的大脑中出现了真正的混乱 问题:我想写一些我认为是正确的陈述,并请OpenGL专家验证它们(即,我是否理解正确、不完全正确或完全错误)。所以 1) 如果我们不使用任何着色器程序,则不会发生任何更改。我们有当前颜色、当前法线、当前变换矩阵、当前一切,只要我们调用Opengl 固定函数与着色器-帮助理解概念上的差异,opengl,Opengl,我的背景:几个月前,我第一次开始使用OpenGL进行实验,没有什么特别的目的,只是为了好玩。我开始阅读OpenGL红皮书,甚至用很多不同的光源制作了一个行星系统。这持续了一个月,我对openGL的兴趣消失了。大约一周前它又醒来了,正如我从一些so帖子中收集到的,红皮书已经过时,OpenGL超级圣经是一个更好的学习资源。所以我开始读它。我喜欢着色器的概念,但由于我对固定管道的旧记忆和着色器的新概念的转变,我的大脑中出现了真正的混乱 问题:我想写一些我认为是正确的陈述,并请OpenGL专家验证它们(
glVertex**(…)
这些当前值,顶点就会被输入到。。。我不知道是什么。事实上,它与当前矩阵一起变换,当前颜色和法线应用于它等等
2) 只要我们使用着色器程序,上述所有操作都将停止工作。也就是说,glColor
,glRotate
等都没有意义(是吗?)。我的意思是,glColor
仍然会设置当前颜色,glRotate
仍然会将当前矩阵乘以旋转矩阵,但根本不使用它们。相反,我们通过glVertexAttrib
提供顶点属性。哪个属性表示完全依赖于顶点着色器和变量绑定中的。我们还发现ans设置制服的值,然后调用glVertex
,然后执行着色器(我不知道是立即还是在调用glEnd()之后)。实际的顶点和碎片处理完全在着色器程序中手动完成
3) 着色器不会向深度测试添加任何内容。也就是说,我不需要在着色器中处理它。我只需调用glEnable(GL\u DEPTH\u TEST)
。人脸剔除也不受影响
4) 在着色器中不需要考虑Alpha混合和抗锯齿<代码>glEnable
呼叫就足够了
5) 使用gluPerspective、glRotate、glPushMatrix和其他矩阵函数,然后检索当前矩阵并将其作为统一的对象提供给着色器是一个好主意吗?因此,不需要使用第三方矩阵库。2)在现代OpenGL中,没有glColor、glBegin、glVertex、glRotate等,因此它们没有意义
5) 在现代OpenGL中,没有内置矩阵,因此您必须使用第三方库或编写自己的库。所以回答你的问题,不,这不是个好主意
我不能直接回答这些问题,但我要说的是,不学习和使用着色器会挫败近10年来GPU技术的进步。从OpenGL 2.0开始,添加着色器有一个很好的理由。帮自己一个忙,熟悉他们。一旦你开始使用它们,你会想,如果没有它们,你怎么会有我的电脑。@Michael:正如你所看到的,我致力于学习它们,这就是为什么我感到困惑的原因。我确实想使用它们,只是我不了解关于它们的一些基本情况,这些情况在固定管道中更为清楚。非常感谢您的回答。我的显卡支持OpenGL 4.0,我正在使用glew和Qt(QGLWidget),所以核心和兼容性函数都在这里,我有点难以确定哪些可以使用,哪些不可以……。)啊,我现在很困惑。。。我将在将来集中精力并提出更精确的问题:)请注意,上述关于删除功能的所有讨论仅在创建核心上下文时适用。您可以为3.2或更高版本创建一个兼容性上下文,并且您仍然拥有所有旧版本