我写一个GLSL程序作为玛雅,一个闭源的3D应用程序中运行的插件的一部分。 我的插件定制呈现几何体的应用使得它的默认多边形形状相同的图像缓冲区。 该应用程序使用OpenGL固定管道为它的灯光和阴影,但我使用GLSL渲染定制的几何形状和材料。
我的问题是,我想模仿我的着色固定管道的灯的行为。 应用程序定义的灯光在gl_LightSource
均匀,我希望他们有相同的方向,力度在分配给当分配给应用程序的默认多边形组成,他们有我的自定义形状等。
该gl_LightSource
领域有清楚的记录,但我无法找到的固定管道如何解释这些领域的最终文件。 还有如何编写在GLSL点/定向/射灯的例子很多,但他们似乎并不准确模仿固定管道。 例如,你如何确定一个灯,如果应用程序定义它们的混合点,定向或射灯? 可光类型的混合,而不在我的着色器引入过多的分支处理?
总之,有没有的固定管线如何评估任何明确的文档或示例gl_LightSource
?
我的问题是,我想模仿我的片段着色器固定管道的灯的行为。
那么有你的第一个问题,因为“固定管道灯”中的顶点处理器来实现,而不是每个片段。
总之,有没有的固定管线如何评估gl_LightSource任何明确的文档或例子吗?
是。 这就是所谓的“OpenGL图形系统:规范。” 这是可供下载的OpenGL的登记 ; 你想要的相容性分布。 4.2兼容性规范的第2.13涵盖了所有用于照明的数学。 简单地翻译成GLSL代码。
请注意,你不会要能够准确地模仿固定功能管线。 也就是说,没有办法保证着色器为基础的固定功能之间不变性lighting.You'll得到的东西接近,但不是二进制值相同。
可光类型的混合,而不在我的着色器引入过多的分支处理?
你如何定义“过度”? 你将需要分支,因为OpenGL的光照方程涉及条件逻辑。
这通常就是为什么人们不只是重新实现GL在着色器照明的部分原因。 您可以更有效的,如果你只写GLSL,而不是使用数据驱动的方法。
有在固定功能流水线的实现顶点着色器的一个完整的源代码的OpenGL ES 2.0编程指南 。 (请注意,固定功能流水线只有每顶点照明,所以,不需要用于照明计算片段着色器)。
我相信,OpenGL驱动程序使用这个顶点着色器的内部时,它是在固定的功能模式。 请检查第8章,这本书的顶点着色器。
它定义具有以下属性的光的结构;
- 位置,
- 环境色,
- 漫反射颜色,
- 镜面颜色,
- 现场指挥,
- 衰减因子(恒定的,直链,quaratic),
- 现货指数,
- 现货截止视角,
- ComputeDistanceAttanuation(布尔)
并且,每一个光在功能,lighting_equation()处理。
以下是我想出了基于OpenGL规范文件:
#version 410 compatibility
vec3 incedentLight (in gl_LightSourceParameters light, in vec3 position)
{
if (light.position.w == 0) {
return normalize (-light.position.xyz);
} else {
vec3 offset = position - light.position.xyz;
float distance = length (offset);
vec3 direction = normalize (offset);
float intensity;
if (light.spotCutoff <= 90.) {
float spotCos = dot (direction, normalize (light.spotDirection));
intensity = pow (spotCos, light.spotExponent) *
step (light.spotCosCutoff, spotCos);
} else {
intensity = 1.;
}
intensity /= light.constantAttenuation +
light.linearAttenuation * distance +
light.quadraticAttenuation * distance * distance;
return intensity * direction;
}
}
从我的理解有关GLSL分支应该是合理有效的,因为它仅依赖于统一的变量。