新宝娱乐城返水: 士郎 Dual Paraboloid Shadow Maps(DPSM)

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

新宝娱乐城博彩打不开 www.sl6cl.com.cn 7426

主题

7969

帖子

3万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
9347
威望
30
注册时间
2013-7-29
在线时间
3790 小时
最后登录
2019-3-22

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛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日久生情
2205/5000
排名
1393
昨日变化

0

主题

683

帖子

2205

积分

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

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

2

主题

1037

帖子

2028

积分

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

UID
209046
好友
0
蛮牛币
2791
威望
0
注册时间
2017-3-30
在线时间
437 小时
最后登录
2019-3-20
板凳
2019-1-21 16:06:02 只看该作者
[发帖际遇]: sunkai 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜
7日久生情
1541/5000
排名
1198
昨日变化

0

主题

200

帖子

1541

积分

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

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

0

主题

662

帖子

1055

积分

Rank: 6Rank: 6Rank: 6

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

2

主题

151

帖子

1698

积分

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

UID
148089
好友
0
蛮牛币
2695
威望
0
注册时间
2016-5-10
在线时间
637 小时
最后登录
2019-3-22
6#
2019-1-22 09:50:26 只看该作者
看起来很厉害,但我表示看不懂,还没达到这个程度
[发帖际遇]: xyx1985feng 在网吧通宵,花了 3 蛮牛币. 幸运榜 / 衰神榜
7日久生情
2645/5000
排名
2230
昨日变化

1

主题

1680

帖子

2645

积分

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

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

0

主题

259

帖子

1292

积分

Rank: 6Rank: 6Rank: 6

UID
68040
好友
0
蛮牛币
1786
威望
0
注册时间
2015-1-13
在线时间
349 小时
最后登录
2019-3-22
8#
2019-1-23 09:18:27 只看该作者
这里是真的完全看不懂
4四处流浪
499/500
排名
6835
昨日变化

0

主题

191

帖子

499

积分

Rank: 4

UID
300324
好友
0
蛮牛币
119
威望
0
注册时间
2018-10-17
在线时间
115 小时
最后登录
2019-3-20
9#
2019-1-24 10:30:41 只看该作者
站长妹纸萌萌哒!
7日久生情
4681/5000
排名
1669
昨日变化

0

主题

3293

帖子

4681

积分

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

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

2

主题

18

帖子

54

积分

Rank: 2Rank: 2

UID
281743
好友
0
蛮牛币
98
威望
0
注册时间
2018-5-18
在线时间
12 小时
最后登录
2019-2-1
11#
2019-1-31 13:10:15 只看该作者
33333333333333333333333333333
4四处流浪
453/500
排名
10813
昨日变化

2

主题

288

帖子

453

积分

Rank: 4

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

4

主题

232

帖子

501

积分

Rank: 5Rank: 5

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

0

主题

49

帖子

133

积分

Rank: 2Rank: 2

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

0

主题

11

帖子

26

积分

Rank: 1

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

本版积分规则

  • 夏天多吃点凉拌菜 这么吃,让你胃口大开! 2019-03-22
  • 骞垮窞甯傜綉缁滃晢鍝佷氦鏄撲笌鏈嶅姟鐩戠骞冲彴 2019-03-21
  • 外媒称新加坡为“特金会”全力以赴:耗资约2000万新元 2019-03-20
  • 传媒期刊秀:《对外传播》 2019-03-19
  • 构建人类命运共同体的中国智慧 2019-03-18
  • 苏州高新区人民医院:引领实验室自动化,满足“井喷”式检测需求 2019-03-18
  • 父亲节当天 美国第一夫人跟特朗普唱了个反调 2019-03-17
  • 阳泉首次颁布地方实体性法规 两部法规将于7月1日起实施 2019-03-16
  • 诗歌三曹对酒当歌 曹操“篡汉”恶名几度真? 2019-03-15
  • 美国首届“‘一带一路’亚洲商务论坛”即将在堪萨斯州举办 2019-03-15
  • 银川:“互联网+政务”加速“放管服”改革 2019-03-14
  • 【学习时刻】颜晓峰少将:加快把人民军队建设成为世界一流军队的强军纲领 2019-03-14
  • 人民日报评论员:满怀信心走好中国道路 2019-03-13
  • 监督效率高了 办案成本低了 2019-03-12
  • 孕期肥胖和超重  易致女儿性早熟 2019-03-11
  • 70| 238| 532| 107| 775| 211| 164| 803| 31| 957|