当前位置: 首页 > news >正文

Unity3D移动开发如何依据性能选择Shader

前言

在Unity3D移动开发中,选择合适的Shader是非常重要的,它直接影响到游戏的性能和画面效果。本文将介绍如何依据性能选择Shader,并给出相应的技术详解以及代码实现。

   对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

一、了解Shader的基本概念

在Unity3D中,Shader是一种用于控制图形渲染的程序。它可以定义物体的颜色、光照、材质等属性。Shader由一系列的Shader Pass组成,每个Pass定义了一种渲染方式。在移动开发中,我们通常使用的是Surface Shader,它是一种高级Shader,可以方便地定义物体的外观。

二、性能选择Shader的原则

  1. 尽量使用简单的Shader

在移动设备上,性能是一个非常重要的考虑因素。因此,我们应该尽量使用简单的Shader,避免使用过于复杂的计算和纹理。简单的Shader可以提高渲染效率,减少绘制调用次数,从而提高游戏的性能。

  1. 避免使用动态的Shader特性

在移动设备上,动态的Shader特性(如透明度、反射等)会增加额外的计算和内存开销。因此,我们应该尽量避免使用这些特性,或者在性能要求较高的场景中禁用它们。

  1. 使用合适的纹理压缩格式

在移动设备上,纹理的内存占用是一个非常重要的因素。因此,我们应该选择合适的纹理压缩格式,以减少纹理的内存占用。常见的纹理压缩格式有ETC、PVRTC、ASTC等。

  1. 合理使用LOD(Level of Detail)

在移动设备上,LOD是一种非常重要的优化手段。它可以根据物体的距离调整物体的细节级别,从而减少渲染的开销。因此,我们应该合理地使用LOD,尽量减少不必要的细节绘制。

三、技术详解和代码实现

  1. 使用简单的Shader

在Unity3D中,我们可以使用Surface Shader来定义物体的外观。Surface Shader是一种高级Shader,可以方便地定义物体的颜色和光照等属性。下面是一个简单的Surface Shader的示例代码:

Shader "Custom/SimpleShader"
{Properties{_Color("Color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;};sampler2D _MainTex;fixed4 _Color;void surf (Input IN, inout SurfaceOutput o){fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

在这个示例中,我们使用了Lambert光照模型,并定义了一个_Color属性来控制物体的颜色。在surf函数中,我们使用tex2D函数来获取纹理的颜色,并将其乘以_Color属性来计算物体的最终颜色。

  1. 避免使用动态的Shader特性

在移动设备上,动态的Shader特性会增加额外的计算和内存开销。因此,我们应该尽量避免使用这些特性,或者在性能要求较高的场景中禁用它们。下面是一个禁用透明度特性的示例代码:

Shader "Custom/NoAlphaShader"
{Properties{_Color("Color", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;};sampler2D _MainTex;fixed4 _Color;void surf (Input IN, inout SurfaceOutput o){fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;o.Alpha = 1; // 禁用透明度特性}ENDCG}FallBack "Diffuse"
}

在这个示例中,我们将物体的透明度设置为1,从而禁用了透明度特性。

  1. 使用合适的纹理压缩格式

在移动设备上,纹理的内存占用是一个非常重要的因素。因此,我们应该选择合适的纹理压缩格式,以减少纹理的内存占用。下面是一个使用ETC纹理压缩格式的示例代码:

Shader "Custom/ETCShader"
{Properties{_MainTex("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;};sampler2D _MainTex;void surf (Input IN, inout SurfaceOutput o){fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

在这个示例中,我们使用了ETC纹理压缩格式来减少纹理的内存占用。

  1. 合理使用LOD

在移动设备上,LOD是一种非常重要的优化手段。它可以根据物体的距离调整物体的细节级别,从而减少渲染的开销。下面是一个使用LOD的示例代码:

Shader "Custom/LODShader"
{Properties{_MainTex("Texture", 2D) = "white" {}}SubShader{LOD 100Tags { "RenderType"="Opaque" }CGPROGRAM#pragma surface surf Lambertstruct Input{float2 uv_MainTex;};sampler2D _MainTex;void surf (Input IN, inout SurfaceOutput o){fixed4 c = tex2Dlod (_MainTex, float4(IN.uv_MainTex, 0, 0));o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

在这个示例中,我们使用LOD 100来表示在物体距离摄像机超过100个单位时,使用较低的细节级别来渲染物体。

总结

在Unity3D移动开发中,选择合适的Shader是非常重要的。我们可以根据性能要求选择简单的Shader,并避免使用动态的Shader特性。此外,我们还可以选择合适的纹理压缩格式和合理使用LOD来优化游戏的性能。希望本文对您在Unity3D移动开发中选择合适的Shader有所帮助。

 更多教学视频

https://www.bycwedu.com/promotion_channels/1928452950

相关文章:

  • 01-单节点部署clickhouse及简单使用
  • 校验 ChatGPT 4.0 真实性的三个经典问题:快速区分 GPT3.5 与 GPT4,并提供免费测试网站
  • 台球厅桌球室计时计算软件计费方法,台球厅的电脑怎么计时
  • 由于flutter_app依赖于flutter_swiper>=0.0.2,不支持零安全,版本解决失败。
  • 短视频矩阵营销系统工具如何助力商家企业获客?
  • vscode 阅读 android以及kernel 源码
  • Python 中的 Gzip 解压
  • windows内存取证-中等难度-下篇
  • RIP路由配置
  • Adobe After Effects 2024(Ae2024)在新版本中的升级有哪些?
  • 分布式多主关系数据库的底线业务优势
  • NocoDB任意文件读取漏洞复现
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • 1.2 HTML5
  • 【ES专题】ElasticSearch搜索进阶
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • ECMAScript6(0):ES6简明参考手册
  • github指令
  • JavaScript设计模式与开发实践系列之策略模式
  • Laravel 实践之路: 数据库迁移与数据填充
  • Python爬虫--- 1.3 BS4库的解析器
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vim Clutch | 面向脚踏板编程……
  • VuePress 静态网站生成
  • 分布式熔断降级平台aegis
  • 高性能JavaScript阅读简记(三)
  • 聊聊flink的BlobWriter
  • 思维导图—你不知道的JavaScript中卷
  • 用element的upload组件实现多图片上传和压缩
  • 正则与JS中的正则
  • 追踪解析 FutureTask 源码
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • %check_box% in rails :coditions={:has_many , :through}
  • (1)(1.11) SiK Radio v2(一)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (简单) HDU 2612 Find a way,BFS。
  • (一一四)第九章编程练习
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)scrum常见工具列表
  • (转)甲方乙方——赵民谈找工作
  • (转)人的集合论——移山之道
  • .Net 垃圾回收机制原理(二)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net反混淆脱壳工具de4dot的使用
  • .net中的Queue和Stack
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [Contest20180313]灵大会议
  • [dart学习]第四篇:函数
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总