求手机游戏X-X factor冠军少女攻略

后使用快捷导航没有帐号?
 论坛入口:
  |   |    |   | 
游戏开发笔记:手机端次时代海水如何实现?
游戏中海水实现后,在商店反响还不错,有人评论说需要增加一个烘焙深度图的工具,想想也有道理,于是就做了一个。原理其实非常简单,就是放一个摄像机照射岛屿,然后用shader将z的值归一化存在贴图中, 然后再将贴图转成png保存。
最重要的部分如下:
Shader &depthShader& {
& & Properties {
& & }
& & SubShader {
& && &&&Pass {
& && && && &CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members pos1)
#pragma exclude_renderers xbox360
& && && && && & #pragma vertex vert
& && && && && & #pragma fragment frag
& && && && && & #include &UnityCG.cginc&
& && && && && & struct appdata {
& && && && && && &&&float4 vertex : POSITION;
& && && && && & };
& && && && && & struct v2f {
& && && && && && &&&half4 pos : SV_POSITION;
& && && && && && &&&float4 depth : TEXCOORD0;
& && && && && & };
& && && && && & v2f vert (appdata v) {
& && && && && && &&&v2
& && && && && && &&&o.pos = UnityObjectToClipPos (v.vertex);
& && && && && && &&&o.depth.x = mul(unity_ObjectToWorld,(v.vertex)).y;
& && && && && && &&&
& && && && && & }
& && && && && & float4 frag(v2f i) : COLOR
& && && && && & {
& && && && && && &&&float d = i.depth.x;
float high = 0;
float low = -2;
float a = (high - d) / (high - low);
& && && && && && &&&return float4(1, 0, 0, a);
& && && && && & }
& && && && &ENDCG
& && &&&}
& & }
}复制代码
非常简单的一个shader,但却非常实用。因为手机上并不支持深度图的直接抓取,所以通过这种方式获取深度图非常适合手机。
而例子我也提供了一个效果对比:
微信图片_50.jpg (58.13 KB, 下载次数: 0)
20&分钟前 上传
微信图片_53.jpg (71.1 KB, 下载次数: 0)
20&分钟前 上传
接下来我会写一个运行时烘焙深度图的水,适用任何场景。
先上最终效果:
我开始思考,有没有可能在牺牲部分性能的情况下实现更加贴近pc端表现的海水。
首先,我们要知道目光射入海水的方向:
float3 worldView = (IN.worldPos - _WorldSpaceCameraPos);复制代码
然后要获得海水的法线:
half4 nmap = (tex2D(_BumpTex, i.worldPos.xz + offset) + tex2D(_BumpTex, half2(-i.worldPos.z, i.worldPos.x) - offset)) * 0.5;复制代码
这里为了让海水有流动的效果,offset随着时间变化,而取法线贴图则是用了xz和z来出里扰动。
有了法线和眼睛视角,就可以根据菲涅尔公式计算点积:
half fresnel = sqrt(1.0 - dot(-normalize(worldView), worldNormal));复制代码
这样就有了初步效果:
微信图片_55.jpg (24.57 KB, 下载次数: 0)
20&分钟前 上传
然后就是海面的高光,我们打算模拟下光照,如下:
half reflectiveFactor = max(0.0, dot(viewdir, reflect(lightDir, worldNormal)));
half shininess = _Strength * 100;
half specularFactor = pow(reflectiveFactor, shininess);
& && && && && &
half diffuseFactor = max(0.0, dot(worldNormal, lightDir));
color = tex2D(_MainTex, i.texcoord);
color.rgb *= diffuseF
color.rgb = _Specular.rgb * specularF复制代码
这里我整理下光照的部分,首先我们理解下光照的方向,可以认为应该是负的xyz,这样才像从上面照下来。
于是我把光照设置成-1,-1,0,而计算物体光照原色的时候,利用法线和光照方向的点积,这里要注意,你需要反向一下光照的方向。而计算高光的时候,则是真的用光线的方向了。
这里还有一个非常有意思的点,就是法线里面存的是物体本身的坐标系,我们法线大部分的法线的值都是Z轴朝向的,但水面肯定是朝y轴的才对,所以这里用了一个小技巧,就是把y和z调换。
经过这样的处理,效果变成了这样:
微信图片_56.jpg (93.23 KB, 下载次数: 0)
20&分钟前 上传
接下来处理海岸的部分,先使用自带的深度图试试:
o.args = ComputeScreenPos(o.pos);
COMPUTE_EYEDEPTH(o.args.z);
half4 foam = (tex2D(_FoamTex, uv1) + tex2D(_FoamTex, uv2)) * 0.5;
half3 worldNormal = (normal.xyz * 2 - 1).
color = tex2D(_MainTex, i.texcoord);
float depth = tex2Dproj(_CameraDepthTexture, i.args).r;
depth = LinearEyeDepth(depth);
depth = depth - i.args.z;
float depth1 = saturate(depth * _Range.x);
float depth2 = saturate(depth * _Range.x * 0.9);复制代码
根据视角看过去的深度,计算出深度差。根据深度差,显示出海岸泡沫的效果。这里有一小技巧,我本来使用depth的时候,发现有泡沫的地方和没有泡沫的地方有很明显的分界线,于是用了两层泡沫,第一层浓,第二层淡,弱化泡沫边界。
效果如下:
微信图片_58.jpg (112.36 KB, 下载次数: 0)
20&分钟前 上传
接下来就是增加光照和深浅变化的控制,这部分就很简单了:
half3 lightDir = _WorldSpaceLightPos0.
& && && && && & // Phong shading model
& && && && && & half reflectiveFactor = max(0.0, dot(viewdir, normalize(reflect(-lightDir, worldNormal)))) * 0.995;
& && && && && & half shininess = _Strength * 200.0;
& && && && && & half specularFactor = pow(reflectiveFactor, shininess);
& && && && && & float deep = 1 - saturate(depth1 * _Range.y);
& && && && && & float4 deepColor = lerp(_Bright, _Dark, deep * 2)* _Range.y;
& && && && && & color.rgb = color.rgb * _Range.z + deepColor * (1 - _Range.z);复制代码
配了一个血海:
微信图片_59.jpg (97.62 KB, 下载次数: 0)
20&分钟前 上传
via:游戏扶持by腾讯游戏学院
关注我们官方微信公众号
下载我们官方APP-游戏行
关注手游动态微信公众号
如何从0到1用Excel实现数值设计?MMORPG职游戏策划入门须知(五)----有哪些干货加餐玩了几百款小游戏之后,我发现它们的赚钱方2018小游戏行业发展报告人才缺口超42万《2018年游戏企业招聘需求及浅析“青黄不接”的腾讯游戏
微信扫一扫关注我们→来源:快科技 责任编辑:阿如
版权免责声明:本微信公众号部分图文分享自互联网。如有侵权,请及时微信告知。3hk.cn 第一时间处理异议。转载3hk.cn原创文章,需注明来源于【本微信号昵称】和作者3hk.cn (无注明来源昵称和作者的,3hk.cn 保留追究责任权利)
点品牌名,或 添加微信号 hkziyouxing 后发品牌名,可看品牌产品报价
香港知名品牌/产品价格表(一般每月更新一次)
更多品牌及其产品不断添加中,欢迎随时查看...
品牌???告合作?? / &&&微信ID:Email:&&&&QQ:&&&&??人:林先生
点攻略名称,或 添加微信号 hkziyouxing 后发关键词,就可看各详细攻略
香港最常见攻略大全(一般每月更新一次)
出入境交通
旅游自由行
wifi上网***
更多攻略主题不断添加中,欢迎随时查看...
阅读 1067&& 13

参考资料

 

随机推荐