Opengl 固定函数与着色器-帮助理解概念上的差异

Opengl 固定函数与着色器-帮助理解概念上的差异,opengl,Opengl,我的背景:几个月前,我第一次开始使用OpenGL进行实验,没有什么特别的目的,只是为了好玩。我开始阅读OpenGL红皮书,甚至用很多不同的光源制作了一个行星系统。这持续了一个月,我对openGL的兴趣消失了。大约一周前它又醒来了,正如我从一些so帖子中收集到的,红皮书已经过时,OpenGL超级圣经是一个更好的学习资源。所以我开始读它。我喜欢着色器的概念,但由于我对固定管道的旧记忆和着色器的新概念的转变,我的大脑中出现了真正的混乱 问题:我想写一些我认为是正确的陈述,并请OpenGL专家验证它们(

我的背景:几个月前,我第一次开始使用OpenGL进行实验,没有什么特别的目的,只是为了好玩。我开始阅读OpenGL红皮书,甚至用很多不同的光源制作了一个行星系统。这持续了一个月,我对openGL的兴趣消失了。大约一周前它又醒来了,正如我从一些so帖子中收集到的,红皮书已经过时,OpenGL超级圣经是一个更好的学习资源。所以我开始读它。我喜欢着色器的概念,但由于我对固定管道的旧记忆和着色器的新概念的转变,我的大脑中出现了真正的混乱

问题:我想写一些我认为是正确的陈述,并请OpenGL专家验证它们(即,我是否理解正确、不完全正确或完全错误)。所以

1) 如果我们不使用任何着色器程序,则不会发生任何更改。我们有当前颜色、当前法线、当前变换矩阵、当前一切,只要我们调用
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中,没有内置矩阵,因此您必须使用第三方库或编写自己的库。所以回答你的问题,不,这不是个好主意

  • 这取决于你所说的OpenGL的版本。在OpenGL 3.0中,所有固定功能仍然存在,因此是的,如果您决定只使用固定功能,它将继续像往常一样工作。从3.0开始,相当多的固定管道被弃用,到了3.1,它就完全消失了。使用这些,您不再真正有选择只使用固定管道

  • 再说一次,这要视情况而定。例如,在OpenGL3.0中,glColor仍然受支持,即使您使用着色器。不同之处在于,它不是自动应用于绘制的内容,而是提供给着色器,着色器可以不加更改地使用它,根据需要修改它,或者完全忽略它。因此,片段着色器接收gl_FrontColor和gl_BackColor,并将实际片段颜色写入gl_FragColor。但是,如果您使用的是OpenGL 3.1或更高版本,glColor(例如)就不再存在了——颜色将只是您提供给着色器的另一个值,就像您可以/将其他任何值提供给着色器一样

  • 这是正确的,至少在OpenGL 3.1中是这样。从4.0开始,有一个新的计算着色器(我相信)可以参与深度测试(但我没有使用它,所以对此我有点不确定)

  • 是的,您仍然可以使用内置的alpha混合。根据您的硬件,您可能还想考虑使用GLYARBRUGHUBRULSRSY混合扩展(如果我记得正确的话,它是OpenGL 4强制的)。< /P> < /LI>
  • 再说一次,这取决于你所说的OpenGL的版本。当前的OpenGL完全消除了对矩阵的所有支持,所以您别无选择,只能使用其他一些矩阵库。较旧的版本将gl_ModelViewMatrix和gl_NormalMatrix作为统一的对象提供给着色器,因此,如果您愿意,您可以选择这条路线


  • 我不能直接回答这些问题,但我要说的是,不学习和使用着色器会挫败近10年来GPU技术的进步。从OpenGL 2.0开始,添加着色器有一个很好的理由。帮自己一个忙,熟悉他们。一旦你开始使用它们,你会想,如果没有它们,你怎么会有我的电脑。@Michael:正如你所看到的,我致力于学习它们,这就是为什么我感到困惑的原因。我确实想使用它们,只是我不了解关于它们的一些基本情况,这些情况在固定管道中更为清楚。非常感谢您的回答。我的显卡支持OpenGL 4.0,我正在使用glew和Qt(QGLWidget),所以核心和兼容性函数都在这里,我有点难以确定哪些可以使用,哪些不可以……。)啊,我现在很困惑。。。我将在将来集中精力并提出更精确的问题:)请注意,上述关于删除功能的所有讨论仅在创建核心上下文时适用。您可以为3.2或更高版本创建一个兼容性上下文,并且您仍然拥有所有旧版本