Unity Shader顶点数据疑问
- 作者:admin
- /
- 时间:2023年09月05日
- /
- 浏览:1412 次
- /
- 分类:厚积薄发
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