OpenGL片段着色是如何执行的?

OpenGL片段着色是如何执行的?,opengl,colors,shader,Opengl,Colors,Shader,我在Maya中创建了一个3D对象(并导出为OBJ和MTL文件),我在OGL中创建了一个模型查看器应用程序来查看它。如果我的假设是正确的(你知道他们怎么说假设…),那么因为我没有指定自己的GLSL着色器,OGL应该使用FFP来确定每个像素的片段颜色?这是正确的吗 在我的理解中,FFP必须实现某种默认着色器,因为它能够显示镜面反射高光和反射等。有人能给我一些关于这方面的信息,或者告诉我这种着色是如何完成的吗 我知道材质定义用于设置对象材质的属性,但我不确定如何在不手动指定着色器的情况下在OGL窗口中

我在Maya中创建了一个3D对象(并导出为OBJ和MTL文件),我在OGL中创建了一个模型查看器应用程序来查看它。如果我的假设是正确的(你知道他们怎么说假设…),那么因为我没有指定自己的GLSL着色器,OGL应该使用FFP来确定每个像素的片段颜色?这是正确的吗

在我的理解中,FFP必须实现某种默认着色器,因为它能够显示镜面反射高光和反射等。有人能给我一些关于这方面的信息,或者告诉我这种着色是如何完成的吗


我知道材质定义用于设置对象材质的属性,但我不确定如何在不手动指定着色器的情况下在OGL窗口中显示与材质交互的灯光的最终效果(因此我认为存在一些默认着色器).

对于第三代和更高版本的GPU,您的所有假设都是正确的。只要没有指定自定义着色器,驱动程序就会为GPU提供一个模仿FFP的默认着色器

默认着色器通常实现Phong照明模型,具体细节取决于纹理环境等的设置参数


对于旧一代GPU,固定功能管道是硬连线的。

谢谢!为了这个答案,我已经搜寻了好几天了!我不明白为什么这些信息这么难得到!您使用的OpenGL库(JOGL或LWJGL)是否包含此默认着色器,或者它是否位于其他地方?我还猜测,要模拟Lambert材质,只需关闭GL上下文中的所有镜面反射设置?此默认着色器通常随驱动程序一起提供。与命名相反,OpenGL本身并不是一个库(当然,您可以链接某些库)。它是驱动程序的API,因此驱动程序也负责实现默认值。模拟Lambert材质是通过将材质的GL_镜面反射组件设置为0来实现的。另一方面,OpenGL规范中非常清楚地说明了此信息。也许您可以为我指出此信息的方向?从阅读说明书来看,我觉得很模糊。当当前片段着色器程序对象包括片段着色器时,其片段着色器被视为活动的,并用于处理片段。如果片段着色器程序对象没有片段着色器,或当前没有使用片段着色器程序对象,则片段着色器执行的结果将不确定它似乎没有提到任何关于默认值的内容。也许我找错地方了?再次感谢你的回答!OpenGL将着色器分为两部分:定义完整着色器程序各部分的着色器对象和程序本身。想想整个着色器程序的.obj文件之类的着色器。就像编译一个可执行文件一样,如果一个对象丢失,那么整个可执行文件都是未定义的。您可能还参考了OpenGL4,它确实需要您提供足够的着色器。然而,OpenGL-1.2和OpenGL-2仍然是最常用的。强制默认着色器是在版本2.1和3.1 IIRC之间的某个地方定义的。