Pour maximer les chances de réponses j'expose rapidement le truc.
Je veux faire moi-même de l'eau, il me faut donc un shader.
ShaderGraph offre une alternative à ceux qui n'aime pas le HLSL (comme moi) mais il tourne avec un RendererPipeline différent.
On peut trouver des shaders compatibles pour remplacer ceux de notre projet mais certains sont dispos uniquement avec le RendererPipeline d'origine comme la Skybox procédurale.
Donc si quelqu'un connais des solutions pour convertir un ou en ShaderGraph ??? Mais visiblement c'est mort ça...
Dans l'attente qu'Unity incorpore shaderGraph avec le renderer natif, je me suis lancé dans la rédaction d'un SurfaceShader, le plus simple je pense.
Rien de ouf, une Color, un Fresnel, une NormalMap avec des Tilling différent superposé, une variable pour la Transparence, un Smoothness. Le tout mixer par votre serviteur, voilà le code :
Code : Tout sélectionner
Shader "Custom/Water" {
Properties{
_Color("Color", Color) = (1,1,1,1)
_RimColor("Rim Color", Color) = (0.26,0.19,0.16,0.0)
_RimPower("Rim Power", Range(0.5,8.0)) = 3.0
_BumpMap("Normal Map", 2D) = "white" {}
_Smoothness("Smoothness", Range(0,1)) = 0.6
_Transparency("Transparency", Range(0,0.5)) = 0.3
}
SubShader{
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "ForceNoShadowCasting" = "true" "IgnoreProjector" = "true"}
LOD 200
Cull off
//ZWrite Off
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
float4 _Color;
float4 _RimColor;
float _RimPower;
sampler2D _BumpMap;
half _Smoothness;
half _Transparency;
struct Input {
float2 uv_BumpMap;
float3 viewDir;
};
// 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) {
fixed4 c = _Color;
// Color
o.Albedo = c.rgb;
// Normal
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap) + tex2D(_BumpMap, IN.uv_BumpMap * 4));
//Rim (fresnel)
half rim = saturate(dot(normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgba * pow(rim, _RimPower);
// Smoothness
o.Smoothness = _Smoothness;
//Transparency
o.Alpha = _Transparency;
}
ENDCG
}
FallBack "Diffuse"
}
- La commande de transparence "o.Alpha = _Transparency;" n'est pas interprétée, ma texture reste opaque
- J'aimerais modifier le Rim (ou un autre effet) pour faire comme un Fresnel de shaderGraph (avec la couleur du secondaire sur l'extérieur)
- Si je place un cube au-dessus de l'eau, il ne projette pas d'ombre sur l'eau mais sur le sol en contrebas, j'aimerais que l'ombre soit sur l'eau
Dans un second temps je pense ajouter des améliorations, celles-ci sont-t'elle possibles avec un SurfaceShader ? Si oui, des sources à partager ??
- Réflexion avec déformation
- Réfraction avec déformation
- Adapter le Tilling en fonction de la taille de l'objet directement dans le shader