本专栏主要解决一些移动平台上unity shader效果异常的问题。很多情况下我们发现unity中的shader在PC平台效果正常,但是在移动平台上效果不对,或者部分机型效果不对的问题,尤其是低档老年机,作为一款上线游戏难免要支持高中低档大部分机型,但是部分机型(如华为)在渲染方面难免会出现很多奇怪的问题。

最近在做一个小游戏,用到了景深后处理效果,然后发现在一个三星的低端机景深没有效果,在其他机器上效果正常。

这是其他机型正常的效果:

这是三星低端机的效果,景深后处理无效:

于是打开Frame Dugger调试效果正常的机型,发现渲染正常:

这是三星低档机的调试信息:

然后我把景深效果换成bloom效果,在三星低档机跑了下,发现后处理效果是对的。只有景深不对。于是我们看下代码:

下面是bloom的部分代码:

下面是景深的部分代码:

Shader "Hidden/PostProcessing/DepthOfField"
{// SubShader with SM 5.0 support// DX11+, OpenGL 4.3+, OpenGL ES 3.1+AEP, Vulkan, consoles// Gather intrinsics are used to reduce texture sample count.SubShader{Cull Off ZWrite Off ZTest AlwaysPass // 0{Name "CoC Calculation"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragCoC#include "DepthOfField.hlsl"ENDHLSL}Pass // 1{Name "CoC Temporal Filter"HLSLPROGRAM#pragma target 5.0#pragma vertex VertDefault#pragma fragment FragTempFilter#include "DepthOfField.hlsl"ENDHLSL}Pass // 2{Name "Downsample and Prefilter"HLSLPROGRAM#pragma target 5.0#pragma vertex VertDefault#pragma fragment FragPrefilter#include "DepthOfField.hlsl"ENDHLSL}Pass // 3{Name "Bokeh Filter (small)"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragBlur#define KERNEL_SMALL#include "DepthOfField.hlsl"ENDHLSL}Pass // 4{Name "Bokeh Filter (medium)"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragBlur#define KERNEL_MEDIUM#include "DepthOfField.hlsl"ENDHLSL}Pass // 5{Name "Bokeh Filter (large)"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragBlur#define KERNEL_LARGE#include "DepthOfField.hlsl"ENDHLSL}Pass // 6{Name "Bokeh Filter (very large)"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragBlur#define KERNEL_VERYLARGE#include "DepthOfField.hlsl"ENDHLSL}Pass // 7{Name "Postfilter"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragPostBlur#include "DepthOfField.hlsl"ENDHLSL}Pass // 8{Name "Combine"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragCombine#include "DepthOfField.hlsl"ENDHLSL}Pass // 9{Name "Debug Overlay"HLSLPROGRAM#pragma target 3.5#pragma vertex VertDefault#pragma fragment FragDebugOverlay#include "DepthOfField.hlsl"ENDHLSL}}

于是问题就明了了。我们发现景深的shader里每个pass里多了 #pragma target 3.5或#pragma target 5.0。

先看看什么是 #pragma target。

当编写表面着色器或常规shader着色器程序时,HLSL源代码可以编译成不同的“着色器模型”。为了允许使用更现代的GPU功能,您必须使用更高的着色器编译目标。

但是:使用更高的着色器编译目标,可能使着色器不能在旧的GPU或平台上工作。

Unity默认将着色器编译成最低支持目标(2.5);介于DirectX着色器模型2.0和3.0之间。任何着色器如果没有通过 #pragma 为几何体、外壳或域着色器明确的设置函数入口点,都将降低内部着色器的能力要求。这将让着色器在更多的非DX11平台都可以兼容工作。

这儿有一些可支持的着色器模型列表,可以提升一些兼容性(在某些情况下需要更高的平台/GPU):

#pragma target 2.0

#pragma target 2.5(efault)

#pragma target 3.0

#pragma target 3.5(or es3.0)

#pragma target 4.0

#pragma target 4.5(or es3.1)

#pragma target 4.6(oor gl4.1)

#pragma target 5.0

注意所有OpenGL类平台(包括移动平台的)都将会被看作是“SM3.0”。WP8/WinRT 平台(DX11特性级别9.x)被看作是SM2.5。

因为自己项目中自己写的shader一般都是用#pragma target 3.0,在大多数机型基本没出什么问题,所以我把景深shader里#pragma target全改为3.0。

想一下也知道,低端机用#pragma target 5.0的着色器编译目标,编译不通也正常。所以Frame Dugger里我们会发现景深无效的情况下,当前draw call里的pass用的#0,然后ZTest、Zwirte、Cull的属性都是默认的设置,跟我shader里的设置完全不对。因为着色器编译目标太高,此低档机不支持,所以找不到任何一个可以渲染的pass,所以就出问题了。

(一)unity shader在实际项目中出现的问题————unity的后处理插件景深效果在某些低档机(如三星)无效的解决方案相关推荐

  1. 《 Unity Shader 入门精要》 第3章 Unity Shader 基础

    第3章 Unity Shader 基础 3.1 Unity Shader 概述 材质与 Unity Shader 在 Unity 中我们通常需要将材质(Material) 和 Unity Shader ...

  2. unity Shader Lab(cg hlsl glsl)着色器入门教程 以及 vs2019 支持unity shader语法(更新中2019.9.5)

    前言: 如果你对cg glsl hlsl 顶点着色器 片段着色器 表面着色器 固定渲染管线 等等有所疑惑,或是想学会unity的渲染,看这一篇就足够了.另外我博客的shader分类中还有很多shade ...

  3. Vue项目中使用基于pdf.js的vue-pdf插件在pc浏览器下阅览PDF文件

    最近项目中需求为在浏览器上阅览PDF格式的文件,之前没有写过,随即上网查阅,发现大家常使用的为两个插件. 其一是火狐出品的pdf.js,github地址:https://github.com/mozi ...

  4. 在vue项目中使用prismjs(网页代码高亮插件)

    在vue项目中使用prismjs 什么是prismjs prismjs是一款代码高亮美化插件,在一些技术博客类的网站中需要展示代码时,可以使用它类似与markdown的代码块, 官网链接:https: ...

  5. html中购物车小球飞入的效果,vue项目中css3实现加入购物车小球抛物线飞入动画效果...

    学习Vue中在做移动端商城练习项目时,记录css3实现加入购物车抛物线小球飞入动画效果.下面会介绍我在项目中实现抛物运动的简单方法. 知识点:css3动画(抛物线运动).vue动态绑定事件(控制小球出 ...

  6. 【Shader】实验02——后处理实现景深效果

    景深(Depth Of Field),是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围. 而景深效果是指在焦距之外的地方都是模糊的,只有焦距的地方清晰. 通过采样摄像 ...

  7. Unity Shader:雾的数学运算以及在Unity中使用Fog

    文章目录 1,Unity Fog效果图 2,uniform fog均匀雾的数学公式推导 3,Fog在Unity中的应用 4,Unity Fog的源码分析 5,Unity exp fog VS unif ...

  8. PopupWindow在项目中的使用 并指定位置及加入动画效果

    2019独角兽企业重金招聘Python工程师标准>>> 项目做到一期收尾阶段,突然要用到弹出窗口,于是自然而然的就想起了PopupWindow这个组件了,才发现平时用的少,对这个组件 ...

  9. Unity Shader - 故障艺术之 - Glitch Art - Split RGB (分离通道颜色的故障效果)

    文章目录 思路 使用 GGB 查看函数变换情况 参数截图 变化率图 Code Shader 效果 Back Project References 参考:- 高品质后处理:十种故障艺术(Glitch A ...

最新文章

  1. 对于一个人工智能项目如何把模型调整为最好
  2. 分布式事务中间件Fescar—全局写排它锁解读
  3. android 处理鼠标滚轮事件 【转】
  4. 贾扬清谈云原生-让数据湖加速迈入3.0时代
  5. qt qtoolbutton 弹出菜单方向_QT使用教程(三)之安装篇
  6. Google的云计算引擎与持久化存储磁盘PD
  7. hadoop yarn 获取日志_「大数据」「Hadoop」-安装及数据目录
  8. 如何检查PHP数组是关联数组还是顺序数组?
  9. 不能创建对象qmdispatch_ActiveX部件不能创建对象:‘dm.dmsoft',代码:800A01AD
  10. 人脸识别php程序,教你用PHP实现微信小程序人脸识别刷脸登录功能
  11. 解惑好文:移动端H5页面高清多屏适配方案
  12. 解决新版浏览器autoplay不能自动播放的问题
  13. win7+linux双系统安装
  14. 世界经济论坛报告:全方位评估Fintech将如何颠覆金融业竞争格局,包括路径、模式和终局(二)...
  15. DirectX11--教程项目无法编译、运行的解决方法
  16. php上传二进制数据流
  17. 正则表达式\\s+ - 匹配任意空白字符
  18. Java基础编写记事本
  19. windows远程控制mac的步骤
  20. android button属性

热门文章

  1. 关于App自动化执行链接Appium服务包名正确但是报错An unknown server-side error occurred while processing the command
  2. 【设计模式】第6章·建造者模式
  3. 日记 20180114
  4. SAP中几个与计划独立需求PIR相关的表
  5. 斗罗大陆手机动态壁纸下载小舞献祭
  6. oracle运维面试试题,运维面试题
  7. PCL学习笔记(35)——3D物体识别
  8. r.js压缩angular项目,Angular+requirejs+rjs实现初始化http请求数的优化
  9. 标准化考场时钟同步系统推进智能化校园建设
  10. 猎豹全球智库执行院长:中国App出海的三大规律和最具代表的五大垂直品类