Unity Shader顶点数据疑问

Unity Shader顶点数据疑问

1)Unity Shader顶点数据疑问
2)Unity 2018发布在iOS 16.3偶尔出现画面不动的问题
3)安卓游戏启动后提示“应用程序异常”


这是第352篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

Rendering

Q:把下面这段Shader代码变成一个材质:

Shader "Unlit/TestShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            // make fog work

            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float4 ase_texcoord1 : TEXCOORD1;
                float4 ase_texcoord2 : TEXCOORD2;
                float4 ase_texcoord3 : TEXCOORD3;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
                float4 ase_texcoord1 : TEXCOORD1;
                float4 ase_texcoord2 : TEXCOORD2;
                float4 ase_texcoord3 : TEXCOORD3;
            };

            sampler2D _MainTex;

            float4 _MainTex_ST;

            v2f vert (appdata v)

            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;//TRANSFORM_TEX(v.uv, _MainTex);
                o.ase_texcoord1 = v.ase_texcoord1;
                o.ase_texcoord2 = v.ase_texcoord2;
                o.ase_texcoord3 = v.ase_texcoord3;
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.ase_texcoord2);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return fixed4(i.ase_texcoord3.x, i.ase_texcoord3.y, 0, 1);
            }
            ENDCG
        }
    }
}

然后随便建一个Plane,把材质赋值上去,预览的效果是这样的:

但问题也就来了,对于这个普通的Plane,它的顶点数据中应该只有Vertex、UV这两个数据。

那多出来的顶点数据按照OpenGL的标准应该是有个默认值,对float4这样对标vec4的,默认值是(0,0,0,1),也就是所有顶点的数据都是一样的。

但从Unity的运行效果来看,似乎左上角的数据变成了(0,1,0,1),右下角变成(1,0,0,1),所以才会有绿色到红色的渐变效果。

所以想问下,对于这些没有顶点数据的顶点属性,在Unity这边是怎么工作的?如果对标到OpenGL,又是怎么操作才能达到Unity的效果?

有人说TEXCOORD1是Lightmap,我为了减少干扰,就把TEXCOORD定义到TEXCOORD3。

A:可以用自己的Plane模型试一下,把多余的顶点属性全去掉,再看是不是黑色的。Unity创建的Plane可能会有属性值,你把它当成一个普通的Plane ,但Unity不一定当成普通的Plane。

感谢李伟@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/625ff027a43e6117d071ce21


Platform

Q:Unity 2018发布在iOS 16.3偶尔出现画面不动的问题。

项目持续时间很长了,还是用的2018版本。随着新iOS系统推出,这种反馈也越来越多,大部分都是出现在iOS 16.3.x。

具体表现是:画面完全不动,也不接收任何输入事件,像是渲染停了,但是逻辑还是正常,还在播放声音,刷怪之类的。

手上的iOS设备重现不了,也就没法调试。不知道是哪一块可能有问题,希望有遇到过的朋友分享经验,不胜感激。

A1:我们之前设计的是每隔一段时间卸载无用的AssetBundle,那时候卡住率(表现如楼主)特别高,后来把这个时间给延长了,频率就降低了好多,怀疑和这个有关系,但是没有实质性定位。

感谢Rhett@UWA问答社区提供了回答

A2:这种情况有可能是Unity的渲染线程被阻塞的原因导致,根本原因是底层C++里面的某一块死循环代码导致,但是引起原因可能是C#本身的代码报错导致,在Editor中排查下NPE或者是其他相关的报错。

感谢Ethan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/64ad14019e99796cd233a4d4


Platform

Q:安卓游戏启动后提示“应用程序异常”。

Unity版本:2018.2.16f1

1. 出现“程序出现异常”后,只能删除应用重新下载安卓,才能解决。

2. 重新下载能正常进入游戏,可能不具体啥时候又出现此类情况,然后重复上面的操作后又能正常。

信息如下:

后来再次上传日志。三星手机,系统版本安卓13,特别容易出现类似的情况。
Unity版本为2018.2.16f1。

A:非法内存地址访问导致的Crash,可以试试把多线程渲染关闭。如果多线程关闭后帧率提不上来,先把Crash问题定位,再想办法做其他优化。多留意一下内存占用方面的数据,看看内存是不是一直在涨,然后Crash。

感谢NG週@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/64181b6e6778221ae301a9a9

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844