• 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 实干树形象 实绩惠民生——“两学一做”特别关注 2019-08-20
  • 曲速引擎:曾被寄予厚望 现遭“一瓢冷水” 2019-08-18
  • 毛泽东说帝国主义都是纸老虎。是有社会基础的 2019-08-07
  • 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 南粤风釆36选7开奖结果: 士郎 Dual Paraboloid Shadow Maps(DPSM)

    14
    回复
    2066
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    排名
    1
    昨日变化

    福建36选7和值走势图 www.00-na.com 8120

    主题

    8678

    帖子

    3万

    积分

    Rank: 16

    UID
    1231
    好友
    186
    蛮牛币
    12619
    威望
    30
    注册时间
    2013-7-29
    在线时间
    4167 小时
    最后登录
    2019-9-12

    活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册帐号

    x
    今天给大家分享的是点光shadow map的绘制方法。
    emm,最古老的点光阴影生成方式是cubemap,这个怎么操作我就略过了,不会的读者也不是这个专栏的目标群体吧?然而这玩意画一个点光的阴影要用6个不同的视口矩阵画6遍不同朝向的shadowmap,明显是令人沮丧的操作,所以就有了今天讲的这玩意儿:Dual paraboloid shadow maps

    什么是Dual paraboloid shadow maps?
    朋友你见过世界地图吗?其实画点光SM的时候和画地图的时候遇到的难题是一样的:由于球面的高斯曲率为正,我们无法在完全无损的状态下把它投影到一个平面上。因而我们的任务就是找到一个较为优质的映射,可以将单位球面上的点坐标转化为平面上的点坐标。
    如下图,是一个凸透镜投影的例子,可以为半球面上的任意一个点找到其对应的二维坐标。如果用这样的投影方式来代替普通的透视投影,则只需要对两个相反的半球分别进行一次绘制就可以完成点光的SM。(存在一张RG32的贴图里还不是美滋滋)。

    下面给出的公式就是该投影变换的结果:

    式中pos为V在light坐标系下已经normalize过的3维坐标(单位方向向量),uv为经过投影映射后的平面坐标。
    前一个版本这里写错了,现已更正。
    推导如下:(1维)
    1. 根据抛物线的性质,反射方向为(0,1)
    2. 设入射方向的反方向,单位化之后为(a,b)
    3. 则入射点处的抛物线法线方向为(a,b+1)
    4. 该抛物线的导数用x坐标表示为-x
    5. 则该抛物线的法线为(x,1)
    6. 故交点x坐标,即投影坐标为a/(b+1)
    分析一下这个映射(这台电脑上没matlab,python又不会...),设为从光源到待变换顶点V的向量,N为第一张shadowmap的投影正方向, 与N的夹角。则实际shadowmap上投影像素的分布与角的关系为:

    横轴为theta,纵轴为像素坐标
    可以看到这个映射整体较为线性,且在接近90度时分配了更多的像素,而且计算量很小??!十分符合需求。
    下面看一下代码实现:
    [AppleScript] 纯文本查看 复制代码
    S_v2f PS_vert(S_a2v i)
    {
    	//获得light space下坐标
    	S_v2f o;
    	o.pos = mul(_Shadow_mat, mul(unity_ObjectToWorld, i.vert));
    
    	//特殊投影变换
    	float z = length(o.pos.xyz);
    	o.pos.xyz = normalize(o.pos.xyz);
    	o.pos.xy /= -o.pos.z + 1;
    
    	//将点投影到uv坐标系
    	o.pos.xy *= 2 * _Shadow_Range;
    	o.pos.z = -z;
    	o.pos = mul(_Shadow_mat2, o.pos);
    
    	return o;
    }

    是不是超简单...都没啥好说的。
    我们来看一下这玩意生成的shadowmap长啥样:

    左下角第二张就是了,RG通道分别存了东西半球的SM,128x128分辨率?;褂械憧犰?。

    Tessellation
    为什么要做tessellation呢,其实也很好理解。不同于普通的正交或是透视投影,直线经过这种特殊投影之后,在uv空间中将不再是直线。



    这样的效应在角大或者物体接近光源时会十分明显,因此我们需要对物体进行细分以确保在uv空间中的投影有足够的段数来近似曲线。


    这时只需要勾选"enable tessellation"选项,boom!SM里Quad的边缘变成了曲线,阴影也回归了正常,美滋滋。

    然后贴一下细分的代码就跑路了:
    [AppleScript] 纯文本查看 复制代码
    S_v2f PS_vert(S_a2v i)
    {
    	S_v2f o;
    
    	o.pos = mul(_Shadow_mat, mul(unity_ObjectToWorld, i.vert));
    
    	float z = length(o.pos.xyz);
    	o.pos.xyz = normalize(o.pos.xyz);
    	o.pos.xy /= -o.pos.z + 1;
    
    	o.pos.xy *= 2 * _Shadow_Range;
    	o.pos.z = -z;
    	o.pos = mul(_Shadow_mat2, o.pos);
    
    	return o;
    }
    
    float4 DS_frag(S_v2f i) : SV_TARGET {
    	return i.pos.z;
    }
    
    struct PS_a2t {
    	float4 vertex : INTERNALTESSPOS;
    	float z : TEXCOORD0;
    };
    
    PS_a2t PS_tessvert(S_a2v i) {
    	PS_a2t o;
    	o.vertex = i.vert;
    	float3 pos = mul(_Shadow_mat, mul(unity_ObjectToWorld, i.vert));
    	float z = max(length(pos),0.0001);//avoid NaN
    	z = 1 - z / _Shadow_Range;
    	o.z = lerp(0, 32, z);
    	return o;
    }
    
    UnityTessellationFactors PS_hsconst(InputPatch<PS_a2t, 3> v) {
    	UnityTessellationFactors o;
    	float4 tf;
    	tf = max(max(v[0].z, v[1].z), v[2].z);
    	o.edge[0] = tf.x;
    	o.edge[1] = tf.y;
    	o.edge[2] = tf.z;
    	o.inside = tf.w;
    	return o;
    }
    
    [UNITY_domain("tri")]
    [UNITY_partitioning("fractional_odd")] //截断在[1,max]范围内,然后取整到下一个奇数整数值
    [UNITY_outputtopology("triangle_cw")] //cw顺时针,ccw逆时针
    [UNITY_patchconstantfunc("PS_hsconst")]
    [UNITY_outputcontrolpoints(3)]
    PS_a2t PS_hs(InputPatch<PS_a2t, 3> v, uint id : SV_OutputControlPointID) {
    	return v[id];
    }
    
    [UNITY_domain("tri")]
    S_a2v PS_ds(UnityTessellationFactors tessFactors, const OutputPatch<PS_a2t, 3> vi, float3 bary : SV_DomainLocation) {
    	S_a2v v;
    
    	v.vert = vi[0].vertex*bary.x + vi[1].vertex*bary.y + vi[2].vertex*bary.z;
    
    	S_v2f o = PS_vert(v);
    	return o;
    }

    哦,值得一提的是,由于硬件插值是线性的,在shadow collection时,如果你在vertex shader里仅传递线性坐标系的坐标(如世界坐标),并将这个特殊投影推迟到pixel shader里执行,就不需要进行细分了,否则同样也必须进行细分。
    最后最后再贴一下对比图:




    知乎@头像是狐狸吗


    7日久生情
    2395/5000
    排名
    1387
    昨日变化

    0

    主题

    743

    帖子

    2395

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    135463
    好友
    0
    蛮牛币
    147
    威望
    0
    注册时间
    2016-1-23
    在线时间
    760 小时
    最后登录
    2019-9-15
    沙发
    2019-1-21 15:27:47 只看该作者
    54654653464235234234324
    7日久生情
    2322/5000
    排名
    2612
    昨日变化

    2

    主题

    1139

    帖子

    2322

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    209046
    好友
    0
    蛮牛币
    3349
    威望
    0
    注册时间
    2017-3-30
    在线时间
    627 小时
    最后登录
    2019-9-12
    板凳
    2019-1-21 16:06:02 只看该作者
    7日久生情
    1612/5000
    排名
    1199
    昨日变化

    0

    主题

    230

    帖子

    1612

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    137070
    好友
    0
    蛮牛币
    3279
    威望
    0
    注册时间
    2016-2-20
    在线时间
    406 小时
    最后登录
    2019-6-15
    地板
    2019-1-21 18:00:40 只看该作者
    感谢楼主分享!
    6蛮牛粉丝
    1056/1500
    排名
    5515
    昨日变化

    0

    主题

    660

    帖子

    1056

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    300432
    好友
    1
    蛮牛币
    1282
    威望
    0
    注册时间
    2018-10-18
    在线时间
    134 小时
    最后登录
    2019-8-21
    5#
    2019-1-22 09:36:59 只看该作者
    6666666666
    7日久生情
    1795/5000
    排名
    1365
    昨日变化

    2

    主题

    162

    帖子

    1795

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    148089
    好友
    0
    蛮牛币
    2670
    威望
    0
    注册时间
    2016-5-10
    在线时间
    723 小时
    最后登录
    2019-9-10
    6#
    2019-1-22 09:50:26 只看该作者
    看起来很厉害,但我表示看不懂,还没达到这个程度
    7日久生情
    2955/5000
    排名
    2230
    昨日变化

    1

    主题

    1924

    帖子

    2955

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    119154
    好友
    0
    蛮牛币
    3315
    威望
    0
    注册时间
    2015-8-21
    在线时间
    400 小时
    最后登录
    2019-9-8
    7#
    2019-1-22 10:15:18 只看该作者
    谢谢楼主大大。
    6蛮牛粉丝
    1466/1500
    排名
    1980
    昨日变化

    0

    主题

    284

    帖子

    1466

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    68040
    好友
    0
    蛮牛币
    2085
    威望
    0
    注册时间
    2015-1-13
    在线时间
    498 小时
    最后登录
    2019-9-12
    8#
    2019-1-23 09:18:27 只看该作者
    这里是真的完全看不懂
    5熟悉之中
    626/1000
    排名
    6838
    昨日变化

    0

    主题

    201

    帖子

    626

    积分

    Rank: 5Rank: 5

    UID
    300324
    好友
    0
    蛮牛币
    343
    威望
    0
    注册时间
    2018-10-17
    在线时间
    231 小时
    最后登录
    2019-9-15
    9#
    2019-1-24 10:30:41 只看该作者
    站长妹纸萌萌哒!
    8常驻蛮牛
    5694/10000
    排名
    1669
    昨日变化

    0

    主题

    4068

    帖子

    5694

    积分

    Rank: 8Rank: 8

    UID
    185339
    好友
    1
    蛮牛币
    3500
    威望
    0
    注册时间
    2016-11-20
    在线时间
    848 小时
    最后登录
    2019-9-12
    10#
    2019-1-28 15:27:51 只看该作者
    {:106:}
    排名
    24129
    昨日变化

    2

    主题

    18

    帖子

    54

    积分

    Rank: 2Rank: 2

    UID
    281743
    好友
    0
    蛮牛币
    125
    威望
    0
    注册时间
    2018-5-18
    在线时间
    12 小时
    最后登录
    2019-2-1
    11#
    2019-1-31 13:10:15 只看该作者
    33333333333333333333333333333
    6蛮牛粉丝
    1191/1500
    排名
    10818
    昨日变化

    3

    主题

    905

    帖子

    1191

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    310426
    好友
    0
    蛮牛币
    1659
    威望
    0
    注册时间
    2019-1-2
    在线时间
    187 小时
    最后登录
    2019-9-12
    12#
    2019-2-1 09:48:11 只看该作者
    {:104:}{:104:}
    5熟悉之中
    511/1000
    排名
    7135
    昨日变化

    4

    主题

    238

    帖子

    511

    积分

    Rank: 5Rank: 5

    UID
    234982
    好友
    0
    蛮牛币
    1180
    威望
    0
    注册时间
    2017-7-30
    在线时间
    99 小时
    最后登录
    2019-8-16
    13#
    2019-2-10 13:34:08 只看该作者
    dddddddddddddddddddddddddddddddddddddddd
    2初来乍到
    139/150
    排名
    19338
    昨日变化

    0

    主题

    50

    帖子

    139

    积分

    Rank: 2Rank: 2

    UID
    131276
    好友
    0
    蛮牛币
    13
    威望
    0
    注册时间
    2015-12-9
    在线时间
    59 小时
    最后登录
    2019-9-3
    14#
    2019-2-11 14:48:33 只看该作者
    实现shadow的 方法的值得学习 可以看出在灯光道路上的效果一直很好的祥子 实现shadow的 方法的值得学习 可以看出在灯光道路上的效果一直很好的祥子实现shadow的 方法的值得学习 可以看出在灯光道路上的效果一直很好的祥子
    排名
    34888
    昨日变化

    0

    主题

    23

    帖子

    46

    积分

    Rank: 1

    UID
    133099
    好友
    0
    蛮牛币
    16
    威望
    0
    注册时间
    2015-12-30
    在线时间
    15 小时
    最后登录
    2019-8-6
    QQ
    15#
    2019-3-13 11:47:39 只看该作者
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 实干树形象 实绩惠民生——“两学一做”特别关注 2019-08-20
  • 曲速引擎:曾被寄予厚望 现遭“一瓢冷水” 2019-08-18
  • 毛泽东说帝国主义都是纸老虎。是有社会基础的 2019-08-07
  • 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 开奖结果 体彩31 选7大星走势图 秒速时时彩怎样赢钱 捕鸟 为什么我刷龙虎流水一直输 沙巴体育有app吗 幸运赛车安卓版下载 p3试机号八卦图 浙江十一选五任选走势图 全国开奖360彩票安全 极速11选5开奖 彩票直通车 欢乐斗地主腾讯 陕西快乐十分精准预测 六合彩官方