From 5be2702097ac01a6ca1554ed848d479272ff0857 Mon Sep 17 00:00:00 2001 From: Constantine Rudenko <-> Date: Wed, 7 Aug 2019 21:02:47 +0300 Subject: [PATCH] fix tangent.w (used as sign value to calculate binormal for normal-mapping) --- Code/DQ skinning/DualQuaternionSkinner.cs | 4 +- .../Shaders/Compute/DQBlend.compute | 4 +- .../HackedStandard/HackedStandard.shader | 16 +-- .../Shaders/Material/MinimalSkinning.shader | 117 ------------------ 4 files changed, 12 insertions(+), 129 deletions(-) delete mode 100644 Code/DQ skinning/Shaders/Material/MinimalSkinning.shader diff --git a/Code/DQ skinning/DualQuaternionSkinner.cs b/Code/DQ skinning/DualQuaternionSkinner.cs index 2fe9d52..a4fb414 100644 --- a/Code/DQ skinning/DualQuaternionSkinner.cs +++ b/Code/DQ skinning/DualQuaternionSkinner.cs @@ -92,7 +92,7 @@ passing data to the vertex and fragment shaders is done through RenderTextures layout is as such: rtSkinnedData_1 float4 vertex.xyz, normal.x rtSkinnedData_2 float4 normal.yz, tangent.xy - rtSkinnedData_3 float tangent.z + rtSkinnedData_3 float2 tangent.zw */ RenderTexture rtSkinnedData_1; RenderTexture rtSkinnedData_2; @@ -270,7 +270,7 @@ void SetMesh(Mesh mesh) this.rtSkinnedData_2.Create(); this.shaderDQBlend.SetTexture(this.kernelHandleComputeBoneDQ, "skinned_data_2", this.rtSkinnedData_2); - this.rtSkinnedData_3 = new RenderTexture(textureWidth, textureHeight, 0, RenderTextureFormat.RFloat); + this.rtSkinnedData_3 = new RenderTexture(textureWidth, textureHeight, 0, RenderTextureFormat.RGFloat); this.rtSkinnedData_3.filterMode = FilterMode.Point; this.rtSkinnedData_3.enableRandomWrite = true; this.rtSkinnedData_3.Create(); diff --git a/Code/DQ skinning/Shaders/Compute/DQBlend.compute b/Code/DQ skinning/Shaders/Compute/DQBlend.compute index 49eeaf2..71bdebd 100644 --- a/Code/DQ skinning/Shaders/Compute/DQBlend.compute +++ b/Code/DQ skinning/Shaders/Compute/DQBlend.compute @@ -27,7 +27,7 @@ RWStructuredBuffer vertex_infos; uint textureWidth; RWTexture2D skinned_data_1; RWTexture2D skinned_data_2; -RWTexture2D skinned_data_3; +RWTexture2D skinned_data_3; @@ -84,5 +84,5 @@ void CSMain (uint3 id : SV_DispatchThreadID) skinned_data_1[pos] = float4(vertinfo.position.xyz, vertinfo.normal.x); skinned_data_2[pos] = float4(vertinfo.normal.yz, vertinfo.tangent.xy); - skinned_data_3[pos] = vertinfo.tangent.z; + skinned_data_3[pos] = vertinfo.tangent.zw; } diff --git a/Code/DQ skinning/Shaders/Material/HackedStandard/HackedStandard.shader b/Code/DQ skinning/Shaders/Material/HackedStandard/HackedStandard.shader index 2f65ab7..b82eeb1 100644 --- a/Code/DQ skinning/Shaders/Material/HackedStandard/HackedStandard.shader +++ b/Code/DQ skinning/Shaders/Material/HackedStandard/HackedStandard.shader @@ -165,7 +165,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #ifdef _TANGENT_TO_WORLD v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -292,7 +292,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #ifdef _TANGENT_TO_WORLD v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -395,7 +395,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #if defined(UNITY_STANDARD_USE_SHADOW_UVS) && defined(_PARALLAXMAP) v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -528,7 +528,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #ifdef _TANGENT_TO_WORLD v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -634,7 +634,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #ifdef _TANGENT_TO_WORLD v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -757,7 +757,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #ifdef _TANGENT_TO_WORLD v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -886,7 +886,7 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" #if defined(UNITY_STANDARD_USE_SHADOW_UVS) && defined(_PARALLAXMAP) v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; + v.tangent.zw = data_3.xy; #endif } } @@ -962,4 +962,4 @@ Shader "MadCake/Material/Standard hacked for DQ skinning" FallBack "VertexLit" CustomEditor "StandardShaderGUI" -} +} \ No newline at end of file diff --git a/Code/DQ skinning/Shaders/Material/MinimalSkinning.shader b/Code/DQ skinning/Shaders/Material/MinimalSkinning.shader deleted file mode 100644 index 1f661d1..0000000 --- a/Code/DQ skinning/Shaders/Material/MinimalSkinning.shader +++ /dev/null @@ -1,117 +0,0 @@ -// Upgrade NOTE: upgraded instancing buffer 'Props' to new syntax. - -Shader "MadCake/Material/Minimal skinned shader" { - Properties { - _Color ("Color", Color) = (1,1,1,1) - _MainTex ("Albedo (RGB)", 2D) = "white" {} - _Glossiness ("Smoothness", Range(0,1)) = 0.5 - _Metallic ("Metallic", Range(0,1)) = 0.0 - } - SubShader { - Tags { "RenderType"="Opaque" } - LOD 200 - - CGPROGRAM - // Physically based Standard lighting model, and enable shadows on all light types - #pragma surface surf Standard fullforwardshadows vertex:vert - - #pragma target 5.0 - - struct Input { - float2 uv_MainTex; - float4 color : COLOR; - }; - - sampler2D skinned_data_1; - sampler2D skinned_data_2; - sampler2D skinned_data_3; - uint skinned_tex_height; - uint skinned_tex_width; - bool _DoSkinning; - - //struct appdata_base { - // float4 vertex : POSITION; - // float3 normal : NORMAL; - // float4 texcoord : TEXCOORD0; - // UNITY_VERTEX_INPUT_INSTANCE_ID - //}; - - //struct appdata_tan { - // float4 vertex : POSITION; - // float4 tangent : TANGENT; - // float3 normal : NORMAL; - // float4 texcoord : TEXCOORD0; - // UNITY_VERTEX_INPUT_INSTANCE_ID - //}; - - //struct appdata_full { - // float4 vertex : POSITION; - // float4 tangent : TANGENT; - // float3 normal : NORMAL; - // float4 texcoord : TEXCOORD0; - // float4 texcoord1 : TEXCOORD1; - // float4 texcoord2 : TEXCOORD2; - // float4 texcoord3 : TEXCOORD3; - // fixed4 color : COLOR; - // UNITY_VERTEX_INPUT_INSTANCE_ID - //}; - - struct appdata_minimal_skinning { - float4 vertex : POSITION; - float3 normal : NORMAL; - float4 tangent : TANGENT; - float4 texcoord : TEXCOORD0; - float4 texcoord1 : TEXCOORD1; - float4 texcoord2 : TEXCOORD2; - uint id : SV_VertexID; - }; - - void vert (inout appdata_minimal_skinning v) { - if(_DoSkinning){ - float2 skinned_tex_uv; - - skinned_tex_uv.x = (float(v.id % skinned_tex_width)) / skinned_tex_width; - skinned_tex_uv.y = (float(v.id / skinned_tex_width)) / skinned_tex_height; - - float4 data_1 = tex2Dlod(skinned_data_1, float4(skinned_tex_uv, 0, 0)); - float4 data_2 = tex2Dlod(skinned_data_2, float4(skinned_tex_uv, 0, 0)); - float2 data_3 = tex2Dlod(skinned_data_3, float4(skinned_tex_uv, 0, 0)).xy; - - v.vertex.xyz = data_1.xyz; - v.vertex.w = 1; - - v.normal.x = data_1.w; - v.normal.yz = data_2.xy; - - v.tangent.xy = data_2.zw; - v.tangent.z = data_3.x; - } - } - - sampler2D _MainTex; - - half _Glossiness; - half _Metallic; - fixed4 _Color; - - // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. - // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. - // #pragma instancing_options assumeuniformscaling - UNITY_INSTANCING_BUFFER_START(Props) - // put more per-instance properties here - UNITY_INSTANCING_BUFFER_END(Props) - - void surf (Input IN, inout SurfaceOutputStandard o) { - // Albedo comes from a texture tinted by color - fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; - o.Albedo = c; - // Metallic and smoothness come from slider variables - o.Metallic = _Metallic; - o.Smoothness = _Glossiness; - o.Alpha = 1; - } - - ENDCG - } - FallBack "Diffuse" -}