共计 6517 个字符,预计需要花费 17 分钟才能阅读完成。
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