查看: 4946|回复: 5

GLSL中多于八个光源如何实现

[复制链接]

该用户从未签到

发表于 2011-8-26 09:13:14 | 显示全部楼层 |阅读模式

shader着色语言中,只给出了顶点着色器中实现

如果想把一致性变量传输给顶点着色器,主程序中应该如何实现呀,多谢了。

顶点着色器中定义如下

struct gl_LightSourceParameters {


vec4 ambient;


vec4 diffuse;


vec4 specular;


vec4 position;


...

};

uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];


这样光源的位置为:gl_LightSource[0].postion

该用户从未签到

发表于 2011-8-29 09:06:38 | 显示全部楼层
着色器中传递大量参数的最好方法是将纹理视为look-up table,否则uniform变量的数目限制会让您步履蹒跚

该用户从未签到

 楼主| 发表于 2011-9-6 16:28:11 | 显示全部楼层
请array再详细说明一下,多谢了,查了一下资料,没有弄明白您是什么意思,如何实现?

该用户从未签到

发表于 2011-9-7 08:24:53 | 显示全部楼层
事实上因为方法很多,所以我也无法提供一种让您一目了然的说明方式。我的意思是传入多个光照参数并且依次作用于每个vertex或者pixel,但是由于uniform变量的限制,您需要考虑用纹理作为查找表来传递参数。另外更通用的方法是deferred lighting,您可以自己google

该用户从未签到

发表于 2012-12-18 10:56:50 | 显示全部楼层
多于8个光源可以分为多个Pass并依次绘制就行了。。。。

该用户从未签到

发表于 2014-6-22 12:35:56 | 显示全部楼层
在新的OpenGL规范里面其实没有光照模型的概念,光照模型是需要你自己通过着色器建立起来。你完全可以通过自定义的uniform变量把你自定义的光照模型一致性变量传到着色器中。光源比较多的情况下,一致性变量会很多,你可以考虑使用Uniform Block 和UniformBufferObject传递参数。在OSG里面都有,你找一下有这个类,osg::UniformBufferObject就是干这个用的。
http://bbs.osgchina.org/forum.php?mod=attachment&aid=NTU4MHw4YmQxYTdmMjk3NzZkZDMwZDczYzU3NDE4MjI4OWEzNXwxNzE0NzA4MTI2&request=yes&_f=.png
2179A03F-6F96-4498-B2C7-E9B43566FF51.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表