1)URP Shader FrameBuffer Fetch Mali Crash
2)Unity模型Lightmap UV相关的疑问
3)动画上下半身融合问题
4)AnimatorControllerPlayable.PrepareFrame函数在什么情况下调用
这是第338篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
Shader
Q:使用FrameBuffer Fetch华为Mali设备编译Shader直接闪退,但是如果把纹理采样去掉就正常了,有遇到过这种问题的嘛?
Unity 2021.3.23
Custom SRP
Device : HUAWEI P40 --- Mali-G76
设备本身支持GL_EXT_shader_framebuffer_fetch。
Shader "unlit/test"
{
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Pass
{
Name "ForwardLit"
Tags {"LightMode" = "UniversalForward"}
HLSLPROGRAM
#define ENABLE_FRAMEBUFFER_FETCH 1
#pragma vertex Vertex
#pragma fragment Fragment
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 texcoord : TEXCOORD0;
half4 color : TEXCOORD2;
UNITY_VERTEX_OUTPUT_STEREO
};
TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);
CBUFFER_START(UnityPerMaterial)
half4 _Color;
CBUFFER_END
Varyings Vertex(Attributes input)
{
Varyings output;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.texcoord = input.texcoord.xyxy;
output.color = input.color;
return output;
}
half4 FragmentInner(Varyings input)
{
half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_LinearClamp, input.texcoord.xy).rgba;
return color * input.color * _Color;
}
void Fragment(Varyings input, inout half4 output : CoLoR0)
{
half4 col = FragmentInner(input);
output.rgb = lerp(output.rgb, col.rgb, col.a); output.a = col.a;
}
ENDHLSL
}
}
}
2023/04/20 19:54:29.555 13797 13846 Debug Unity GL_EXT_debug_marker GL_ARM_rgba8 GL_ARM_mali_shader_binary GL_OES_depth24 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra GL_OES_compressed_paletted_texture GL_OES_compressed_ETC1_RGB8_texture GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_image_external_essl3 GL_OES_EGL_sync GL_OES_texture_npot GL_OES_vertex_half_float GL_OES_required_internalformat GL_OES_vertex_array_object GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV GL_OES_fbo_render_mipmap GL_OES_element_index_uint GL_EXT_shadow_samplers GL_OES_texture_compression_astc GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_hdr GL_KHR_texture_compression_astc_sliced_3d GL_EXT_texture_compression_astc_decode_mode GL_EXT_texture_compression_astc_decode_mode_rgb9e5 GL_KHR_debug GL_EXT_occlusion_query_boolean GL_EXT_disjoint_timer_query GL_EXT_blend_minmax GL_EXT_discard_framebuffer
2023/04/20 19:54:29.555 13797 13846 Debug Unity GL_OES_get_program_binary GL_OES_texture_3D GL_EXT_texture_storage GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_OES_surfaceless_context GL_OES_texture_stencil8 GL_EXT_shader_pixel_local_storage GL_ARM_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_ARM_mali_program_binary GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_texture_sRGB_decode GL_EXT_texture_sRGB_R8 GL_EXT_texture_sRGB_RG8 GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_OES_texture_storage_multisample_2d_array GL_OES_shader_image_atomic GL_EXT_robustness GL_EXT_draw_buffers_indexed GL_OES_draw_buffers_indexed GL_EXT_texture_border_clamp GL_OES_texture_border_clamp GL_EXT_texture_cube_map_array GL_OES_texture_cube_map_array GL_OES_sample_variables GL_OES_sample_shading GL_OES_shader_multisample_interpolation GL_EXT_shader_io_blocks GL_OES_shader_io_blocks GL_EXT_tessellation_shader GL_OES_tessellation_shader GL_EXT_primitive_bounding_box GL_OES_primitive_bounding_
2023/04/20 19:54:29.555 13797 13846 Debug Unity box GL_EXT_geometry_shader GL_OES_geometry_shader GL_ANDROID_extension_pack_es31a GL_EXT_gpu_shader5 GL_OES_gpu_shader5 GL_EXT_texture_buffer GL_OES_texture_buffer GL_EXT_copy_image GL_OES_copy_image GL_EXT_shader_non_constant_global_initializers GL_EXT_color_buffer_half_float GL_EXT_unpack_subimage GL_EXT_color_buffer_float GL_EXT_YUV_target GL_OVR_multiview GL_OVR_multiview2 GL_OVR_multiview_multisampled_render_to_texture GL_KHR_robustness GL_KHR_robust_buffer_access_behavior GL_EXT_draw_elements_base_vertex GL_OES_draw_elements_base_vertex GL_EXT_protected_textures GL_EXT_buffer_storage GL_EXT_external_buffer GL_EXT_EGL_image_array GL_EXT_texture_filter_anisotropic GL_ARM_texture_unnormalized_coordinates GL_HUAWEI_smart_cache GL_EXT_shader_framebuffer_fetch GL_HUAWEI_framebuffer_partial_update
A1:Mali-G76就是不支持Fetch的,可以看一下下面这个博客:https://www.cnblogs.com/minggoddess/p/11471369.html
感谢QyoJWUqeW5Yj@UWA问答社区提供了回答
A2:ARM Mali的芯片不支持GL_EXT_shader_framebuffer_fetch。其实它支持的是ARM_framebuffer_fetch。所以你得为ARM设备单独写代码。
感谢陆旭佳@UWA问答社区提供了回答
Mesh
Q:当前在测试不同画质条件下,切换渲染模型和材质的功能。发现在模型切换后,会出现光照贴图UV对不齐的问题。Unity中的模型Lightmap UV具体是怎么保存在模型数据中的?
现在发现在开启Generate Lightmap UVs时,模型会额外增加一些顶点。暂不确定是否仅有多UV的模型(UV1被占用)会出现这种情况。看其他数据的保存方式和官方文档不匹配,不知道是为什么?
针对以上问题,有经验的朋友欢迎转至社区交流分享:
UWA问答 | 游戏开发者互动问答社区 | 侑虎科技
Animation
Q:动画上下半身的融合如果在接缝处有旋转或者位移,动画会表现怪异的抖动,表现不正确。
在网上找的这两个动作试的,用的Humanoid,也试过其他的,也有问题。
第一张图的上半身带有旋转,第二张图的下半身不带有旋转,上半身遮罩的两只腿,脚下圆盘和两只脚的IK。
以前在项目中的处理是混合动画让动作修改在腰间不带旋转和位移(位移带不带忘记了),原先项目动画用的Generic。
有以下几点疑问,期待大家的解答。
1. 是不是Unity的多层混合本身就最好避免在混合的接缝处(就像上下半身这种的腰间)“打架”,要不就上下都不动,或者上下半身本就在旋转或位移是一致的。
2. 对动画的制作不太懂,如果上一条成立的话,在动画制作是否可以把一些关键的位移旋转之类的从接缝处抽离到更下一层,保证接缝处的一致,不知道这样可行不可行。
3. Generic是不是更好一点,在遮罩上可以具体选择遮罩的骨骼。
4. Generic是不是没法把动画里的XZ位移去掉(Humanoid可以通过不勾选Bake In Pose去除)。
PS:如果勾上Loop Pose,一些循环动画反而可以去掉,这是没问题的吗?
5. Humanoid遮罩下面的IK和脚下圆盘是干什么用的。
针对以上问题,有经验的朋友欢迎转至社区交流分享:
UWA问答 | 游戏开发者互动问答社区 | 侑虎科技
Animation
Q:在进行项目测试的时候,出现Animator的Update次数都还比较少基本稳定在2个左右, 但出现AnimatorControllerPlayable.PrepareFrame最高有出现达80多次,请问AnimatorControllerPlayable.PrepareFrame这个函数是在什么情况下调用?
A:AnimatorControllerPlayable.PrepareFrame函数是在AnimatorControllerPlayable对象即将开始播放新的一帧时调用的。具体来说,它是在Unity的Animator组件中的Update过程中被调用的,而Animator组件在每一帧都会被更新。
在每一帧更新Animator组件时,Animator会检查当前播放的动画是否有变化,如果有,则会更新AnimatorControllerPlayable对象,以便该对象能够播放新的动画。在更新AnimatorControllerPlayable对象之前,Unity会调用AnimatorControllerPlayable.PrepareFrame函数,以便在播放新的动画时为该对象做好准备工作,例如重置其内部状态等。
感谢NG週@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。
UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com