游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2258

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

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

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

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

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

6569

主题

7087

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
8331
威望
30
注册时间
2013-7-29
在线时间
3368 小时
最后登录
2018-7-17

社区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熟悉之中
852/1000
排名
2495
昨日变化
11

0

主题

55

帖子

852

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

2初来乍到
126/150
排名
17925
昨日变化
3

0

主题

45

帖子

126

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

7日久生情
2343/5000
排名
487
昨日变化
1

6

主题

134

帖子

2343

积分

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

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

回复 支持 反对

使用道具 举报

4四处流浪
369/500
排名
9150
昨日变化
3

2

主题

144

帖子

369

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

7日久生情
3049/5000
排名
2427
昨日变化
9

0

主题

2080

帖子

3049

积分

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

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

活力之星

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

回复

使用道具 举报

7日久生情
1842/5000
排名
2149
昨日变化
7

8

主题

745

帖子

1842

积分

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

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

回复

使用道具 举报

6蛮牛粉丝
1427/1500
排名
979
昨日变化
1

15

主题

70

帖子

1427

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

7日久生情
1836/5000
排名
2556
昨日变化
1

1

主题

898

帖子

1836

积分

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

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

回复

使用道具 举报

7日久生情
1989/5000
排名
1124
昨日变化
2

1

主题

603

帖子

1989

积分

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

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1211/1500
排名
2427
昨日变化
9

0

主题

333

帖子

1211

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

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

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熟悉之中
606/1000
排名
3945
昨日变化
21

7

主题

72

帖子

606

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1825/5000
排名
4604
昨日变化
22

0

主题

1299

帖子

1825

积分

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

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

回复

使用道具 举报

5熟悉之中
823/1000
排名
5379
昨日变化
6

0

主题

426

帖子

823

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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