我知道在编写GLSL时,着色器能够访问那些GL内部变量,例如
glNormal gl_NormalMatrix gl_ModelViewMatrix gl_Vertex
等
作为着色器中的统一数据。
但是,在使用这些GL内部变量时遇到了问题。例如,我假设我的着色器需要访问gl_ModelViewMatrix,在我的C代码中,我需要调用
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
但似乎像NVidia NSight这样的调试器不喜欢我的程序调用glMatrixMode(),而gDEDebugger将此函数标记为已弃用的函数。通过在我的代码中使用此函数将使NSight调试器无法调试着色器代码,因为它稍后仅支持openGL 4.x.与glNoraml类似,我假设如果我在着色器中使用它,那么我需要调用
glBegin()
glNormal3f();
glEnd();
我相信后来的openGL标准也将glBegin()/ glEnd()视为已弃用的函数。那么,是不是意味着我不应该在着色器中使用那些内部状态变量?或者还有另一种方法可以在C代码中初始化它?
我想编写跨平台友好的着色器代码,并且能够在没有太多修改的情况下在OpenGL,OpenGL ES和WebGL上运行。