在发布web的时候发现项目里的模型使用Standard Shader没办法做透明度变换(实际上是无法通过代码控制切换Shader的RenderingMode)

问题描述:
在发布web的时候发现项目里的模型使用Standard Shader没办法做透明度变换(实际上是无法通过代码控制切换Shader的RenderingMode)

解决过程:
首先发布在在web上查看运行日志,发现并无报错,通过咨询得知,这个问题是unity自身的bug,不会报错,谢斯的处理方式是通过替换材质球实现替换新的shader,后面我也同意最笨办法就是替换 shader,不过我先去写了一个 demo 进行测试研究,经测试这种方法可行。但是,可以预想到,这种做法在材质球数量很多的情况下需要大量的时间去寻找对应的材质球并且复制新的材质球,再实现替换,这种做法无疑是非常低效的,不符合我们程序员的作风。
同时尝试了另一种思路直接在编辑器中事先将材质球的renderingMode切换为fade,事先将alpha值调整为1,直接代码修改alpha值,这就避免去web冲切换mode的操作,经测试这种做法可行,可是,这种做法依旧有些问题,首先也得对大量材质进行修改,效率低下,(虽然可以写editor脚本修改),而且fade模式下模型图像的呈现表现得很奇怪。通过查询资料得知:Unity首先试图绘制距离摄像机最近的物体,这是对重叠几何绘制最有效的方法。不幸的是它对半透明物体失效了。
为了确定几何图形的绘制顺序,Unity使用了物体的中心位置。这对于相距很远的小物体来说很有效。但是对于较大物体,或者是紧靠在一起的平面物体,它就不好使了。在这种情况下,当你改变视角时,绘制顺序会突然变化。这可能会导致重叠的半透明物体外观的突然变化。
如下图所示,仅仅稍稍移动视角渲染层级就发生了变化
以下是测试结果

在这里插入图片描述在这里插入图片描述

看来最为高效得做法还是直接代码修改RenderMode了,那么为什么在pc上可以正常切换RenderingMode而到了web上就不行了呢?是我们在web上调用修改RenderingMode的api和pc端的不一致吗,我登上github查询官方的UnityCsReference对比百度查询来的api,发现我的调用方法是和官方的是一致的,说明调用方法没问题,是其他的原因,在这结合组长提示:
假设我是一个 unity 官方开发者,我为了让 unity 使用的人更多,我得写好引擎webgl 版本如果体积太大,肯定没人想用,我得做一些优化,包括 pc 版,我也要做一些裁剪,还有就是我们发现 shader 要用到了才会影响编译的速度,另外 Unity 这个引擎是通用引擎,就算每个平台渲染方式不一样,unity 应该也要想办法封装成一样的。
我门在平时我们自己发布包的时候,会考虑压缩体积的大小,通过分析可以猜测,web开发一个重要的点就是包得体积要尽可能得小,那么开发人员必然要裁切掉一些用不到得资源,那么会不会unity认为这个shader是用不到得。于是顺着这个思路去查询,果然,查询得知我们需要将standard shader强制加入打包得选项之中
在这里插入图片描述
打包果然成功。
可是伴随而来得问题是发布包得体积加了将近一倍,在第二天听听组长说在用 CEMU 模拟器玩塞尔达的时候,发现网上的安装包里面有一个预编译 shader 包丢进去才能玩,还有就是最新版本的 shader 是实时编译的,我走到了什么场景就编译这个场景里面能看到的 shader,综合得知,shader 肯定可以裁剪,因为shader 的类型太多,一个场景里面有上千个 shader,而不是所有的都会用上,所有模拟器做成了走到哪就编译到哪,晚上回去之后仔细思考是否一直我都进入了一个误区认为standard shader是一个不可分割得整体,实际上是可以分割得,如果可以分割打包发布,如何做,才能让unity知道我需要fade模式得StandardShader, 没错,就是使用他,我建立了一个简单得cube加上了使用了standardShader的材质将RenderingMode预先切换成fade,再将他隐藏,如此一来Unity就必须要给我把StandardShader的Fade模式一并给我打包。打包之后首先能看到发布包的体积明显比之前小了太多,然后测试也证实了我的猜想,Fade模式下的Shader被打包进来了,项目可以随意的切换为Fade模式了。

研究结果:
只需要在场景里使用到fade模式的标准材质就可以了

通过这次研究说明了:
1.Unity 虽然是一个闭源引擎,但是我们可以通过阅读 C# 开源部分的代码,去找官方怎么实现的
2.我们也可以通过其他软件的渲染方法,猜测 Unity 可能是如何进行渲染的
3. 开发 Unity 引擎的程序员也是普通人类,他们思考的脑回路我们也可以猜测到
4.网上的代码不靠谱,我们需要结合自己的思想,去阅读和判断,多搜索一些博客
5.实现一个目标总是有多个方法,而最好的方法往往需要自己去仔细思考才能得到。在今后我们开发中遇到了困难,首先要学会分析问题,找到切入点,而不要一味寻求别人的帮助,提升自己独立解决问题、独立思考的能力对自己的发展有着十分重要的作用,自己想出来的东西总是印象最为深刻、最有成就感的。

以下是研究过程中查询资料的衔接:
https://forum.unity.com/threads/problems-creating-fadeable-material-within-webgl.573784/
[https://blog.csdn.net/yaoyutian/article/details/72462147]
[https://docs.unity3d.com/Manual/MaterialsAccessingViaScript.html]
[https://blog.csdn.net/yaoyutian/article/details/72462147]
[https://github.com/Unity-Technologies/UnityCsReference/]
[https://zhuanlan.zhihu.com/p/113779799]

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity的Universal Render Pipeline(URP)确实支持透明材质Shader。 在URP中,我们可以使用URP的内置SRP(Scriptable Render Pipeline)来创建自定义的着色器,以满足透明材质的需求。 使用URP,我们可以在Shader代码中添加透明度的计算逻辑,以控制材质透明程度。例如,在片段着色器中,我们可以通过修改Alpha通道的值来实现透明效果。我们也可以在顶点着色器中根据需要计算透明度。 此外,URP还提供了一些内置的透明材质着色器,在创建新的材质时可以直接使用。这些内置的着色器已经针对URP进行了优化,可以在透明材质中提供良好的渲染效果。 在使用URP的过程中,我们可以通过添加透明材质材质属性来调整材质透明度。这些属性可以在Unity Editor中进行调整,方便我们在创建和调试透明材质时进行实时预览。 需要注意的是,透明材质的渲染需要消耗更多的计算资源,因为在渲染过程中需要进行混合计算。因此,在使用透明材质时,我们需要合理地控制透明度使用,以避免过度使用透明效果导致性能下降。 总之,Unity的URP确实支持透明材质Shader,并提供了多种方法来实现和调整透明材质的效果。 ### 回答2: 是的,Unity URP(Universal Render Pipeline)支持透明材质Shader透明材质Shader是一种用于渲染半透明透明物体的Shader。URP提供了一套预设的Shader和渲染管线,其中包含了透明材质Shader,使得开发者可以在URP下创建透明效果。 使用透明材质Shader,您可以为对象设置不同的透明度,实现不同程度的半透明透明效果。透明材质Shader可以用于渲染玻璃、水、烟雾、云等效果,以及各种需要透明度的场景。 在URP中,透明材质Shader的设置相对简单,您可以通过在材质属性中设置透明度透明模式来调整材质透明效果。透明度值越低,物体越不透明透明模式可以选择多种不同的选项,如混合、剪切等,用以适应不同的渲染需求。 URP的透明材质Shader还支持其他一些功能,例如透明投影、透明遮挡剔除等。这些功能可以提高透明效果的真实感和准确性,使得渲染结果更加精细和逼真。 总的来说,Unity URP对透明材质Shader的支持使得开发者可以轻松地实现各种透明效果,并且提供了一系列功能来优化和增强透明渲染效果,让游戏和应用的画面更加出色。 ### 回答3: Unity URP(Universal Render Pipeline)是Unity引擎的一个渲染管线,它支持透明材质Shader透明材质在游戏开发中非常常见,例如用来实现玻璃、水面、烟雾、火焰等效果。Unity URP提供了强大的渲染功能和灵活的材质系统,可以轻松实现透明材质的效果。 在Unity URP中,我们可以使用自定义的Shader来创建透明材质,或者使用引擎自带的Shader来快速实现透明材质。这些Shader主要包括标准表面着色器(Standard Surface Shader)和通用着色器(Unlit Shader)。 标准表面着色器(Standard Surface Shader)是Unity URP中最为常用的Shader之一,它使用了基于物理的渲染模型,可以实现透明材质透明效果。通过调整透明度属性(Alpha)和透明模式(Alpha Mode),我们可以控制材质透明度透明合成方式。 通用着色器(Unlit Shader)是一种简单而灵活的Shader,不基于物理的渲染模型。我们可以在这个Shader使用AlphaTest模式实现透明材质的效果。通过设置透明度的阈值,素材中像素的透明度高于该阈值时可见,低于该阈值时被剔除。 除了以上两种常用的ShaderUnity URP还提供了其他各种不同类型的Shader来满足开发者的需求。无论是选择使用自定义Shader还是引擎预置的ShaderUnity URP都支持透明材质的创建和渲染。 总之,Unity URP提供了丰富的Shader选项,支持透明材质的创建和渲染。开发者可以根据自己的需求选择适合的Shader来实现透明效果,并通过调整透明度透明模式等属性来控制材质透明度和合成方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值