查看: 1894|回复: 21

glsl实现shadow map问题,求助!!!

[复制链接]

该用户从未签到

发表于 2014-9-5 15:21:24 | 显示全部楼层 |阅读模式
用glsl实现shadow map 时出现如图所示的问题,哪位知道应该怎样解决。
模型后方为其深度图,下方是阴影,光源在正上方,不知为何,模型正上方也有阴影,特此求助。

场景图

场景图
QQ截图20140905152006.png

该用户从未签到

发表于 2014-9-5 15:45:47 | 显示全部楼层
GLSL实现的这种阴影的代价很大的,基本上没有实用价值,因为在大多数电脑上,就算你的代码正确也是一运行就全部蹦溃,只有在你自己的电脑上能看。

该用户从未签到

 楼主| 发表于 2014-9-5 16:05:58 | 显示全部楼层
谢谢回复,那我想问下,实现阴影效果怎么弄比较好呢?

该用户从未签到

发表于 2014-9-5 16:08:09 | 显示全部楼层
JayGuo 发表于 2014-9-5 16:05
谢谢回复,那我想问下,实现阴影效果怎么弄比较好呢?

还是用别的办法比较好,如果你在手机上编程,至少是ES2.0,是全面的shader解决方案,就可以用你这种方法,在台式机、笔记本电脑上就出现刚才提到的问题。

该用户从未签到

 楼主| 发表于 2014-9-5 16:11:33 | 显示全部楼层
我是用的台式机,不过在网上看到说shadow map是做游戏中阴影效果的主流,所以想做下试试。看样子您对阴影挺有研究的,我现在是学生,正在学习这方面的东西,能留个QQ号,好向您请教下吗?

该用户从未签到

发表于 2014-9-5 16:14:20 | 显示全部楼层
JayGuo 发表于 2014-9-5 16:11
我是用的台式机,不过在网上看到说shadow map是做游戏中阴影效果的主流,所以想做下试试。看样子您对阴影挺 ...

1178821574

该用户从未签到

发表于 2014-9-5 16:18:11 | 显示全部楼层
论坛上有个锐神做的软件
http://bbs.osgchina.org/forum.ph ... &extra=page%3D1
用到了大量的阴影,效果很棒,但是无法避免以上问题。

该用户从未签到

 楼主| 发表于 2014-9-5 16:29:02 | 显示全部楼层
这个之前看过,真的很厉害,现在刚开始研究这方面,shadow map相对简单些,所以想试着实现下,不过在自阴影方面总有问题,很纠结啊!

该用户从未签到

发表于 2014-9-9 15:53:54 | 显示全部楼层
shadowmap自阴影是很大的问题,但是大场景中确实是只能使用它,如果只是简单地自阴影解决可以添加polygonoffset进行修正

该用户从未签到

 楼主| 发表于 2014-9-10 14:41:46 | 显示全部楼层
float factor = 1.0;
        float units =  1.0;

        osg::ref_ptr<osg:olygonOffset> polygon_offset = new osg::PolygonOffset;
        polygon_offset->setFactor(factor);
        polygon_offset->setUnits(units);
        ss->setAttribute(polygon_offset.get(), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
        ss->setMode(GL_POLYGON_OFFSET_FILL, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);

已经用了,设置了好多参数,都没有变化!

该用户从未签到

发表于 2014-9-10 15:22:20 | 显示全部楼层
JayGuo 发表于 2014-9-10 14:41
float factor = 1.0;
        float units =  1.0;

polygon_offset只在面有重叠的时候可以防止一闪一闪的,这个功能需要显卡硬件支持,只是去除面片模拟的阴影时一闪一闪的问题,本身不会提供阴影的效果。

该用户从未签到

发表于 2014-9-10 15:58:33 | 显示全部楼层
两个参数应该是负值,这样才能将模型的深度拉近

该用户从未签到

 楼主| 发表于 2014-9-10 16:30:15 | 显示全部楼层
负值也尝试过,没有用啊

该用户从未签到

发表于 2014-9-10 17:31:13 | 显示全部楼层
shadowmap的原理就不说了,当然其自身就存在很大的问题。sm产生阴影的原理就是当前渲染点的深度比先前生成的阴影图的对应位置的深度要大。
自阴影就是本来深度应该小的地方却比深度图中的大了,只是这跟帖子中的另一个回复说的是一个问题,当两个面深度一样时会产生一闪一闪的现象,使用polygonoffset可以修正,这个也是这样的工作原理,都是修正深度的~~
polygonoffset需要在完成深度图渲染完成以后,再次渲染场景时使用~
阴影我研究过很长时间 呵呵

该用户从未签到

发表于 2014-9-10 17:43:27 | 显示全部楼层
buaahc 发表于 2014-9-10 17:31
shadowmap的原理就不说了,当然其自身就存在很大的问题。sm产生阴影的原理就是当前渲染点的深度比先前生成 ...

今后多向你这位大神请教问题。

该用户从未签到

 楼主| 发表于 2014-9-10 21:56:12 | 显示全部楼层
buaahc 发表于 2014-9-10 17:31
shadowmap的原理就不说了,当然其自身就存在很大的问题。sm产生阴影的原理就是当前渲染点的深度比先前生成 ...

我想问下,您用Osg实现了SM了吗,效果怎么样啊,能发张图看看吗,我现在正在研究这个,总是出不来正确的效果,您能给点参考意见吗?

该用户从未签到

发表于 2014-9-11 09:15:13 | 显示全部楼层
JayGuo 发表于 2014-9-10 21:56
我想问下,您用Osg实现了SM了吗,效果怎么样啊,能发张图看看吗,我现在正在研究这个,总是出不来正确的 ...

呵呵 osgshadow实现了很多阴影方面的知识~

shadowmap

shadowmap

该用户从未签到

发表于 2014-9-11 09:16:39 | 显示全部楼层
初学OSG一个月 发表于 2014-9-10 17:43
今后多向你这位大神请教问题。

我们都是遇到不会的问题,相互学习,请教谈不上的~~

该用户从未签到

 楼主| 发表于 2014-9-11 09:28:24 | 显示全部楼层
buaahc 发表于 2014-9-11 09:15
呵呵 osgshadow实现了很多阴影方面的知识~

感觉您的效果很不错啊,我的阴影虽然出来了,不过感觉在坐标转换的时候有点乱,您能跟我讲下您的坐标转换吗?

该用户从未签到

发表于 2014-9-11 09:52:56 | 显示全部楼层
你说的坐标转换指的是哪方面的?阴影不存在坐标转换,osg就自带了阴影的例子,你找出来看一下修改一下 就可以了~

该用户从未签到

 楼主| 发表于 2014-9-11 10:21:56 | 显示全部楼层
buaahc 发表于 2014-9-11 09:52
你说的坐标转换指的是哪方面的?阴影不存在坐标转换,osg就自带了阴影的例子,你找出来看一下修改一下 就可 ...

就是不是要把坐标转换到光源坐标系下吗,然后在该坐标系下进行深度值的比较生成阴影,您是怎么进行这个坐标系转换的啊?

该用户从未签到

发表于 2014-9-11 11:02:49 | 显示全部楼层
哦明白你的意思了,osgshadow里面已经实现了所有sm的算法你可以参考一下,你说的是将相机移动到光源位置,进行深度图的渲染,这个有点复杂,简单描述就是设置其视图矩阵(eye center up)和投影矩阵(根据方向性光源或点光源或者聚光灯设置不同的投影矩阵),这个源代码都有,研究一下就行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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