Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程

这篇具有很好参考价值的文章主要介绍了Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023.05.01 写的记录


先拿到 有问题的 vertex shader, fragment shader 分析

vertex shader - raw

#version 320 es

#define HLSLCC_ENABLE_UNIFORM_BUFFERS 1
#if HLSLCC_ENABLE_UNIFORM_BUFFERS
#define UNITY_UNIFORM
#else
#define UNITY_UNIFORM uniform
#endif
#define UNITY_SUPPORTS_UNIFORM_LOCATION 1
#if UNITY_SUPPORTS_UNIFORM_LOCATION
#define UNITY_LOCATION(x) layout(location = x)
#define UNITY_BINDING(x) layout(binding = x, std140)
#else
#define UNITY_LOCATION(x)
#define UNITY_BINDING(x) layout(std140)
#endif
uniform 	vec3 _WorldSpaceCameraPos;
uniform 	vec4 hlslcc_mtx4x4unity_ObjectToWorld[4];
uniform 	vec4 hlslcc_mtx4x4unity_WorldToObject[4];
uniform 	vec4 unity_WorldTransformParams;
uniform 	vec4 hlslcc_mtx4x4unity_MatrixVP[4];
uniform 	vec4 unity_FogParams;
uniform 	vec4 _MainTex_ST;
uniform 	vec4 _DetailAlbedoMap_ST;
uniform 	mediump float _UVSec;
uniform 	float _Curve_Depth;
uniform 	float _Depth_Divider;
uniform 	vec4 _Cam_Forward;
uniform 	float _Z_Dist_Offset;
in highp vec4 in_POSITION0;
in mediump vec3 in_NORMAL0;
in highp vec2 in_TEXCOORD0;
in highp vec2 in_TEXCOORD1;
in mediump vec4 in_TANGENT0;
out highp vec4 vs_TEXCOORD0;
out highp vec4 vs_TEXCOORD1;
out highp vec4 vs_TEXCOORD2;
out highp vec4 vs_TEXCOORD3;
out highp vec4 vs_TEXCOORD4;
out mediump vec4 vs_TEXCOORD5;
out highp vec4 vs_TEXCOORD7;
out highp vec3 vs_TEXCOORD8;
vec3 u_xlat0;
vec4 u_xlat1;
vec4 u_xlat2;
mediump vec3 u_xlat16_3;
float u_xlat12;
bool u_xlatb12;
void main()
{
    u_xlat0.xyz = in_POSITION0.yyy * hlslcc_mtx4x4unity_ObjectToWorld[1].xyz;
    u_xlat0.xyz = hlslcc_mtx4x4unity_ObjectToWorld[0].xyz * in_POSITION0.xxx + u_xlat0.xyz;
    u_xlat0.xyz = hlslcc_mtx4x4unity_ObjectToWorld[2].xyz * in_POSITION0.zzz + u_xlat0.xyz;
    u_xlat0.xyz = hlslcc_mtx4x4unity_ObjectToWorld[3].xyz * in_POSITION0.www + u_xlat0.xyz;
    u_xlat1.xyz = (-u_xlat0.xyz) + _WorldSpaceCameraPos.xyz;
    u_xlat12 = dot(u_xlat1.xyz, _Cam_Forward.xyz);
    u_xlat12 = u_xlat12 + (-_Z_Dist_Offset);
    u_xlat12 = max(u_xlat12, 0.0);
    u_xlat12 = u_xlat12 * u_xlat12;
    u_xlat1.x = _Depth_Divider * (-_Curve_Depth);
    u_xlat1.y = u_xlat12 * u_xlat1.x;
    u_xlat1.x = float(0.0);
    u_xlat1.z = float(0.0);
    u_xlat0.xyz = u_xlat0.xyz + u_xlat1.xyz;
    u_xlat1.xyz = u_xlat0.yyy * hlslcc_mtx4x4unity_WorldToObject[1].xyz;
    u_xlat1.xyz = hlslcc_mtx4x4unity_WorldToObject[0].xyz * u_xlat0.xxx + u_xlat1.xyz;
    u_xlat1.xyz = hlslcc_mtx4x4unity_WorldToObject[2].xyz * u_xlat0.zzz + u_xlat1.xyz;
    u_xlat1.xyz = u_xlat1.xyz + hlslcc_mtx4x4unity_WorldToObject[3].xyz;
    u_xlat2 = u_xlat1.yyyy * hlslcc_mtx4x4unity_ObjectToWorld[1];
    u_xlat2 = hlslcc_mtx4x4unity_ObjectToWorld[0] * u_xlat1.xxxx + u_xlat2;
    u_xlat1 = hlslcc_mtx4x4unity_ObjectToWorld[2] * u_xlat1.zzzz + u_xlat2;
    u_xlat1 = u_xlat1 + hlslcc_mtx4x4unity_ObjectToWorld[3];
    u_xlat2 = u_xlat1.yyyy * hlslcc_mtx4x4unity_MatrixVP[1];
    u_xlat2 = hlslcc_mtx4x4unity_MatrixVP[0] * u_xlat1.xxxx + u_xlat2;
    u_xlat2 = hlslcc_mtx4x4unity_MatrixVP[2] * u_xlat1.zzzz + u_xlat2;
    u_xlat1 = hlslcc_mtx4x4unity_MatrixVP[3] * u_xlat1.wwww + u_xlat2;
    gl_Position = u_xlat1;
    vs_TEXCOORD1.w = u_xlat1.z * unity_FogParams.z + unity_FogParams.w;
#ifdef UNITY_ADRENO_ES3
    u_xlatb12 = !!(_UVSec==0.0);
#else
    u_xlatb12 = _UVSec==0.0;
#endif
    u_xlat1.xy = (bool(u_xlatb12)) ? in_TEXCOORD0.xy : in_TEXCOORD1.xy;
    vs_TEXCOORD0.zw = u_xlat1.xy * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw;
    vs_TEXCOORD0.xy = in_TEXCOORD0.xy * _MainTex_ST.xy + _MainTex_ST.zw;
    vs_TEXCOORD1.xyz = u_xlat0.xyz + (-_WorldSpaceCameraPos.xyz);
    vs_TEXCOORD8.xyz = u_xlat0.xyz;
    u_xlat0.xyz = in_TANGENT0.yyy * hlslcc_mtx4x4unity_ObjectToWorld[1].xyz;
    u_xlat0.xyz = hlslcc_mtx4x4unity_ObjectToWorld[0].xyz * in_TANGENT0.xxx + u_xlat0.xyz;
    u_xlat0.xyz = hlslcc_mtx4x4unity_ObjectToWorld[2].xyz * in_TANGENT0.zzz + u_xlat0.xyz;
    u_xlat12 = dot(u_xlat0.xyz, u_xlat0.xyz);
    u_xlat12 = inversesqrt(u_xlat12);
    u_xlat0.xyz = vec3(u_xlat12) * u_xlat0.xyz;
    vs_TEXCOORD2.xyz = u_xlat0.xyz;
    vs_TEXCOORD2.w = 0.0;
    u_xlat1.x = dot(in_NORMAL0.xyz, hlslcc_mtx4x4unity_WorldToObject[0].xyz);
    u_xlat1.y = dot(in_NORMAL0.xyz, hlslcc_mtx4x4unity_WorldToObject[1].xyz);
    u_xlat1.z = dot(in_NORMAL0.xyz, hlslcc_mtx4x4unity_WorldToObject[2].xyz);
    u_xlat12 = dot(u_xlat1.xyz, u_xlat1.xyz);
    u_xlat12 = inversesqrt(u_xlat12);
    u_xlat1.xyz = vec3(u_xlat12) * u_xlat1.xyz;
    u_xlat16_3.xyz = u_xlat0.yzx * u_xlat1.zxy;
    u_xlat16_3.xyz = u_xlat1.yzx * u_xlat0.zxy + (-u_xlat16_3.xyz);
    vs_TEXCOORD4.xyz = u_xlat1.xyz;
    u_xlat0.x = in_TANGENT0.w * unity_WorldTransformParams.w;
    u_xlat16_3.xyz = u_xlat0.xxx * u_xlat16_3.xyz;
    vs_TEXCOORD3.xyz = u_xlat16_3.xyz;
    vs_TEXCOORD3.w = 0.0;
    vs_TEXCOORD4.w = 0.0;
    vs_TEXCOORD5 = vec4(0.0, 0.0, 0.0, 0.0);
    vs_TEXCOORD7 = vec4(0.0, 0.0, 0.0, 0.0);
    return;
}

fragment shader - raw

#version 320 es
#ifdef GL_EXT_shader_texture_lod
#extension GL_EXT_shader_texture_lod : enable
#endif

precision highp float;
precision highp int;
#define HLSLCC_ENABLE_UNIFORM_BUFFERS 1
#if HLSLCC_ENABLE_UNIFORM_BUFFERS
#define UNITY_UNIFORM
#else
#define UNITY_UNIFORM uniform
#endif
#define UNITY_SUPPORTS_UNIFORM_LOCATION 1
#if UNITY_SUPPORTS_UNIFORM_LOCATION
#define UNITY_LOCATION(x) layout(location = x)
#define UNITY_BINDING(x) layout(binding = x, std140)
#else
#define UNITY_LOCATION(x)
#define UNITY_BINDING(x) layout(std140)
#endif
uniform 	vec3 _WorldSpaceCameraPos;
uniform 	vec4 _WorldSpaceLightPos0;
uniform 	vec4 hlslcc_mtx4x4unity_WorldToShadow[16];
uniform 	mediump vec4 _LightShadowData;
uniform 	vec4 unity_ShadowFadeCenterAndType;
uniform 	vec4 hlslcc_mtx4x4unity_MatrixV[4];
uniform 	mediump vec4 unity_FogColor;
uniform 	mediump vec4 unity_SpecCube0_HDR;
uniform 	mediump vec4 _LightColor0;
uniform 	mediump vec4 _Color;
uniform 	mediump float _BumpScale;
uniform 	mediump float _Metallic;
uniform 	float _Glossiness;
uniform 	mediump float _OcclusionStrength;
uniform 	float _MainTex_mipmapBias;
uniform 	float _BumpMap_mipmapBias;
UNITY_LOCATION(0) uniform mediump sampler2D _MRATTex;
UNITY_LOCATION(1) uniform mediump sampler2D _MainTex;
UNITY_LOCATION(2) uniform mediump sampler2D _BumpMap;
UNITY_LOCATION(3) uniform mediump samplerCube unity_SpecCube0;
UNITY_LOCATION(4) uniform highp sampler2D _ShadowMapTexture;
UNITY_LOCATION(5) uniform highp sampler2DShadow hlslcc_zcmp_ShadowMapTexture;
in highp vec4 vs_TEXCOORD0;
in highp vec4 vs_TEXCOORD1;
in highp vec4 vs_TEXCOORD2;
in highp vec4 vs_TEXCOORD3;
in highp vec4 vs_TEXCOORD4;
in highp vec3 vs_TEXCOORD8;
layout(location = 0) out mediump vec4 SV_Target0;
vec3 u_xlat0;
mediump vec3 u_xlat16_0;
mediump vec4 u_xlat16_1;
mediump vec4 u_xlat16_2;
vec4 u_xlat3;
mediump vec4 u_xlat16_3;
vec4 u_xlat4;
mediump vec4 u_xlat16_5;
mediump vec3 u_xlat16_6;
vec3 u_xlat7;
mediump float u_xlat16_9;
vec3 u_xlat10;
float u_xlat14;
mediump float u_xlat16_16;
float u_xlat17;
float u_xlat21;
mediump float u_xlat16_22;
float u_xlat25;
void main()
{
    u_xlat16_0.xyz = texture(_BumpMap, vs_TEXCOORD0.xy, _BumpMap_mipmapBias).xyz;
    u_xlat16_1.xyz = u_xlat16_0.xyz * vec3(2.0, 2.0, 2.0) + vec3(-1.0, -1.0, -1.0);
    u_xlat16_1.xy = u_xlat16_1.xy * vec2(_BumpScale);
    u_xlat16_2.xyz = u_xlat16_1.yyy * vs_TEXCOORD3.xyz;
    u_xlat16_1.xyw = vs_TEXCOORD2.xyz * u_xlat16_1.xxx + u_xlat16_2.xyz;
    u_xlat16_1.xyz = vs_TEXCOORD4.xyz * u_xlat16_1.zzz + u_xlat16_1.xyw;
    u_xlat0.x = dot(u_xlat16_1.xyz, u_xlat16_1.xyz);
    u_xlat0.x = inversesqrt(u_xlat0.x);
    u_xlat0.xyz = u_xlat0.xxx * u_xlat16_1.xyz;
    u_xlat21 = dot(vs_TEXCOORD1.xyz, vs_TEXCOORD1.xyz);
    u_xlat21 = inversesqrt(u_xlat21);
    u_xlat3.xyz = vec3(u_xlat21) * vs_TEXCOORD1.xyz;
    u_xlat4.xyz = (-vs_TEXCOORD1.xyz) * vec3(u_xlat21) + _WorldSpaceLightPos0.xyz;
    u_xlat16_1.x = dot(u_xlat3.xyz, u_xlat0.xyz);
    u_xlat16_1.x = u_xlat16_1.x + u_xlat16_1.x;
    u_xlat16_1.xyz = u_xlat0.xyz * (-u_xlat16_1.xxx) + u_xlat3.xyz;
    u_xlat21 = dot(u_xlat0.xyz, (-u_xlat3.xyz));
#ifdef UNITY_ADRENO_ES3
    u_xlat21 = min(max(u_xlat21, 0.0), 1.0);
#else
    u_xlat21 = clamp(u_xlat21, 0.0, 1.0);
#endif
    u_xlat16_22 = (-u_xlat21) + 1.0;
    u_xlat16_22 = u_xlat16_22 * u_xlat16_22;
    u_xlat16_22 = u_xlat16_22 * u_xlat16_22;
    u_xlat16_3.xyz = texture(_MRATTex, vs_TEXCOORD0.xy).xyz;
    u_xlat21 = (-_Glossiness) * u_xlat16_3.y + 1.0;
    u_xlat16_2.xy = (-vec2(u_xlat21)) * vec2(0.699999988, 0.0799999982) + vec2(1.70000005, 0.600000024);
    u_xlat16_2.x = u_xlat21 * u_xlat16_2.x;
    u_xlat16_2.x = u_xlat16_2.x * 6.0;
    u_xlat16_5 = textureLod(unity_SpecCube0, u_xlat16_1.xyz, u_xlat16_2.x);
    u_xlat16_1.x = u_xlat16_5.w + -1.0;
    u_xlat16_1.x = unity_SpecCube0_HDR.w * u_xlat16_1.x + 1.0;
    u_xlat16_1.x = log2(u_xlat16_1.x);
    u_xlat16_1.x = u_xlat16_1.x * unity_SpecCube0_HDR.y;
    u_xlat16_1.x = exp2(u_xlat16_1.x);
    u_xlat16_1.x = u_xlat16_1.x * unity_SpecCube0_HDR.x;
    u_xlat16_1.xyz = u_xlat16_5.xyz * u_xlat16_1.xxx;
    u_xlat16_2.x = u_xlat16_3.z + -1.0;
    u_xlat16_2.x = _OcclusionStrength * u_xlat16_2.x + 1.0;
    u_xlat16_1.xyz = u_xlat16_1.xyz * u_xlat16_2.xxx;
    u_xlat17 = u_xlat21 * u_xlat21;
    u_xlat16_2.x = u_xlat21 * u_xlat17;
    u_xlat21 = u_xlat21 * u_xlat21 + 0.5;
    u_xlat16_2.x = (-u_xlat16_2.x) * u_xlat16_2.y + 1.0;
    u_xlat16_1.xyz = u_xlat16_1.xyz * u_xlat16_2.xxx;
    u_xlat16_2.x = u_xlat16_3.x * _Metallic;
    u_xlat16_9 = (-u_xlat16_2.x) * 0.959999979 + 0.959999979;
    u_xlat16_16 = (-u_xlat16_9) + 1.0;
    u_xlat16_16 = _Glossiness * u_xlat16_3.y + u_xlat16_16;
#ifdef UNITY_ADRENO_ES3
    u_xlat16_16 = min(max(u_xlat16_16, 0.0), 1.0);
#else
    u_xlat16_16 = clamp(u_xlat16_16, 0.0, 1.0);
#endif
    u_xlat16_3.xyw = texture(_MainTex, vs_TEXCOORD0.xy, _MainTex_mipmapBias).xyz;
    u_xlat16_6.xyz = _Color.xyz * u_xlat16_3.xyw + vec3(-0.0399999991, -0.0399999991, -0.0399999991);
    u_xlat3.xyw = u_xlat16_3.xyw * _Color.xyz;
    u_xlat16_6.xyz = u_xlat16_2.xxx * u_xlat16_6.xyz + vec3(0.0399999991, 0.0399999991, 0.0399999991);
    u_xlat16_2.xzw = vec3(u_xlat16_16) + (-u_xlat16_6.xyz);
    u_xlat16_2.xzw = vec3(u_xlat16_22) * u_xlat16_2.xzw + u_xlat16_6.xyz;
    u_xlat16_1.xyz = u_xlat16_1.xyz * u_xlat16_2.xzw;
    u_xlat25 = dot(u_xlat4.xyz, u_xlat4.xyz);
    u_xlat25 = max(u_xlat25, 0.00100000005);
    u_xlat25 = inversesqrt(u_xlat25);
    u_xlat4.xyz = vec3(u_xlat25) * u_xlat4.xyz;
    u_xlat4.w = dot(_WorldSpaceLightPos0.xyz, u_xlat4.xyz);
#ifdef UNITY_ADRENO_ES3
    u_xlat4.w = min(max(u_xlat4.w, 0.0), 1.0);
#else
    u_xlat4.w = clamp(u_xlat4.w, 0.0, 1.0);
#endif
    u_xlat4.x = dot(u_xlat0.xyz, u_xlat4.xyz);
#ifdef UNITY_ADRENO_ES3
    u_xlat4.x = min(max(u_xlat4.x, 0.0), 1.0);
#else
    u_xlat4.x = clamp(u_xlat4.x, 0.0, 1.0);
#endif
    u_xlat0.x = dot(u_xlat0.xyz, _WorldSpaceLightPos0.xyz);
#ifdef UNITY_ADRENO_ES3
    u_xlat0.x = min(max(u_xlat0.x, 0.0), 1.0);
#else
    u_xlat0.x = clamp(u_xlat0.x, 0.0, 1.0);
#endif
    u_xlat7.xy = u_xlat4.xw * u_xlat4.xw;
    u_xlat14 = max(u_xlat7.y, 0.100000001);
    u_xlat14 = u_xlat21 * u_xlat14;
    u_xlat21 = u_xlat17 * u_xlat17 + -1.0;
    u_xlat17 = u_xlat17 * u_xlat17;
    u_xlat7.x = u_xlat7.x * u_xlat21 + 1.00001001;
    u_xlat7.x = u_xlat7.x * u_xlat7.x;
    u_xlat7.x = u_xlat7.x * u_xlat14;
    u_xlat7.x = u_xlat7.x * 4.0;
    u_xlat7.x = u_xlat17 / u_xlat7.x;
    u_xlat7.x = u_xlat7.x + -9.99999975e-05;
    u_xlat7.x = max(u_xlat7.x, 0.0);
    u_xlat7.x = min(u_xlat7.x, 100.0);
    u_xlat7.xyz = u_xlat16_6.xyz * u_xlat7.xxx;
    u_xlat7.xyz = u_xlat3.xyw * vec3(u_xlat16_9) + u_xlat7.xyz;
    u_xlat3.xyz = vs_TEXCOORD8.xyz + (-unity_ShadowFadeCenterAndType.xyz);
    u_xlat3.x = dot(u_xlat3.xyz, u_xlat3.xyz);
    u_xlat3.x = sqrt(u_xlat3.x);
    u_xlat10.xyz = (-vs_TEXCOORD8.xyz) + _WorldSpaceCameraPos.xyz;
    u_xlat4.x = hlslcc_mtx4x4unity_MatrixV[0].z;
    u_xlat4.y = hlslcc_mtx4x4unity_MatrixV[1].z;
    u_xlat4.z = hlslcc_mtx4x4unity_MatrixV[2].z;
    u_xlat10.x = dot(u_xlat10.xyz, u_xlat4.xyz);
    u_xlat3.x = (-u_xlat10.x) + u_xlat3.x;
    u_xlat3.x = unity_ShadowFadeCenterAndType.w * u_xlat3.x + u_xlat10.x;
    u_xlat3.x = u_xlat3.x * _LightShadowData.z + _LightShadowData.w;
#ifdef UNITY_ADRENO_ES3
    u_xlat3.x = min(max(u_xlat3.x, 0.0), 1.0);
#else
    u_xlat3.x = clamp(u_xlat3.x, 0.0, 1.0);
#endif
    u_xlat10.xyz = vs_TEXCOORD8.yyy * hlslcc_mtx4x4unity_WorldToShadow[1].xyz;
    u_xlat10.xyz = hlslcc_mtx4x4unity_WorldToShadow[0].xyz * vs_TEXCOORD8.xxx + u_xlat10.xyz;
    u_xlat10.xyz = hlslcc_mtx4x4unity_WorldToShadow[2].xyz * vs_TEXCOORD8.zzz + u_xlat10.xyz;
    u_xlat10.xyz = u_xlat10.xyz + hlslcc_mtx4x4unity_WorldToShadow[3].xyz;
    vec3 txVec0 = vec3(u_xlat10.xy,u_xlat10.z);
    u_xlat10.x = textureLod(hlslcc_zcmp_ShadowMapTexture, txVec0, 0.0);
    u_xlat16_22 = (-_LightShadowData.x) + 1.0;
    u_xlat16_22 = u_xlat10.x * u_xlat16_22 + _LightShadowData.x;
    u_xlat16_2.x = (-u_xlat16_22) + 1.0;
    u_xlat16_22 = u_xlat3.x * u_xlat16_2.x + u_xlat16_22;
    u_xlat16_2.xyz = vec3(u_xlat16_22) * _LightColor0.xyz;
    u_xlat7.xyz = u_xlat7.xyz * u_xlat16_2.xyz;
    u_xlat0.xyz = u_xlat7.xyz * u_xlat0.xxx + u_xlat16_1.xyz;
    u_xlat0.xyz = u_xlat0.xyz + (-unity_FogColor.xyz);
    u_xlat21 = vs_TEXCOORD1.w;
#ifdef UNITY_ADRENO_ES3
    u_xlat21 = min(max(u_xlat21, 0.0), 1.0);
#else
    u_xlat21 = clamp(u_xlat21, 0.0, 1.0);
#endif
    u_xlat0.xyz = vec3(u_xlat21) * u_xlat0.xyz + unity_FogColor.xyz;
    SV_Target0.xyz = u_xlat0.xyz;
    SV_Target0.w = 1.0;
    return;
}

调试RDC的shader准备选项 - remote - 不要选local

选择:remote 还是 local是关键,因为 会影响 shader 指令的结果

当你打开 rdc 文件的时候, render doc 会提示使用

  • remote 当前连接的目标设备作为解释执行的主体
  • local 本地电脑来做为执行主体

如果你的抓帧数据是 移动真机设备,那么你保存下来的 rdc 再后续重新加载到 render doc 时,可以真机联调

你要确保:rdc当时抓帧时的 真机上是同一个: 数据设备

如果你的抓帧数据就是这台电脑 的 PC game,直接 local 就好


先查看 texture, sampler, ubo 数据

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:输出原始的法线数据

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:输出原始法线0~1=>-1~1,并应用法线强度的法线

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:输出世界坐标下的法线

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:输出view

首先在 vs 中 vs_TEXCOORD1 值的代码可以看得出来,xyz = view dir, w = fogFactor

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:未知数值1

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试: UNITY_ADRENO_ES3 宏分支

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:metallic, glossiness, ao

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:unity_SpecCube0

本身是黑色的
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

采样出来结果必定 黑色的
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

从之前的 UBO 数据可以查看到:unity_SpecCube0_HDR : float4(1.0, 1.0, 0.0, 0.0)
正常来说,如果有正常的 cube 这个 hdr 解码数值不会是这个值
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常
unity_SpecCube0 解码部分的代码,如果不了解算法原理,则可读性不高
我们可以从 unity builtin shader 中着手查看

  1. 先搜索: unity_SpecCube0_HDR,貌似只有传入到 probeHDR[0] 中,待后续使用
    Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

  2. 那么再搜索 probeHDR,可以得知,只有 Unity_GlossyEnviroment 引用了
    Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

  3. 那么再搜索 Unity_GlossyEnviroment 后续还有 DecodeHDR 的第二个参数
    Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常
    Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

  4. 那么再搜索 DecodeHDR
    Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

  5. 最终确定了 HDR 解码部分的内容
    Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

输出一下
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:又回到 ao

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

ao 应用在 spec cube 0 的采样后的遮蔽强度,ao 值越小,遮蔽越强
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:又回到 glossiness

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试:又回到 metallic + glossiness

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


调试: albedo

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

这代码编译优化之后,可读性会看得让人头皮发麻
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

dot(L, H)
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

dot(N, H)
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

dot(N, L)
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

dot(N, H) 和 glossiness 的拟合应用
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

输出发现可能是有问题的
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常


最终确定问题

hlslcc_zcmp_ShadowMapTexture shadow texture 怎么采样出来都是 全黑色

opengl textureLod 对应 API :textureLod

shadow texture, vec3 重载的那个
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

结果全是黑色,明显是有问题的,但是 textureLod 采样出来为何会有这样的结果,明明 render doc 可以看到就是纯白色的,暂时没看懂
Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常

所以很有可能是因为做 shader 变体优化导致,那么我们可以另起一个 shader 变体文件,然后不需要#define SHADOWS_SCREEN

Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程,unity,renderdoc调试,renderdoc,渲染异常文章来源地址https://www.toymoban.com/news/detail-519527.html

到了这里,关于Unity - 记一次,使用 RenderDoc 调试 渲染 异常 的过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 纯小白新人菜鸟第一次unity VR项目与matlab联动调试过程记录超详细版本2023.3.12

    本人是个超级菜鸟,因为项目需要用到unity、matlab并且实现两者联动,才刚开始接触Unity、Matlab,以前只有一点C/C++和Java基础(好几年前学的,只会加减乘除、连dll是什么都不懂),花了好几天时间根据网上、文献里的各种教程,踩了很多无法言说的小白坑,特此把过程中遇到

    2023年04月22日
    浏览(46)
  • 记一次Linux启动Mysql异常解决

    并没有发现3306数据库端口 service mysqld start systemctl start mysqld.service 都无效,报错 发现是磁盘空间不足。。。 (下图是已经清理过的结果截图) 然后把磁盘的不重要文件直接删除即可 rm -rf * 总结: 第一步看全局端口占用情况 第二步看日志/根据提示命令看信息 其实,在启动My

    2024年02月14日
    浏览(53)
  • 记一次centos 磁盘挂载过程

    最近买了云服务器磁盘,需要挂载,一下就由大猿来记录这次过程。 查看磁盘挂载情况 查看物理硬盘 标记分区 格式化分区 xfs ext4 xfs 和 ext4 区别 在大多数情况下,ext4和xfs都具有较高的性能,可以满足一般的存储需求。 对于大文件读写和吞吐量要求较高的场景,xfs表现更为

    2024年02月14日
    浏览(43)
  • 记一次线上BUG排查过程

    1. 线上遇到一个非常奇怪的bug,为一个用户分配业务线类型后,该用户登录时,提示502,但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志,看是否有error,但日志里边这个接口200正常返回 本地debug,也复现一样问题,在分配角色类型超过22个总数时就报

    2024年02月09日
    浏览(53)
  • 记一次Kafka重复消费解决过程

            起因:车联网项目开发,车辆发生故障需要给三个系统推送消息,故障上报较为频繁,所以为了不阻塞主流程,采用了使用kafka。消费方负责推送并保存推送记录,但在一次压测中发现,实际只发生了10次故障,但是推送记录却有30多条。         问题排查,发现

    2024年02月13日
    浏览(60)
  • 记一次linux复制病毒处理过程

    某天我的阿里云突然发信息告诉我服务器有自变异木马,我用远程工具连接服务器异常卡顿甚至掉线,reboot也不好使.用阿里云的网页控制台会好些,但还是卡,我又用阿里云控制台重启服务器,重启之后发现服务器完全连不上了,ping也ping不通了,我问了客服说可以用救援连接试试,果

    2024年01月24日
    浏览(64)
  • 记一次 stackoverflowerror 线上排查过程

         xxx 日,突然收到线上日志频繁告警 classCastException .从字面上的报警来看,仅仅是类型转换异常,查看细则发现其实是 stackOverFlowError .很多同学面试的时候总会被问到有没有遇到过线上 stackOverFlowError ?有么有遇到栈溢出?具体栈溢出怎么来解决?今天他来了,他带着问题走

    2024年01月23日
    浏览(44)
  • 记一次后台开发面试拷打过程

    开头简单的自我介绍,面试官和我聊了聊天缓解个人紧张状况,然后就让开屏幕共享开视频做题目,做完以后,问了一些问题,就让等通知了,估计是凉了,不过这里且把当时做的笔试题目复盘一下吧!题目是ai做的题解,唉,AI都比我强,比我面试的时候解释的强多了,未来

    2024年02月08日
    浏览(44)
  • 记一次批量更新mysql数据过程

    一、前言 需求背景:mysql数据库中有一个表的数据(600多万)有一个字段的内容需要解密再通过另外一种加密方式进行加密再回存。通过java程序计算完成更新。 二、方案一 一条条计算更新。这里是将手机号解密,在通过另外一种方式回存。 算法步骤: 1、查询需要解密的数

    2024年02月10日
    浏览(36)
  • 记一次 Oracle 下的 SQL 优化过程

    事情是这样的,UAT 环境的测试小伙伴向我扔来一个小 bug,说是一个放大镜的查询很慢,转几分钟才出数据,我立马上开发环境试了一下,很快啊我说😏,放大镜的数据立马就出来了,然后我登录 UAT 环境一看,诶是有些慢😕 ,于是开始了我的排查之旅... 首先我立马拿到了

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包