OpenGL遗留功能是否可以在一个程序中与GLSL协同工作?

时间:2016-05-08 01:04:01

标签: opengl

我正在尝试扩展使用OpenGL遗留函数的程序,例如glOrtho,但我想使用GLSL。我可以简单地使用GLSL添加新功能并与旧功能一起使用吗?或者我是否必须将所有这些重建为GLSL着色器的一部分?如果我必须重建它,是否有任何帮助翻译它的备忘单?如果我只是倾向于修改片段着色器,我是否必须重建涉及顶点着色器的函数?

2 个答案:

答案 0 :(得分:2)

如果您有权访问实现固定功能的OpenGL实现,并且您尝试使用着色器,则着色器将替换该固定功能。这是标准的,返回到旧的程序集着色器扩展(ARB_vertex_program等)。

使用顶点着色器会关闭所有固定功能顶点处理。使用片段着色器会关闭所有固定功能片段处理。

话虽如此,它正在取代处理。这与不同。例如:

  

我认为像glOrtho这样的函数实际上是在写一个顶点着色器

你错了。 glOrtho仅将当前矩阵乘以另一个矩阵。它实际上没有进行任何顶点处理;它只是通过顶点处理设置使用的状态。

兼容性GLSL有许多用于访问固定功能状态的内置变量。例如,gl_ProjectionMatrixGL_PROJECTION矩阵的值。因此,如果在矩阵为当前时应用glOrtho,则任何着色器都可以选择通过该变量读取该矩阵。

具有顶点着色器将阻止任何渲染操作根据固定功能处理使用GL_PROJECTION矩阵。但是您的顶点着色器可以选择以使用GL_PROJECTION进行自己的处理。因此,当着色器覆盖固定功能处理时,它不会覆盖固定功能状态

着色器可以通过这些兼容性变量访问很多状态。但是他们无法访问所有渲染状态。光参数,材料参数,雾参数,各种东西。但是着色器无法(通常)访问的是大多数glEnable/Disable开关。想法是你是否使用某种状态是着色器的作用;它是着色器本身的属性。

现在,虽然可以从着色器访问很多每顶点状态,但不是很多每片段状态。雾参数是,但不是纹理环境设置。甚至纹理绑定也必须被视为用户定义的采样器。

答案 1 :(得分:0)

从技术上讲,您可以通过创建兼容性上下文来使用旧版OpenGL。看一下OpenGL文档here。虽然如果您的唯一目的是使用具有glOrtho()等功能的遗留数学库,那么它是不值得的。您应该自己编写或使用第三方,例如glm