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

扫一扫,访问微社区

开发者专栏

关注:2373

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

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2404|回复: 38

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

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

7085

主题

7612

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
11098
威望
30
注册时间
2013-7-29
在线时间
3640 小时
最后登录
2018-12-14

社区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蛮牛粉丝
1107/1500
排名
1865
昨日变化
4

0

主题

57

帖子

1107

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

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

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日久生情
2468/5000
排名
486
昨日变化

6

主题

160

帖子

2468

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
561/1000
排名
5983
昨日变化
2

2

主题

166

帖子

561

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

7日久生情
3434/5000
排名
1702
昨日变化

0

主题

2127

帖子

3434

积分

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

UID
219676
好友
1
蛮牛币
2633
威望
0
注册时间
2017-7-12
在线时间
559 小时
最后登录
2018-12-14

活力之星

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

回复

使用道具 举报

7日久生情
2002/5000
排名
1996
昨日变化

8

主题

787

帖子

2002

积分

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

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

回复

使用道具 举报

7日久生情
1652/5000
排名
802
昨日变化

16

主题

78

帖子

1652

积分

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

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

回复

使用道具 举报

7日久生情
2253/5000
排名
1812
昨日变化
1

1

主题

944

帖子

2253

积分

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

UID
216583
好友
2
蛮牛币
3714
威望
0
注册时间
2017-4-7
在线时间
596 小时
最后登录
2018-12-14
发表于 2018-3-20 17:36:54 | 显示全部楼层
多谢分享

回复

使用道具 举报

7日久生情
2330/5000
排名
868
昨日变化
2

1

主题

675

帖子

2330

积分

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

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

回复 支持 反对

使用道具 举报

7日久生情
1617/5000
排名
1739
昨日变化

0

主题

398

帖子

1617

积分

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

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

回复

使用道具 举报

4四处流浪
318/500
排名
7795
昨日变化
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熟悉之中
716/1000
排名
3652
昨日变化

8

主题

79

帖子

716

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1917/5000
排名
4351
昨日变化
1

0

主题

1335

帖子

1917

积分

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

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

回复

使用道具 举报

5熟悉之中
849/1000
排名
5616
昨日变化

0

主题

438

帖子

849

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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