固定功能着色器 - 帮助理解概念差异

时间:2011-08-26 17:17:16

标签: opengl

我的背景:我几个月前开始尝试使用OpenGL,没有特别的目的,只是为了好玩。我开始阅读OpenGL红皮书,并制作了一个具有许多不同光照的行星系统。这持续了一个月,我对openGL的兴趣消失了。它在大约一周前再次醒来,当我从一些SO帖子中收集时,红皮书已经过时,OpenGL Superbible是一个更好的学习资源。所以我开始阅读它。我喜欢着色器的概念,但是由于我对固定管道的旧记忆和着色器的新概念的转变,我的脑中出现了一个真正的混乱。

问题:我想写一些我认为是真实的陈述,我要求OpenGL专家验证它们(即我是否正确理解,不正确或绝对错误)。所以......

1)如果我们不 使用 任何着色器程序,则不会发生任何变化。我们有当前颜色,当前法线,当前变换矩阵,当前所有内容,并且只要我们调用glVertex**(...)这些当前值并且顶点被馈送到...我不知道是什么。事实是,它是用当前矩阵转换的,当前颜色和法线都适用于它等。

2)只要我们 使用 着色器程序,上述所有操作都会停止。也就是说,glColorglRotate等毫无意义(是吗?)。我的意思是,glColor仍设置当前颜色,glRotate仍然将当前矩阵乘以旋转矩阵,但这些根本不使用。相反,我们通过glVertexAttrib提供顶点属性。哪个属性意味着什么完全依赖于我们的顶点着色器和in变量绑定。我们还发现ans设置了制服的值,然后调用glVertex并执行着色器(我不知道立即或在调用glEnd()之后)。实际的顶点和片段处理完全在着色器程序中手动完成。

3)着色器不会为深度测试添加任何内容。也就是说,我不需要在着色器中处理它。我只是致电glEnable(GL_DEPTH_TEST)。面部剔除也没有受到影响。

4)着色器无需处理Alpha混合和抗锯齿。 glEnable电话就足够了。

5)使用gluPerspective,glRotate,glPushMatrix和其他矩阵函数是否是一个好主意,然后检索当前矩阵并将其作为制服提供给着色器?因此,不需要使用第三方矩阵库。

2 个答案:

答案 0 :(得分:6)

  1. 这取决于您所谈论的OpenGL版本。通过OpenGL 3.0,所有固定功能仍然存在,所以是的,如果您决定只使用固定功能,它将继续像往常一样工作。从3.0开始,相当多的固定管道被弃用,从3.1开始它完全消失。使用这些,您不再真正可以选择使用固定管道。

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

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

  4. 是的,您仍然可以使用内置Alpha混合。根据您的硬件,您可能还需要考虑使用gl_ARB_draw_buffers_blend扩展(如果我没记错的话,这是OpenGL 4中必需的扩展名。)

  5. 然而,这又取决于您所谈论的OpenGL版本。当前的OpenGL完全消除了对矩阵的所有支持,因此您别无选择,只能使用其他矩阵库。旧版本将gl_ModelViewMatrix和gl_NormalMatrix等内容作为制服提供给您的着色器,以便您可以选择该路线。

答案 1 :(得分:1)

2)在现代OpenGL中,没有glColor,glBegin,glVertex,glRotate等,所以它们没有意义。

5)在现代OpenGL中,没有内置矩阵,因此您必须使用第三方库或编写自己的库。所以回答你的问题,不,这不是一个好主意。