[db-al] Problème : shader qui fonctionne uniquement dans l'éditeur (Grab Pass)

Questions à propos du scripting Shader.
ticoel
Messages : 20
Inscription : 21 Juin 2017 13:31

[db-al] Problème : shader qui fonctionne uniquement dans l'éditeur (Grab Pass)

Message par ticoel » 18 Fév 2018 20:48

Bonsoir !

J'ai un problème avec un shader qui ne fonctionne que dans l'éditeur, sinon il s'affiche de manière transparente ou selon un certain angle de la caméra. Je pense que le problème vient du Grab Pass mais je ne sais pas comment le résoudre. Comment résoudre le problème afin que le shader s’exécute correctement dans l'éditeur et sous l’œil de la caméra ?

Voici le shader :

Code : Tout sélectionner

Shader "Unlit/EdgeDetection2"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		_Color("Color", Color) = (1, 1, 1, 1)
		_EdgeThreshold ("Edge Threshold", float) = 1
		_Kd("Diffuse reflectivity", vector) = (1, 1, 1, 1)
		_Ka("Ambient reflectivity", vector) = (1, 1, 1, 1)
		_Ks("Specular reflectivity", vector) = (1, 1, 1, 1)
		_Shininess("shininess", float) = 0.1
	}
	SubShader
	{
		Tags {
			"RenderType"="Opaque"
			"LightMode" = "ForwardBase"
		}
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"
			#include "Lighting.cginc"

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
				float3 normal : NORMAL;
				fixed3 color: COLOR0;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed4 _Color;
			float4 _Kd;
			float4 _Ka;
			float4 _Ks;
			float _Shininess;

			fixed3 ads(float4 position, float3 normal) {
				float3 n = normalize(normal);
				float3 s = normalize(_WorldSpaceLightPos0);
				float3 v = normalize(float3(-position.xyz));
				float3 h = normalize(v + s);
				return _LightColor0.rgb * (
					_Ka +
					_Kd * max(dot(s, n), 0.) +
					_Ks * pow(max(dot(h, n), 0.), _Shininess)
				);
			}
			
			v2f vert (appdata_base v) {
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.normal = mul(v.normal, unity_ObjectToWorld);
				o.color = ads(o.vertex, o.normal);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target {
				fixed4 col = tex2D(_MainTex, i.uv) * _Color;
				return fixed4(col.rgb * i.color, col.a);
			}
			ENDCG
		}
		GrabPass {
			"_Inter"
		}
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct v2f
			{
				float2 grabPos : TEXCOORD1;
				float4 vertex : SV_POSITION;
				float3 normal : NORMAL;
			};

			sampler2D _Inter;
			float _EdgeThreshold;

			float luma(float3 color) {
				return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
			}

			v2f vert(appdata_base v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.grabPos = ComputeGrabScreenPos(o.vertex);
				o.normal = mul(v.normal, unity_ObjectToWorld);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				float dx = 1. / _ScreenParams.x;
				float dy = 1. / _ScreenParams.y;

				float s00 = luma(tex2D(_Inter, i.grabPos + float2(-dx, dy)).rgb);
				float s10 = luma(tex2D(_Inter, i.grabPos + float2(-dx, 0.)).rgb);
				float s20 = luma(tex2D(_Inter, i.grabPos + float2(-dx, -dy)).rgb);
				float s01 = luma(tex2D(_Inter, i.grabPos + float2(0., dy)).rgb);
				float s21 = luma(tex2D(_Inter, i.grabPos + float2(0., -dy)).rgb);
				float s02 = luma(tex2D(_Inter, i.grabPos + float2(dx, dy)).rgb);
				float s12 = luma(tex2D(_Inter, i.grabPos + float2(dx, 0.)).rgb);
				float s22 = luma(tex2D(_Inter, i.grabPos + float2(dx, -dy)).rgb);

				float sx = s00 + 2 * s10 + s20 - (s02 + 2 * s12 + s22);
				float sy = s00 + 2 * s01 + s02 - (s20 + 2 * s21 + s22);
				float dist = sx * sx + sy * sy;

				if (dist > _EdgeThreshold)
					return fixed4(0., 0., 0., 1.);
				else
					return fixed4(tex2D(_Inter, i.grabPos).rgb, 1.);
			}
			ENDCG
		}
	}
}
Et le problème :
Image

Répondre

Revenir vers « les Shaders »