NapalmRain Дата: Вс, 08 Июн 2014, 19:21 | Сообщение # 1
Сообщений: 473
Награды:
0
Репутация:
31
Статус: Offline
Есть шейдер самописный. Достаточно простой Diffuse Bump Specular. Всё было хорошо. Но решил я добавить в него поддержку альфа канала, что создания неровных краёв объектов но объекты плюс ко всему решили также стать ещё и полупрозрачными... примерно так: Код шейдера: Код
Shader "Bump_Diffuse_Specular" { Properties { _Diffuse ("Diffuse", 2D) = "white" {} _Specular ("Specular", 2D) = "white" {} _Normal ("Normal", 2D) = "bump" {} [HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" } LOD 200 Pass { Name "ForwardBase" Tags { "LightMode"="ForwardBase" } Cull Off Fog { Color (0.5,0.5,0.5,1) } CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #include "AutoLight.cginc" #pragma multi_compile_fwdbase_fullshadows #pragma exclude_renderers flash #pragma target 3.0 uniform float4 _LightColor0; uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; uniform sampler2D _Specular; uniform float4 _Specular_ST; uniform sampler2D _Normal; uniform float4 _Normal_ST; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { float4 pos : SV_POSITION; float2 uv0 : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; float3 tangentDir : TEXCOORD3; float3 binormalDir : TEXCOORD4; LIGHTING_COORDS(5,6) }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.normalDir = mul(float4(v.normal,0), _World2Object).xyz; o.tangentDir = normalize( mul( _Object2World, float4( v.tangent.xyz, 0.0 ) ).xyz ); o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w); o.posWorld = mul(_Object2World, v.vertex); o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } fixed4 frag(VertexOutput i) : COLOR { i.normalDir = normalize(i.normalDir); float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir); float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); /////// Normals: float2 node_18 = i.uv0; float3 normalLocal = UnpackNormal(tex2D(_Normal,TRANSFORM_TEX(node_18.rg, _Normal))).rgb; float3 normalDirection = normalize(mul( normalLocal, tangentTransform )); // Perturbed normals float nSign = sign( dot( viewDirection, i.normalDir ) ); // Reverse normal if this is a backface i.normalDir *= nSign; normalDirection *= nSign; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_18.rg, _Diffuse)); clip(node_2.a - 0.5); float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz); float3 halfDirection = normalize(viewDirection+lightDirection); ////// Lighting: float attenuation = LIGHT_ATTENUATION(i); float3 attenColor = attenuation * _LightColor0.xyz; /////// Diffuse: float NdotL = dot( normalDirection, lightDirection ); float3 diffuse = pow(max( 0.0, NdotL), node_2.rgb) * attenColor + UNITY_LIGHTMODEL_AMBIENT.rgb; ///////// Gloss: float gloss = 0.5; float specPow = exp2( gloss * 10.0+1.0); ////// Specular: NdotL = max(0.0, NdotL); float3 specularColor = tex2D(_Specular,TRANSFORM_TEX(node_18.rg, _Specular)).rgb; float3 specular = (floor(attenuation) * _LightColor0.xyz) * pow(max(0,dot(halfDirection,normalDirection)),specPow) * specularColor; float3 finalColor = 0; float3 diffuseLight = diffuse; finalColor += diffuseLight * node_2.rgb; finalColor += specular; /// Final Color: return fixed4(finalColor,1); } ENDCG } Pass { Name "ForwardAdd" Tags { "LightMode"="ForwardAdd" } Blend One One Cull Off Fog { Color (0,0,0,0) } CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDADD #include "UnityCG.cginc" #include "AutoLight.cginc" #pragma multi_compile_fwdadd_fullshadows #pragma exclude_renderers flash #pragma target 3.0 uniform float4 _LightColor0; uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; uniform sampler2D _Specular; uniform float4 _Specular_ST; uniform sampler2D _Normal; uniform float4 _Normal_ST; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { float4 pos : SV_POSITION; float2 uv0 : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; float3 tangentDir : TEXCOORD3; float3 binormalDir : TEXCOORD4; LIGHTING_COORDS(5,6) }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.normalDir = mul(float4(v.normal,0), _World2Object).xyz; o.tangentDir = normalize( mul( _Object2World, float4( v.tangent.xyz, 0.0 ) ).xyz ); o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w); o.posWorld = mul(_Object2World, v.vertex); o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } fixed4 frag(VertexOutput i) : COLOR { i.normalDir = normalize(i.normalDir); float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir); float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); /////// Normals: float2 node_19 = i.uv0; float3 normalLocal = UnpackNormal(tex2D(_Normal,TRANSFORM_TEX(node_19.rg, _Normal))).rgb; float3 normalDirection = normalize(mul( normalLocal, tangentTransform )); // Perturbed normals float nSign = sign( dot( viewDirection, i.normalDir ) ); // Reverse normal if this is a backface i.normalDir *= nSign; normalDirection *= nSign; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_19.rg, _Diffuse)); clip(node_2.a - 0.5); float3 lightDirection = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w)); float3 halfDirection = normalize(viewDirection+lightDirection); ////// Lighting: float attenuation = LIGHT_ATTENUATION(i); float3 attenColor = attenuation * _LightColor0.xyz; /////// Diffuse: float NdotL = dot( normalDirection, lightDirection ); float3 diffuse = pow(max( 0.0, NdotL), node_2.rgb) * attenColor; ///////// Gloss: float gloss = 0.5; float specPow = exp2( gloss * 10.0+1.0); ////// Specular: NdotL = max(0.0, NdotL); float3 specularColor = tex2D(_Specular,TRANSFORM_TEX(node_19.rg, _Specular)).rgb; float3 specular = attenColor * pow(max(0,dot(halfDirection,normalDirection)),specPow) * specularColor; float3 finalColor = 0; float3 diffuseLight = diffuse; finalColor += diffuseLight * node_2.rgb; finalColor += specular; /// Final Color: return fixed4(finalColor * 1,0); } ENDCG } Pass { Name "ShadowCollector" Tags { "LightMode"="ShadowCollector" } Cull Off Fog {Mode Off} CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_SHADOWCOLLECTOR #define SHADOW_COLLECTOR_PASS #include "UnityCG.cginc" #include "Lighting.cginc" #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_shadowcollector #pragma exclude_renderers flash #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; struct VertexInput { float4 vertex : POSITION; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { V2F_SHADOW_COLLECTOR; float2 uv0 : TEXCOORD5; }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_SHADOW_COLLECTOR(o) return o; } fixed4 frag(VertexOutput i) : COLOR { float2 node_20 = i.uv0; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_20.rg, _Diffuse)); clip(node_2.a - 0.5); SHADOW_COLLECTOR_FRAGMENT(i) } ENDCG } Pass { Name "ShadowCaster" Tags { "LightMode"="ShadowCaster" } Cull Off Offset 1, 1 Fog {Mode Off} CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_SHADOWCASTER #include "UnityCG.cginc" #include "Lighting.cginc" #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_shadowcaster #pragma exclude_renderers flash #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; struct VertexInput { float4 vertex : POSITION; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { V2F_SHADOW_CASTER; float2 uv0 : TEXCOORD1; }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_SHADOW_CASTER(o) return o; } fixed4 frag(VertexOutput i) : COLOR { float2 node_21 = i.uv0; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_21.rg, _Diffuse)); clip(node_2.a - 0.5); SHADOW_CASTER_FRAGMENT(i) } ENDCG } } FallBack "Diffuse" CustomEditor "ShaderForgeMaterialInspector" }
Код написан не в ручну. Создаю шейдеры шейдер форжем, в нём это выглядит так: Прошу подсказать, где я что сделал неправильно и как это исправить? Заранее благодарю!Добавлено (08 Июн 2014, 18:32) --------------------------------------------- Проблема исчезает, при отключении в шейдере поддержки двусторонних полигонов, но, хотелось сохранить и двусторонность и альфа... если это конечно возможно
Добавлено (08 Июн 2014, 19:21) --------------------------------------------- Вопрос снят. Путём научного тыка настроил.
Сообщение Есть шейдер самописный. Достаточно простой Diffuse Bump Specular. Всё было хорошо. Но решил я добавить в него поддержку альфа канала, что создания неровных краёв объектов но объекты плюс ко всему решили также стать ещё и полупрозрачными... примерно так: Код шейдера: Код
Shader "Bump_Diffuse_Specular" { Properties { _Diffuse ("Diffuse", 2D) = "white" {} _Specular ("Specular", 2D) = "white" {} _Normal ("Normal", 2D) = "bump" {} [HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" } LOD 200 Pass { Name "ForwardBase" Tags { "LightMode"="ForwardBase" } Cull Off Fog { Color (0.5,0.5,0.5,1) } CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDBASE #include "UnityCG.cginc" #include "AutoLight.cginc" #pragma multi_compile_fwdbase_fullshadows #pragma exclude_renderers flash #pragma target 3.0 uniform float4 _LightColor0; uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; uniform sampler2D _Specular; uniform float4 _Specular_ST; uniform sampler2D _Normal; uniform float4 _Normal_ST; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { float4 pos : SV_POSITION; float2 uv0 : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; float3 tangentDir : TEXCOORD3; float3 binormalDir : TEXCOORD4; LIGHTING_COORDS(5,6) }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.normalDir = mul(float4(v.normal,0), _World2Object).xyz; o.tangentDir = normalize( mul( _Object2World, float4( v.tangent.xyz, 0.0 ) ).xyz ); o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w); o.posWorld = mul(_Object2World, v.vertex); o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } fixed4 frag(VertexOutput i) : COLOR { i.normalDir = normalize(i.normalDir); float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir); float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); /////// Normals: float2 node_18 = i.uv0; float3 normalLocal = UnpackNormal(tex2D(_Normal,TRANSFORM_TEX(node_18.rg, _Normal))).rgb; float3 normalDirection = normalize(mul( normalLocal, tangentTransform )); // Perturbed normals float nSign = sign( dot( viewDirection, i.normalDir ) ); // Reverse normal if this is a backface i.normalDir *= nSign; normalDirection *= nSign; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_18.rg, _Diffuse)); clip(node_2.a - 0.5); float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz); float3 halfDirection = normalize(viewDirection+lightDirection); ////// Lighting: float attenuation = LIGHT_ATTENUATION(i); float3 attenColor = attenuation * _LightColor0.xyz; /////// Diffuse: float NdotL = dot( normalDirection, lightDirection ); float3 diffuse = pow(max( 0.0, NdotL), node_2.rgb) * attenColor + UNITY_LIGHTMODEL_AMBIENT.rgb; ///////// Gloss: float gloss = 0.5; float specPow = exp2( gloss * 10.0+1.0); ////// Specular: NdotL = max(0.0, NdotL); float3 specularColor = tex2D(_Specular,TRANSFORM_TEX(node_18.rg, _Specular)).rgb; float3 specular = (floor(attenuation) * _LightColor0.xyz) * pow(max(0,dot(halfDirection,normalDirection)),specPow) * specularColor; float3 finalColor = 0; float3 diffuseLight = diffuse; finalColor += diffuseLight * node_2.rgb; finalColor += specular; /// Final Color: return fixed4(finalColor,1); } ENDCG } Pass { Name "ForwardAdd" Tags { "LightMode"="ForwardAdd" } Blend One One Cull Off Fog { Color (0,0,0,0) } CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_FORWARDADD #include "UnityCG.cginc" #include "AutoLight.cginc" #pragma multi_compile_fwdadd_fullshadows #pragma exclude_renderers flash #pragma target 3.0 uniform float4 _LightColor0; uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; uniform sampler2D _Specular; uniform float4 _Specular_ST; uniform sampler2D _Normal; uniform float4 _Normal_ST; struct VertexInput { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { float4 pos : SV_POSITION; float2 uv0 : TEXCOORD0; float4 posWorld : TEXCOORD1; float3 normalDir : TEXCOORD2; float3 tangentDir : TEXCOORD3; float3 binormalDir : TEXCOORD4; LIGHTING_COORDS(5,6) }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.normalDir = mul(float4(v.normal,0), _World2Object).xyz; o.tangentDir = normalize( mul( _Object2World, float4( v.tangent.xyz, 0.0 ) ).xyz ); o.binormalDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w); o.posWorld = mul(_Object2World, v.vertex); o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_VERTEX_TO_FRAGMENT(o) return o; } fixed4 frag(VertexOutput i) : COLOR { i.normalDir = normalize(i.normalDir); float3x3 tangentTransform = float3x3( i.tangentDir, i.binormalDir, i.normalDir); float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); /////// Normals: float2 node_19 = i.uv0; float3 normalLocal = UnpackNormal(tex2D(_Normal,TRANSFORM_TEX(node_19.rg, _Normal))).rgb; float3 normalDirection = normalize(mul( normalLocal, tangentTransform )); // Perturbed normals float nSign = sign( dot( viewDirection, i.normalDir ) ); // Reverse normal if this is a backface i.normalDir *= nSign; normalDirection *= nSign; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_19.rg, _Diffuse)); clip(node_2.a - 0.5); float3 lightDirection = normalize(lerp(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz - i.posWorld.xyz,_WorldSpaceLightPos0.w)); float3 halfDirection = normalize(viewDirection+lightDirection); ////// Lighting: float attenuation = LIGHT_ATTENUATION(i); float3 attenColor = attenuation * _LightColor0.xyz; /////// Diffuse: float NdotL = dot( normalDirection, lightDirection ); float3 diffuse = pow(max( 0.0, NdotL), node_2.rgb) * attenColor; ///////// Gloss: float gloss = 0.5; float specPow = exp2( gloss * 10.0+1.0); ////// Specular: NdotL = max(0.0, NdotL); float3 specularColor = tex2D(_Specular,TRANSFORM_TEX(node_19.rg, _Specular)).rgb; float3 specular = attenColor * pow(max(0,dot(halfDirection,normalDirection)),specPow) * specularColor; float3 finalColor = 0; float3 diffuseLight = diffuse; finalColor += diffuseLight * node_2.rgb; finalColor += specular; /// Final Color: return fixed4(finalColor * 1,0); } ENDCG } Pass { Name "ShadowCollector" Tags { "LightMode"="ShadowCollector" } Cull Off Fog {Mode Off} CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_SHADOWCOLLECTOR #define SHADOW_COLLECTOR_PASS #include "UnityCG.cginc" #include "Lighting.cginc" #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_shadowcollector #pragma exclude_renderers flash #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; struct VertexInput { float4 vertex : POSITION; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { V2F_SHADOW_COLLECTOR; float2 uv0 : TEXCOORD5; }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_SHADOW_COLLECTOR(o) return o; } fixed4 frag(VertexOutput i) : COLOR { float2 node_20 = i.uv0; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_20.rg, _Diffuse)); clip(node_2.a - 0.5); SHADOW_COLLECTOR_FRAGMENT(i) } ENDCG } Pass { Name "ShadowCaster" Tags { "LightMode"="ShadowCaster" } Cull Off Offset 1, 1 Fog {Mode Off} CGPROGRAM #pragma vertex vert #pragma fragment frag #define UNITY_PASS_SHADOWCASTER #include "UnityCG.cginc" #include "Lighting.cginc" #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_shadowcaster #pragma exclude_renderers flash #pragma target 3.0 uniform sampler2D _Diffuse; uniform float4 _Diffuse_ST; struct VertexInput { float4 vertex : POSITION; float2 texcoord0 : TEXCOORD0; }; struct VertexOutput { V2F_SHADOW_CASTER; float2 uv0 : TEXCOORD1; }; VertexOutput vert (VertexInput v) { VertexOutput o; o.uv0 = v.texcoord0; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); TRANSFER_SHADOW_CASTER(o) return o; } fixed4 frag(VertexOutput i) : COLOR { float2 node_21 = i.uv0; float4 node_2 = tex2D(_Diffuse,TRANSFORM_TEX(node_21.rg, _Diffuse)); clip(node_2.a - 0.5); SHADOW_CASTER_FRAGMENT(i) } ENDCG } } FallBack "Diffuse" CustomEditor "ShaderForgeMaterialInspector" }
Код написан не в ручну. Создаю шейдеры шейдер форжем, в нём это выглядит так: Прошу подсказать, где я что сделал неправильно и как это исправить? Заранее благодарю!Добавлено (08 Июн 2014, 18:32) --------------------------------------------- Проблема исчезает, при отключении в шейдере поддержки двусторонних полигонов, но, хотелось сохранить и двусторонность и альфа... если это конечно возможно
Добавлено (08 Июн 2014, 19:21) --------------------------------------------- Вопрос снят. Путём научного тыка настроил.
Автор - NapalmRain Дата добавления - 08 Июн 2014 в 19:21