【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2438

当前位置:游戏蛮牛 技术专区 开发者专栏

查看: 2701|回复: 38

[士郎] [体渲染]渲染一个球体

[复制链接]  [移动端链接]
排名
1
昨日变化

7418

主题

7961

帖子

3万

积分

Rank: 16

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

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

发表于 2018-3-20 10:25:44 | 显示全部楼层 |阅读模式

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

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

x
7.jpg


最终效果


1.3.gif


思路
  • 这个体渲染并不是投射射线的体渲染。以后会写常规体渲染给大家。
  • 判断射线位置

8.jpg
我们知道视线的角度normalize(u),和 视线和球心的距离u`(_SpherePos - _CameraPos)

通过投影的逆运算,我们能求出视角U未来在球心垂面上的点位置。


即: p = normalize(U) · normalize(U`) * |U|
未来的位置为:视角法向量 点乘 视角和球心的法向量 乘以 视角和球心的模长,推导公式学了投影向量自然就会了,这里不累述。

然后通过对比 p和球心的长度是否小于半径,就可以实现简单的画圆。

  • 求出球面法线向量

9.png

如果要在球体上使用光照模型,必然需要知道法线向量。

我们知道了坐标和半径的比值,通过反sin或者反cos值得到弧度,然后求弧度在π/2的比例就可以得出法向量的差值,进行视角向量和位置向量的插值运算即可。

源代码

[AppleScript] 纯文本查看 复制代码
Shader "QQ/Volume/Sphere"  
{  
    Properties  
    {  
        _Color("Color",Color) = (0.5,0.5,0.5,1)  
        _Radius("radius",Range(0,1)) = 0.4  
        _Smoothness("smoothness",Range(0.1,1)) = 0.5  
  
    }  
        SubShader  
    {  
        Tags { "RenderType" = "Opaque"}  
        LOD 100  
  
        Pass  
        {  
        Tags{  
        "LightMode" = "ForwardBase"  
            }  
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            #include "UnityCG.cginc"  
            uniform fixed4 _Color;  
            uniform float _Radius;  
            uniform float _Smoothness;  
            uniform fixed4 _LightColor0;  
            struct a2v  
            {  
                float4 vertex : POSITION;  
                float3 normal : NORMAL;  
            };  
  
            struct v2f  
            {  
                float4 pos : SV_POSITION;  
                float3 wPos:TEXCOORD0;  
                float3 normal : TEXCOORD1;  
            };  
  
            v2f vert(a2v v)  
            {  
                v2f o;  
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
                o.wPos = mul(unity_ObjectToWorld,v.vertex);  
                o.normal = v.normal;  
                return o;  
            }  
  
            inline float3 ToLocal(float3 pos)  
            {  
                return mul(unity_WorldToObject, float4(pos, 1.0)).xyz;  
            }  
  
            fixed4 frag(v2f i) : SV_Target  
            {  
                fixed4 col;  
                float3 pos = ToLocal(i.wPos);  
                float3 nor = UnityObjectToWorldNormal(i.normal);  
                float _i = length(pos) / _Radius;  
                if (_i > 1)  
                {  
                    float3 camera = ToLocal(_WorldSpaceCameraPos.xyz);  
                    float3 dir = normalize(pos - camera);  
                    float len0 = distance(pos, camera);  
                    float len1 = length(camera) * dot(dir, normalize(-camera));  
                    if (len1 > len0)  
                    {  
                        pos = dir * len1 + camera;  
                        _i = length(pos) / _Radius;  
                        float3 dir0 = normalize(pos);  
                        float3 dir1 = normalize(camera);  
                        nor = UnityObjectToWorldNormal(normalize(lerp(dir1, dir0, asin(_i) / UNITY_PI * 2)));  
                    }  
                }  
                if (_i <= 1)  
                {  
                    float3 wPos = mul(unity_ObjectToWorld, pos);  
                    float LdotN = max(dot(_WorldSpaceLightPos0.xyz, nor), 0);  
                    float3 Half = normalize(normalize(_WorldSpaceLightPos0.xyz) + normalize(_WorldSpaceCameraPos.xyz - wPos));  
                    float spec = pow(max(dot(nor, Half),0), _Smoothness * _Smoothness * 1000);  
                    col = _Color * fixed4(UNITY_LIGHTMODEL_AMBIENT.rgb, 1.0) + (LdotN + spec) * fixed4(_LightColor0.rgb,1.0);  
                }  
                else  
                {  
                    discard;  
                }  
            return col;  
            }  
    ENDCG  
    }  
    }  
}  



知乎@CarefreeQ



跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

6蛮牛粉丝
1109/1500
排名
1935
昨日变化
1

0

主题

57

帖子

1109

积分

Rank: 6Rank: 6Rank: 6

UID
206861
好友
1
蛮牛币
1052
威望
0
注册时间
2017-2-16
在线时间
355 小时
最后登录
2018-12-30
发表于 2018-3-20 11:00:11 | 显示全部楼层
[发帖际遇]: 我还活着 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

回复

使用道具 举报

2初来乍到
137/150
排名
17809
昨日变化
5

0

主题

46

帖子

137

积分

Rank: 2Rank: 2

UID
206945
好友
0
蛮牛币
196
威望
0
注册时间
2017-2-17
在线时间
56 小时
最后登录
2018-11-21
发表于 2018-3-20 11:53:44 | 显示全部楼层
学习了,顶一下

回复

使用道具 举报

7日久生情
2598/5000
排名
474
昨日变化
1

6

主题

179

帖子

2598

积分

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

UID
84820
好友
17
蛮牛币
2692
威望
0
注册时间
2015-3-26
在线时间
861 小时
最后登录
2019-3-20
发表于 2018-3-20 14:51:40 | 显示全部楼层
看着挺牛啊,有注释就好了

回复 支持 反对

使用道具 举报

5熟悉之中
743/1000
排名
4468
昨日变化
1

2

主题

181

帖子

743

积分

Rank: 5Rank: 5

UID
99709
好友
0
蛮牛币
9769
威望
0
注册时间
2015-5-12
在线时间
232 小时
最后登录
2019-3-19
发表于 2018-3-20 15:03:19 | 显示全部楼层
好样的,Shader正好能看懂了,哈哈哈

回复 支持 反对

使用道具 举报

7日久生情
3610/5000
排名
1488
昨日变化
4

0

主题

2132

帖子

3610

积分

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

UID
219676
好友
1
蛮牛币
2917
威望
0
注册时间
2017-7-12
在线时间
626 小时
最后登录
2019-3-20

活力之星

发表于 2018-3-20 15:58:39 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2039/5000
排名
1992
昨日变化
1

8

主题

789

帖子

2039

积分

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

UID
83438
好友
3
蛮牛币
17882
威望
0
注册时间
2015-3-23
在线时间
558 小时
最后登录
2019-3-20
发表于 2018-3-20 15:59:34 | 显示全部楼层
牛叉 佩服

回复

使用道具 举报

7日久生情
1700/5000
排名
815
昨日变化

18

主题

84

帖子

1700

积分

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

UID
165566
好友
0
蛮牛币
3121
威望
0
注册时间
2016-10-8
在线时间
402 小时
最后登录
2019-3-7
发表于 2018-3-20 17:29:30 | 显示全部楼层
谢谢分享
[发帖际遇]: 无敌风火轮 捡了钱没交公 蛮牛币 降了 3 . 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2448/5000
排名
1550
昨日变化
4

1

主题

952

帖子

2448

积分

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

UID
216583
好友
2
蛮牛币
4047
威望
0
注册时间
2017-4-7
在线时间
671 小时
最后登录
2019-3-20

迈向小康

发表于 2018-3-20 17:36:54 | 显示全部楼层
多谢分享

回复

使用道具 举报

7日久生情
2454/5000
排名
786
昨日变化
2

1

主题

685

帖子

2454

积分

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

UID
56496
好友
0
蛮牛币
7565
威望
0
注册时间
2014-11-19
在线时间
554 小时
最后登录
2019-3-20
发表于 2018-3-21 09:39:56 | 显示全部楼层
哇哦,那些数学公式让我膜拜
[发帖际遇]: hsGuy929 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
1690/5000
排名
1664
昨日变化
1

0

主题

406

帖子

1690

积分

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

UID
136635
好友
0
蛮牛币
1768
威望
0
注册时间
2016-2-15
在线时间
506 小时
最后登录
2019-2-19
发表于 2018-3-21 10:28:45 | 显示全部楼层
很好,学习了

回复

使用道具 举报

4四处流浪
318/500
排名
8008
昨日变化
3

0

主题

107

帖子

318

积分

Rank: 4

UID
248343
好友
0
蛮牛币
597
威望
0
注册时间
2017-10-12
在线时间
59 小时
最后登录
2018-5-10
发表于 2018-3-21 10:44:59 | 显示全部楼层
v5v5v5v5v5v5

回复

使用道具 举报

5熟悉之中
726/1000
排名
3722
昨日变化
1

8

主题

80

帖子

726

积分

Rank: 5Rank: 5

UID
224968
好友
0
蛮牛币
912
威望
0
注册时间
2017-6-3
在线时间
227 小时
最后登录
2019-3-13
发表于 2018-3-21 10:49:35 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1917/5000
排名
4498
昨日变化
4

0

主题

1333

帖子

1917

积分

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

UID
267381
好友
6
蛮牛币
3208
威望
0
注册时间
2018-2-1
在线时间
258 小时
最后登录
2018-11-6
发表于 2018-3-21 11:22:54 | 显示全部楼层
谢谢分享
[发帖际遇]: 墨染青天 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
873/1000
排名
5639
昨日变化
2

0

主题

448

帖子

873

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2784
威望
0
注册时间
2016-4-25
在线时间
176 小时
最后登录
2019-3-19
QQ
发表于 2018-3-21 12:56:29 | 显示全部楼层
学习了,谢谢分享,收藏了

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表