ShaderLab: Pass
ShaderLab: Blending

ShaderLab: Culling & Depth Testing

컬링은 시점과 반대편을 향한 폴리곤을 렌더링하지 않는 최적화입니다. 모든 다각형은 앞면과 뒷면이 있습니다. 컬링은 오브젝트의 대부분이 닫혀있는 사실을 이용합니다 만약 큐브가 있을 경우, 시점의 반대편을 보는 일은 없기 때문에(반드시 시점 쪽을 향하고 있는 면이 있다) 반대편은 렌더링 할 필요가 없습니다. 이 때문에 백 페이스 컬링(반대쪽 면의 제거)이라고 이름 붙여져 있습니다.

렌더링을 올바르게 보여주는 또 하나의 기능은 깊이 테스트(Depth testing)입니다. 깊이 테스트를 통해, 씬에서 가장 가까운 오브젝트 표면만 표현되는 것을 확인합니다.

구문

컬링

Cull Back | Front | Off

폴리곤의 어느 한쪽을 컬링할(draw하지 않는)지 제어.

  • Back 시점에서 반대 면의 폴리곤을 렌더링하지 않는다.(default)

  • Front 시점 방향의 면의 폴리곤을 렌더링하지 않는다. 오브젝트를 반전하는 데 사용합니다.

  • Off 모든 면을 그립니다. 특수한 효과에 사용합니다.

ZWrite

ZWrite On | Off

이 오브젝트의 픽셀을 깊이 버퍼에 기록하거나 제어(기본값은 On). 만약 불투명한 오브젝트를 그리는 경우, on으로 합니다. 만약 부분적으로 투명 효과를 그리는 경우, ZWrite Off 로 전환합니다. 자세한 내용은 다음을 참조하십시오.

ZTest

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

깊이 테스트의 실행 방법. 기본값은 LEqual (이미 그려진 오브젝트와 거리가 같거나 더 가까운 경우에 그립니다. 그보다 먼 경우에는 오브젝트로 숨깁니다)

Offset

Offset Factor, Units

깊이 오프셋을 두 파라미터 factorunits 로 지정할 수 있도록 합니다. Factor 는 폴리곤의 X 또는 Y에 관련하여 최대의 Z 기울기를 스케일하고, units 는 최소 깊이 버퍼 값을 스케일합니다. 예를 들어, Offset 0, –1 에 의해, 폴리곤의 기울기를 무시하고 폴리곤을 카메라에 가까이 하는 한편, Offset –1, –1 은 더욱 올려다보는 각도로 폴리곤을 가까이 합니다.

오브젝트의 반대쪽 면만 렌더링합니다 :

Shader "Show Insides" {
    SubShader {
        Pass {
            Material {
                Diffuse (1,1,1,1)
            }
            Lighting On
            Cull Front
        }
    }
}

큐브에 적용해보고, 그것을 중심으로 회전할때 지오메트리가 어떻게 잘못되는지 알게 됩니다 . 이것은 큐브의 내부만 보기 때문입니다.

깊이 기록 과 투명 쉐이더

보통 semitransparent shaders(부분적으로 투명한 쉐이더)는 깊이 버퍼에 기록하지 않습니다. 그러나 이렇게 하면 특히 복잡하고 Convex인 메쉬에서는, 그리기 순서의 문제가 생길 가능성이 있습니다. 만약 그런 메쉬를 페이드 인&페이드 아웃하면, 투명성을 렌더링하기 전에 깊이 버퍼를 채우는 쉐이더를 사용하는 것이 도움이 됩니다.

부분적으로 투명한 오브젝트에서, 왼쪽 : 표준적인 Transparent/Diffuse 쉐이더, 오른쪽 : 깊이 버퍼에 기록하는 쉐이더
부분적으로 투명한 오브젝트에서, 왼쪽 : 표준적인 Transparent/Diffuse 쉐이더, 오른쪽 : 깊이 버퍼에 기록하는 쉐이더
Shader "Transparent/Diffuse ZWrite" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}
SubShader {
    Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
    LOD 200

    // extra pass that renders to depth buffer only
    Pass {
        ZWrite On
        ColorMask 0
    }

    // paste in forward rendering passes from Transparent/Diffuse
    UsePass "Transparent/Diffuse/FORWARD"
}
Fallback "Transparent/VertexLit"
}

법선 디버깅

다음은 보다 흥미로운 내용으로, 먼저 오브젝트를 법선 맵 정점 라이팅으로 렌더링한 후, 다음 백 페이스를 밝은 핑크로 렌더링합니다. 이에 따라 법선이 반전하지 않으면 안되는 곳이 강조되는 효과를 얻을 수 있습니다. 물리적 거동으로 제어된 오브젝트가 어떤 것인지 메쉬를 통해 ‘흡입되는’ 현상이 있는 경우, 이 쉐이더를 할당해주십시오. 만약 핑크 ​​부분이 보이는 경우, 이러한 부분이 그것에 닿는 부분을 불행히도 당겨버립니다.

실제로 해 보겠습니다 :

Shader "Reveal Backfaces" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }
    SubShader {
        // Render the front-facing parts of the object.
        // We use a simple white material, and apply the main texture.
        Pass {
            Material {
                Diffuse (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }

        // Now we render the back-facing triangles in the most
        // irritating color in the world: BRIGHT PINK!
        Pass {
            Color (1,0,1,1)
            Cull Front
        }
    }
}

Glass 컬링

컬링의 제어는 백 페이스 이외에도 편리합니다. 만약 투명 오브젝트가 있는 경우, 종종 오브젝트의 백 페이스를 표시하는 경우가 있습니다. 만약 컬링 없이 렌더링하는 경우(Cull Off), 일부 뒷면이 앞면과 겹쳐 버리는 경우가 자주 있습니다.

다음 예제는 볼록한 오브젝트(구, 큐브, 자동차의 앞 유리)에서 사용할 수 있는 간단한 쉐이더입니다.

Shader "Simple Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }

    SubShader {
        // We use the material in many passes by defining them in the subshader.
        // Anything defined here becomes default values for all contained passes.
        Material {
            Diffuse [_Color]
            Ambient [_Color]
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]
        }
        Lighting On
        SeparateSpecular On

        // Set up alpha blending
        Blend SrcAlpha OneMinusSrcAlpha

        // Render the back facing parts of the object.
        // If the object is convex, these will always be further away
        // than the front-faces.
        Pass {
            Cull Front
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // Render the parts of the object facing us.
        // If the object is convex, these will be closer than the
        // back-faces.
        Pass {
            Cull Back
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
    }
}
ShaderLab: Pass
ShaderLab: Blending