直到这一刻,我只使用输入,输出和制服实现了GLSL着色器中的所有效果,除了一些非常重要的常量,如gl_Position
等。我已经阅读了几个教程,有一个关于计算机图形学的讲座,每次他们通过查看物理模型并使用输入值和制服计算所有内容来实现所有内容。这是我认为一切正常的方式。
现在我遇到了这样一个事实,即GLSL中有更多的GLSL内容,例如glLight*
API函数和gl_LightSource
,gl_Texture
常量,具有大量的灯光类型和灯光模型预定义。似乎是一种不同的着色器编程方式。
我想知道使用一种或另一种方式是否有任何优点/缺点?我错过了一些非常重要的事吗?看起来我做了很多多余的工作。
答案 0 :(得分:3)
您可能在GLSL和OpenGL API中找到的所有glLight*
调用都来自旧的和已弃用的固定功能管道!
现在你必须通过Shaders自己完成所有计算,因为我猜你已经在做了。
他们"删除" (已弃用)矩阵堆栈,灯光调用,立即模式渲染等等,列表因各种原因而变为一个。但总的原因是,自己实施和控制这些事情会更好。
我们需要更多的工作来实施和控制所有这些事情,尽管你完全控制了一切,当你真正想要使用某些东西时。 使用固定功能管道OpenGL将分配和加载您可能从未想要使用的各种东西。
另外,当谈论Matrix Stack作为示例时,通常(懒惰的方式)使OpenGL重新计算每个渲染调用的Matrix Stack,使用旧的glPushMatrix()
,glPopMatrix()
,{ {1}}等功能。现在因为你必须,你被迫做所有这些计算并自己处理矩阵。所以现在你会发现大多数矩阵和更多的矩阵可以简单地分配和计算一次,或者至少不是每次渲染调用。
当然他们并没有弃用立即模式渲染,因为我们需要自己实现,现在我们只需要使用缓冲区,因为它们在各方面都要好得多。 < / p>
如果你想要一个很棒的电子表格来显示哪些功能已被弃用,哪些是核心功能,以及扩展功能等等。那么看看here,但要注意这个电子表格是由人制作的谁使用OpenGL而不是Khronos Group(OpenGL的当前开发人员)和Silicon Graphics(OpenGL的创建者)。
答案 1 :(得分:1)
忽略glLightXXX
个函数,相关的gl_LightXXX
变量以及与之关联的所有文档。它已全部弃用了,如果仔细查看文档,您可能已经使用了几年,或者专门为OpenGL&lt; = 2.x版本设计。而是继续使用您自己的顶点属性并在您自己的制服中设置照明配置,但是您可以根据您想要实现的照明模型。这是更多的工作,但从长远来看它更灵活。
使用glLight
的OpenGL照明模型预先设定可编程着色器管道,并表示在固定功能管道中进行照明的特定方式。
一旦GLSL进入场景,就可以将OpenGL光照模型与着色器结合使用。您可以使用相同的glLight
函数及其相关函数来设置照明参数,然后编写以不同方式使用相同信息的着色器,从而允许逐像素照明计算。
纹理有点模糊,因为OpenGL仍然有纹理模型,许多与纹理相关的GL函数仍然有效,尽管有些已被弃用。但是,任何引用GLSL变量(如gl_Texture)的文档都同样过时了。当前的OpenGL使用采样器对象进行纹理访问。
如果您想确保以“现代”方式进行,请确保创建3.3或更高版本或4.0或更高版本的向前兼容OpenGL配置文件,并确保着色器声明相应的版本号为他们的第一行是这样的:
#version 330
这将导致使用任何弃用的OpenGL函数或弃用的着色器变量来生成错误,以便您知道要避免它们。
答案 2 :(得分:1)
当前的图形硬件提供了一个界面来自定义任何渲染步骤,例如顶点着色,Tesselation,几何着色,片段着色等。 GLSL是利用此接口编程或影响图形硬件的渲染步骤的语言。
预定义函数glLight,glTexture等属于不推荐使用的固定函数 opengl的图形管道。现代OpenGL仍支持此固定管道的功能,但强烈建议将GLSL用于不同的渲染步骤。
glLight函数是一个固定函数,它只影响顶点处理。所以你可以实现每个顶点着色,看起来不太逼真。
使用GLSL在片段着色器中自行编程照明时,可以直接影响任何像素。
总而言之,主要优点是程序员更灵活,能够影响各种渲染步骤,这使您能够实现复杂逼真的3D图形。主要缺点是。您需要更多的知识和(GLSL,图形管道)以及更多的编程工作来实现与固定功能相同的结果。
祝你好运