我的背景:几个月前,我第一次开始尝试 OpenGL,没有什么特殊目的,只是为了好玩。我开始阅读 OpenGL 红皮书,并最终了解了如何制作一个具有多种不同光照的行星系统。这种情况持续了一个月,我对 openGL 的兴趣就消失了。大约一周前它再次醒来,正如我从一些 SO 帖子中收集到的那样,红皮书已经过时了,OpenGL Superbible 是更好的学习资源。所以我开始阅读它。我喜欢着色器的概念,但由于我对固定管道的旧记忆和着色器的新概念的转变,我的大脑中出现了真正的混乱。
问题:我想写一些我认为正确的陈述,并请OpenGL专家验证它们(即我的理解是否正确、不完全正确或完全错误)。所以...
1)如果我们不这样做use任何着色器程序都不会发生任何变化。我们有当前的颜色,当前的法线,当前的变换矩阵,当前的一切,只要我们调用glVertex**(...)
获取这些当前值并将顶点馈送到...我不知道什么。事实上,它是用当前矩阵进行转换的,当前颜色和法线应用于它等等。
2)一旦我们use着色器程序,以上所有都停止工作。那是,glColor
, glRotate
等等没有任何意义(是吗?)。我是说,glColor
仍然设置当前颜色,glRotate
仍然将当前矩阵乘以旋转矩阵,但根本不使用它们。相反,我们通过以下方式提供顶点属性glVertexAttrib
。哪个属性意味着什么完全取决于我们的顶点着色器和in
变量绑定。我们还找到并设置制服的值,然后调用glVertex
并且着色器被执行(我不知道立即或调用 glEnd() 之后)。实际的顶点和片段处理完全在着色器程序中手动完成。
3) 着色器不会为深度测试添加任何内容。也就是说,我不需要在着色器中处理它。我只是打电话glEnable(GL_DEPTH_TEST)
。面部剔除也不受影响。
4) 着色器中不需要考虑 Alpha 混合和抗锯齿。glEnable
打电话就足够了。
5) 使用 gluPerspective、glRotate、glPushMatrix 和其他矩阵函数,然后检索当前矩阵并将其作为统一的着色器提供给着色器,这是一个好主意吗?因此不需要使用第三方矩阵库。
这取决于您所讨论的 OpenGL 版本。在 OpenGL 3.0 之前,所有固定功能仍然存在,所以是的,如果您决定仅使用固定功能,它会继续像往常一样工作。从 3.0 开始,相当多的固定管道被弃用,从 3.1 开始它完全消失了。使用这些,您不再真正可以选择仅使用固定管道。
同样,这取决于。例如,直到 OpenGL 3.0,即使您使用着色器,仍然支持 glColor。不同之处在于,它不是自动应用于绘制的内容,而是提供给着色器,着色器可以不加修改地使用它,根据需要修改它,或者完全忽略它。因此,片段着色器接收 gl_FrontColor 和 gl_BackColor,并将实际片段颜色写入 gl_FragColor。然而,如果您使用的是 OpenGL 3.1 或更新版本,glColor(例如)将不再存在——颜色将只是您提供给着色器的另一个值,就像您可以/愿意提供的任何其他值一样。
这是正确的,至少到 OpenGL 3.1 为止都是如此。从 4.0 开始,有一个新的计算着色器(我相信)可以参与深度测试之类的事情(但我没有使用过它,所以我对此有点不确定)。
是的,您仍然可以使用内置的 Alpha 混合。根据您的硬件,您可能还需要考虑使用 gl_ARB_draw_buffers_blend 扩展(如果我没记错的话,从 OpenGL 4 开始这是强制性的)。
同样,这取决于您所讨论的 OpenGL 版本。当前的 OpenGL 完全消除了对矩阵的所有支持,因此您别无选择,只能使用其他矩阵库。旧版本向您的着色器提供像 gl_ModelViewMatrix 和 gl_NormalMatrix 这样的东西作为统一,因此您可以选择这条路线。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)