开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2176

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

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

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

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

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

6256

主题

6770

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
1969
威望
30
注册时间
2013-7-29
在线时间
3192 小时
最后登录
2018-4-23

社区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!爱你们么么哒~
回复

使用道具 举报

5熟悉之中
687/1000
排名
3104
昨日变化
3

0

主题

51

帖子

687

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

排名
25951
昨日变化
12

0

主题

39

帖子

88

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

7日久生情
2226/5000
排名
512
昨日变化
2

5

主题

122

帖子

2226

积分

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

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

回复 支持 反对

使用道具 举报

4四处流浪
321/500
排名
9911
昨日变化
3

0

主题

132

帖子

321

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

7日久生情
2412/5000
排名
3467
昨日变化
16

0

主题

1731

帖子

2412

积分

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

UID
219676
好友
0
蛮牛币
2301
威望
0
注册时间
2017-7-12
在线时间
311 小时
最后登录
2018-4-23

活力之星

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

回复

使用道具 举报

7日久生情
1725/5000
排名
2309
昨日变化

8

主题

722

帖子

1725

积分

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

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

回复

使用道具 举报

6蛮牛粉丝
1225/1500
排名
1182
昨日变化
4

11

主题

56

帖子

1225

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

7日久生情
1637/5000
排名
3086
昨日变化
2

1

主题

847

帖子

1637

积分

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

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

回复

使用道具 举报

7日久生情
1810/5000
排名
1249
昨日变化
3

1

主题

563

帖子

1810

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
934/1000
排名
2938
昨日变化
2

0

主题

247

帖子

934

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

4四处流浪
314/500
排名
7242
昨日变化

0

主题

106

帖子

314

积分

Rank: 4

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

回复

使用道具 举报

4四处流浪
485/500
排名
4693
昨日变化
1

5

主题

58

帖子

485

积分

Rank: 4

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

回复

使用道具 举报

6蛮牛粉丝
1009/1500
排名
8206
昨日变化
90

0

主题

758

帖子

1009

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

5熟悉之中
701/1000
排名
6272
昨日变化
2

0

主题

376

帖子

701

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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