线性空间下,如何处理GrabTexture显示过亮的情况?

栏目: 编程语言 · 发布时间: 6年前

内容简介:这是第124篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。UWA 问答社区:answer.uwa4d.comUWA QQ群:465082844(仅限技术交流)

这是第124篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com

UWA QQ群:465082844(仅限技术交流)

渲染

Q1:我们的扭曲效果使用了GrabPass,在PC平台和iOS都正常,但是Android平台在不开Bloom的情况下会显示错误,本来是一个很透明的面片,变成了透明度比较低的白片,调试整个Shader之后怀疑是颜色空间的问题,切换回Gamma空间后显示正常。求教下有人遇到过这个问题么,附Shader代码。

Shader "Custom/Effect/Distortion" {
    Properties {
        _TintColor ("Tint Color", Color) = (1.0, 1.0, 1.0, 1.0)
        _Refraction ("Refraction", 2D) = "white" {}
        _RefractionIntensity ("Refraction Intensity", Range(0, 1)) = 1
    }
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }

        GrabPass{ "_GrabTexture" }
        Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off
            Lighting Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma target 3.0
            uniform sampler2D _GrabTexture;
            uniform sampler2D _Refraction; uniform float4 _Refraction_ST;
            uniform float _RefractionIntensity;
            fixed4 _TintColor;
            struct VertexInput {
                float4 vertex : POSITION;
                float2 texcoord0 : TEXCOORD0;
                float4 vertexColor : COLOR;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 vertexColor : COLOR;
                float4 grabPos : TEXCOORD1;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = TRANSFORM_TEX(v.texcoord0, _Refraction);
                o.vertexColor = v.vertexColor;
                o.pos = UnityObjectToClipPos( v.vertex );
                o.grabPos = ComputeGrabScreenPos(o.pos);
                return o;
            }
            fixed4 frag(VertexOutput i) : COLOR {
                float4 _Refraction_var = tex2D(_Refraction, i.uv0);
                float2 sceneUVs = (i.grabPos.xy/i.grabPos.w + (_Refraction_var.rg*i.vertexColor.a*_RefractionIntensity));
                return tex2D(_GrabTexture, sceneUVs);
            }
            ENDCG
        }
    }
}

附注: frag最后强制转线性空间后接近正常return pow(tex2D(_GrabTexture,sceneUVs),2.2)

根据题主提供的代码,我们在红米4X上复现了该问题。的确如题主所预判,跟机型有关,加上pow(color, 2.2)之后看起来似乎正常了。

查阅了相关的官方文档,看到有类似的Bug反馈,这里显示了GLCore修了,估计GLES没有修。

https://issuetracker.unity3d.com/issues/grabpass-matrial-with-grabpass-shader-renders-much-brighter-on-opengl-in-linear

同时,我们又在Unity 2018版本上用红米4X做了测试,发现该问题已解决。建议题主可以尝试用Unity 2018试试。

该回答由UWA提供,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5b6bc0f8339d267d357c6d30

OpenGL

Q2:关于Unity中Graphics API的选择,我曾在UWA问答上看过相关的帖子,但还是有几个相关的疑问:

线性空间下,如何处理GrabTexture显示过亮的情况?

1)像Android,选择里面只有ES2.0和3.0选项,那像上图那样把两者都选了,和勾选Auto有什么区别呢?是不是都是优先ES3.0,然后不行的话就退到ES2.0?

2)康来有说ES2.0的效果会比3.0的效果差一些,我自己改的Unity PBR Shader也遇到2.0的效果比3.0的效果差的情况,抓帧发现是手机上实际的Shader编译版本不一样,想问下同样的Shader(假设都走同样的分支,不因为不同宏定义走不一样的代码),两者编译出来还会有这么大的表现差异吗?

3)关于效率上,Graphics API的选择是只影响GPU方面的效率,不会影响CPU上的效率吧?

学渲染的小彩笔过来抛个破砖引块美玉。

第一个问题,题主的理解是正确的,都是优先ES3.0 然后2.0的。

针对题主的第二个问题:ES3.0引入了新版本的GLSL Shading Language,所以编出来的东西肯定不一样。

另外ES2.0和ES3.0不仅代表了API的变化,也代表了硬件能力的提升。别的不说,ES3.0完全支持了32位浮点数运算,光是这个就足够带来效果上的明显差异。另外,ES2.0要求Depth Buffer至少16Bits,而ES3.0要求支持24Bits和32Bits。

关于第三个问题,因为API的变换,CPU的效率必然会变化,例如VAO,ES3.0支持而ES2.0不支持。

感谢凯奥斯@UWA问答社区提供回答,欢迎大家转至社区进一步交流:

https://answer.uwa4d.com/question/5b6e3d581e88b37d34e652a1

资源管理

Q3:如何生成被4整除的NPOT图集?如何选择一个好的图集划分策略?我们纹理压缩格式选择的是ETC2(Android) + ASTC(iOS),所以只需要图片尺寸被4整除就行了。

现在图集用的是UGUI自带的SpritePacker,生成的图集尺寸默认是POT,会导致部分图集塞不满,空白区域较多,而美术人工调整图集归属是很麻烦的事,所以希望让它生成NPOT+被4整除的图集,这样图集归属可以随便弄,空白都不会很多。但看了下自定义图集打包策略的文档,似乎没有相关的接口开放。

TexturePacker也只能提供被2整除的NPOT图集,所以问问有没有同学实现过类似的系统,给个思路。

另外,再问几个问题:
1)项目中存在不同纹理压缩格式会导致(较大的)性能损失吗? 比如“全部ETC2"和“尽量优先ETC1,不行再ETC2”这两种做法。
2)NPOT现代的实现(比如OpenGLES的NPOT扩展),应该不是自动扩展到POT这种方式吧? 如果是这种方式,NPOT的内存占用就是个坑。
3)NPOT的性能和POT比如何? 能确定的是POT肯定不会比NPOT差,但两者的性能差距Google有一大堆不同的说法。所以这里的问题是在现代(移动)GPU上,需要考虑NPOT和POT的性能差距问题吗?
4)我们之前倾向于照顾美术的习惯,可以的话尽量少约束,所以图集划分上希望做到“美术完全不知情不参与”,这样就会带来图集塞不满的情况。图集划分这一块大家通常是怎么做的?怎样在“图集划分完美”和“开发\维护成本高昂”之间找一个比较好的平衡?我们主要考虑的还是减少工作成本:别花太多时间在这个上面,然后能保证一个还不错的效果就行,不需要完美。

说一下我们项目的图集策略,仅供参考:

1)只允许方图;

2)保证2的n次幂(解决整除4的问题);

3)格式同楼主,但是不同意ETC1和2混用,明显ETC2压缩质量好,速度快;

4)保证ICON和图片的名称确定和规范化,美术不用关心图集,由策划来规划并进行配表,即使图集有改动,只需要修改配表的图集名称即可;

5)图集的规划分为公共和系统图集,但是相关的UI界面都会有图集的引用索引列表,以此来限制美术及策划的使用范围;

6)做项目是一个三方制约的环境,给太多的自由,势必会增加工作和沟通成本,对美术设计进行系统规范的设计是必不可少的。

感谢郑骁@UWA问答社区提供回答

我们目前也是ETC(Android) + ASTC(iOS),但是要求还是POT的,只是开放了非方形的贴图尺寸用于合并的二方连续贴图。UI部分是要求UI使用TexturePacker合并之后的Atlas提交上来,必须是POT的。

关于题主具体的问题,TexturePacker貌似是有编写插件的方法?不知道是否可以通过插件限定导出尺寸是4的倍数,来满足你的需求。

照顾美术的习惯是一个好程序的表现,给题主点赞,但是要注意这部分照顾的成本不要转嫁到性能或者其他职位的身上,否则不如教一下美术,让美术按照规则来制作。

感谢贾伟昊@UWA问答社区提供回答

关于NPOT,可以参考官方文档:

https://docs.unity3d.com/Manual/ImportingTextures.html

关于补充的第二点:

https://answer.uwa4d.com/question/5b4422bbf91024518ab77aed

另外楼主非要用NPOT的图集,当然也没人拦得住你,下面有一个JS写的Pack算法:

https://github.com/jakesgordon/bin-packing

感谢凯奥斯@UWA问答社区提供回答

该问答来自UWA问答社区,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5b67bea7339d267d357c6cd8

动画

Q4:我使用Mecanim将模型导入到Unity时,提示“has translation animation that will be discarded“以及” has sacle animation that will be dscarded”,即某些关节的Scale/Translate动画被丢弃,但是有一部分动画却能正常播放。所以,Mecanim到底是否支持Scale/Translate动画呢?

Mecanim的Humanoid模式是不支持Scale/Translate动画的,如果Scale/Translate动画是必要的,可以切换到Generic模式。另外,部分关节的Scale/Translate动画能正常工作,应该是因为这些关节是非Humanoid关联的(以Generic模式运行的关节)。

该回答由UWA提供,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5b71086c1e88b37d34e652b4

逻辑代码

Q5:PropertyInfo的CanWrite = false,如果这个属性是个List,只能读不能写,要怎么给这个List赋值呢?PropertyInfo.SetValue不行,因为这个属性不能写入,现在想通过List的Add方法添加值,不知道怎么做好,希望大家能给些建议。

题主可以尝试用PropertyInfo.GetValue传入对象,返回值用as关键字转换成List,接着调用Add。(PropertyInfo.GetValue(obj) as List).Add(xxx)。不过这样可能会有问题:如果这个List是每次new出来的,那么依然无法修改对象内部变量。

感谢凯奥斯@UWA问答社区提供回答,欢迎大家转至社区进一步交流:

https://answer.uwa4d.com/question/5b6a47591e88b37d34e65258

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com

官方技术博客:blog.uwa4d.com

官方问答社区:answer.uwa4d.com

官方技术QQ群:465082844(仅限技术交流)


以上所述就是小编给大家介绍的《线性空间下,如何处理GrabTexture显示过亮的情况?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

商业模式新生代

商业模式新生代

亚历山大•奥斯特瓦德 (Alexander Osterwalder)、伊夫•皮尼厄 (Yves Pigneur) / 王帅、毛心宇、严威 / 机械工业出版社 / 2011-8-15 / 88.00元

中文官网:http://www.bizmodel.org 内容简介:当你愉快的看完第一章:商业模式画布,赫然发现这些构成要素全 都交织成一幅清晰的图像在脑海中呈现,它们如何互相影响、如何交互作用全都历历在目。利用商业模式画布分析瑞士银行、Google、Lego、Wii 、Apple等跨国企业,归纳出三种不同的产业 模式,也涵括新近的热门现象免费效应及长尾理论等。在这些有趣的例子中,我们不仅更......一起来看看 《商业模式新生代》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具