我正在尝试扩展使用OpenGL遗留函数的程序,例如glOrtho
,但我想使用GLSL。我可以简单地使用GLSL添加新功能并与旧功能一起使用吗?或者我是否必须将所有这些重建为GLSL着色器的一部分?如果我必须重建它,是否有任何帮助翻译它的备忘单?如果我只是倾向于修改片段着色器,我是否必须重建涉及顶点着色器的函数?
答案 0 :(得分:2)
如果您有权访问实现固定功能的OpenGL实现,并且您尝试使用着色器,则着色器将替换该固定功能。这是标准的,返回到旧的程序集着色器扩展(ARB_vertex_program等)。
使用顶点着色器会关闭所有固定功能顶点处理。使用片段着色器会关闭所有固定功能片段处理。
话虽如此,它正在取代处理。这与州不同。例如:
我认为像glOrtho这样的函数实际上是在写一个顶点着色器
你错了。 glOrtho
仅将当前矩阵乘以另一个矩阵。它实际上没有进行任何顶点处理;它只是通过顶点处理设置使用的状态。
兼容性GLSL有许多用于访问固定功能状态的内置变量。例如,gl_ProjectionMatrix
是GL_PROJECTION
矩阵的值。因此,如果在矩阵为当前时应用glOrtho
,则任何着色器都可以选择通过该变量读取该矩阵。
具有顶点着色器将阻止任何渲染操作根据固定功能处理使用GL_PROJECTION
矩阵。但是您的顶点着色器可以选择以使用GL_PROJECTION
进行自己的处理。因此,当着色器覆盖固定功能处理时,它不会覆盖固定功能状态。
着色器可以通过这些兼容性变量访问很多状态。但是他们无法访问所有渲染状态。光参数,材料参数,雾参数,各种东西。但是着色器无法(通常)访问的是大多数glEnable/Disable
开关。想法是你是否使用某种状态是着色器的作用;它是着色器本身的属性。
现在,虽然可以从着色器访问很多每顶点状态,但不是很多每片段状态。雾参数是,但不是纹理环境设置。甚至纹理绑定也必须被视为用户定义的采样器。
答案 1 :(得分:0)