ytgui / temp

0 stars 0 forks source link

graphic phrases 2 toon shading #85

Closed ytgui closed 5 years ago

ytgui commented 5 years ago

? camera depth - fragment depth ? multi fragment render order -> https://www.cnblogs.com/zsb517/p/6655546.html -> SHADOWCASTER

image

ytgui commented 5 years ago

Toon water

v2f vert (appdata v)
{
    v2f o;

    o.vertex = UnityObjectToClipPos(v.vertex);
    o.screenPosition = ComputeScreenPos(o.vertex);
    o.screenPosition.z = -UnityObjectToViewPos(v.vertex).z;
    o.noiseUV = TRANSFORM_TEX(v.uv, _SurfaceNoise);

    return o;
}

float4 frag (v2f i) : SV_Target
{
    float depthRaw = tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPosition)).r;
    float depthLinear = LinearEyeDepth(depthRaw);

    float depthDifference = depthLinear - i.screenPosition.z;

    float waterDepth01 = clamp(depthDifference / _MaxWaterDistance, 0.0, 1.0);
    float4 waterColor = lerp(_WaterShallowColor, _WaterDeepColor, waterDepth01);

    float2 noiseUV = float2(i.noiseUV.x + 0.1 * _Time.x, i.noiseUV.y + 0.1 * _Time.y);
    float surfaceNoiseSample = tex2D(_SurfaceNoise, noiseUV).r;
    // surfaceNoiseSample = surfaceNoiseSample > 0.707 ? 1.0 : 0.0;

    float foamDepthDifference01 = saturate(depthDifference / _FoamMaxDistance);
    float surfaceNoiseCutoff = foamDepthDifference01 * 0.7;

    float surfaceNoise = surfaceNoiseSample > surfaceNoiseCutoff ? 1 : 0;

    return 0.8 * waterColor + 0.2 * surfaceNoise;
}

Toon Ball

v2f vert (appdata v)
{
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    o.worldNormal = UnityObjectToWorldNormal(v.normal);
    o.viewDir = WorldSpaceViewDir(v.vertex);
    return o;
}

float4 frag (v2f i) : SV_Target
{
    float4 texColor = tex2D(_MainTex, i.uv);

    float3 normal = normalize(i.worldNormal);
    float NdotL = dot(_WorldSpaceLightPos0, normal);
    // NdotL = clamp(NdotL, 0.0, 1.0);

    // float lightIntensity = NdotL > 0.0 ? 1.0 : 0.0;
    float lightIntensity = smoothstep(0, 0.01, NdotL);
    float4 light = lightIntensity * _LightColor0;

    float3 viewDir = normalize(i.viewDir);
    float3 halfVector = normalize(_WorldSpaceLightPos0 + viewDir);
    float NdotH = dot(normal, halfVector);
    float specularIntensity = pow(NdotH * lightIntensity, _Glossiness * _Glossiness);
    float specular = smoothstep(0.005, 0.01, specularIntensity);

    float rimDot = 1 - dot(viewDir, normal);
    float rimIntensity = smoothstep(_RimAmount - 0.01, _RimAmount + 0.01, rimDot);
    float4 rim = rimIntensity * _RimColor;

    return _Color * texColor * (_AmbientColor + light + specular + rim);
}