GameDesign 板


LINE

Shader Toy 上, 大部分都是用 Ray Marching 的演算法写的。 https://www.shadertoy.com/ 不懂 Ray Marching 的话, 看那些 code 和看天书差不多。 [Ray Tracing] 3D电脑绘图中,要决定一个 PIXEL 要画甚麽颜色, 我们会模拟一道从假想的摄影机或眼睛射出的光, 通过了一个平面的银幕,最後射中了某个物体。 射到物体後, 我们会知道光线触击了甚麽物体, 与那个点是在空间中的哪个位置。 所以一道光就是有一个位置与一个方向组成的。 Ray Tracing 要计算光线触及点时, 是从光线起始位置, 朝着光线方向每次移动一小段距离, 然後计算新位置与空间中所有物件有无碰撞。 因为每次光线只移动一小段就要重新计算碰撞, 所以这是种效率很差的方法, 因此有了 Ray Marching。 [Ray Marching] 如果我们描述空间中的物件, 是用 “某一点 x 触及到该物件的最小距离 (Distance to the Scene, 以下简称 DTS)” 来表示的话, 那我们每次从任一个点要移动光线时, 就可以不只移动一小段距离, 而是先计算出光线出发点与所有物件的 DTS, 然後移动其中最小的 DTS。 或是说 DTS 就是保证某个距离内, 光线绝对不会碰到任何东西的意思。 因为每次移动光线的距离变长许多, 所以在非极端的情况下, 效率比 Ray Tracing 好非常多。 举例: 一个在 XZ 平面上,高度为 0 的无限宽广的地板, 空间中任何一点 a 与该地板的最小距离一定是 a.y。 一个圆球,中心点在 0,0,0,半径为 R, 空间中任何一点 a 与该圆球的最短距离是 length( a ) – R。 所以,空间中任何一点 a, 触及该空间中所有物件的最小距离是: float DTS( vec3 a ) return min( a.y, length( a ) – R ); 所以假设我有一道光, 从 pos (10, 10, 10) 出发,方向是 dis( -1, -0.5, -1 ), 要计算那个光会击中在哪个点的方法。 for i [0, MAX_STEP] // ds: 离光线出发点最近的物件距离 ds = DTS( pos ) // DS 太小表示撞到东西了 if ds < 0.00001 then break; // 光线可以安全的射 ds 这麽长而不用担心碰到东西 pos = pos + ds * dir // 射了太远都碰不到东西,就别在前进了 if length(pos – (10,10,10)) > 10000.0 then break; 每一个 PIXEL, 或是对每一个 shader 的 UV, 都可以用这样算出触碰的距离, 有了距离当然也能知道触碰的位置 (pos + dir * ds)。 这种计算光线碰撞距离的方法, 就是 Ray Marching [NORMAL (法向量)] 知道距离,接下来要算颜色。 要算颜色,要知道场景灯光位置,还有触碰点的法向量。 法向量就是一个物体中, 任一个点垂直於该平面的单位向量。 要如何计算 f(x) 中,某个点 x 的斜率? 斜率 = f( x + delta ) – f(x) / ( delta ) 用类似的方法就能算法向量了, 真正的算法在 shader toy 看一下就有了, 就五六行。 有了 normal,计算它与光源方向的角度, 角度越大越亮,越小越暗。 [Shadow (阴影)] 当我们有了一个光线触及点 a,要如何知道该点有没有影子呢? 一、计算从光源到该点的 DTS (应该说是光线碰撞距离啦) 二、计算从光源道该点的实际距离 三、如果 DTS < 实际距离, 表示光源在射向该点时,有撞到东西, 所以该点就应该是阴影。 有点无聊的东西, 但如果想抄 shader toy 到 game engine 用, 却不懂这个的话,连想抄作业都抄不起来的。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.228.116.6 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1646277345.A.055.html ※ 编辑: YoshiCasa (61.228.116.6 台湾), 03/03/2022 11:31:44
1F:推 nicetw20xx: 推,感谢解说 03/03 12:36
※ 编辑: YoshiCasa (61.228.116.6 台湾), 03/03/2022 20:02:16
2F:推 coolrobin: 未看先推,感谢分享 03/03 22:04
3F:推 sargent: 推分享,但我不懂,为什麽要分那麽多次呢?真复杂 03/04 13:12
4F:推 grezod: 推 03/06 09:52







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP