1)URP Shader FrameBuffer Fetch Mali Crash
2)Unity模型Lightmap UV相關的疑問
3)動畫上下半身融合問題
4)AnimatorControllerPlayable.PrepareFrame函數在什麼情況下調用
這是第338篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。
UWA社區主頁:community.uwa4d.com
UWA QQ羣:465082844
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被佔用)會出現這種情況。看其他數據的保存方式和官方文檔不匹配,不知道是為什麼?
針對以上問題,有經驗的朋友歡迎轉至社區交流分享:
https://answer.uwa4d.com/question/647056170cb71c66f8a213ac
Animation
Q:動畫上下半身的融合如果在接縫處有旋轉或者位移,動畫會表現怪異的抖動,表現不正確。
在網上找的這兩個動作試的,用的Humanoid,也試過其他的,也有問題。
第一張圖的上半身帶有旋轉,第二張圖的下半身不帶有旋轉,上半身遮罩的兩隻腿,腳下圓盤和兩隻腳的IK。
以前在項目中的處理是混合動畫讓動作修改在腰間不帶旋轉和位移(位移帶不帶忘記了),原先項目動畫用的Generic。
有以下幾點疑問,期待大家的解答。
1. 是不是Unity的多層混合本身就最好避免在混合的接縫處(就像上下半身這種的腰間)“打架”,要不就上下都不動,或者上下半身本就在旋轉或位移是一致的。
2. 對動畫的製作不太懂,如果上一條成立的話,在動畫製作是否可以把一些關鍵的位移旋轉之類的從接縫處抽離到更下一層,保證接縫處的一致,不知道這樣可行不可行。
3. Generic是不是更好一點,在遮罩上可以具體選擇遮罩的骨骼。
4. Generic是不是沒法把動畫裏的XZ位移去掉(Humanoid可以通過不勾選Bake In Pose去除)。
PS:如果勾上Loop Pose,一些循環動畫反而可以去掉,這是沒問題的嗎?
5. Humanoid遮罩下面的IK和腳下圓盤是幹什麼用的。
針對以上問題,有經驗的朋友歡迎轉至社區交流分享:
https://answer.uwa4d.com/question/646e3551279f4105e1cb5433
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
UWA學堂:edu.uwa4d.com
官方技術QQ羣:465082844