'전체 글'에 해당되는 글 183건

  1. 2012.07.18 Fog
  2. 2012.07.18 AlphaTest
  3. 2012.07.18 CullAndDepth

Fog

ShaderLab syntax: Fog

안개 파라미터들은 Fog 명령어로 조절됩니다.

Fogging은 생성된 픽셀의 색을 카메라로부터의 거리에 따른 일정한 색을 향해 혼합합니다. Fogging은 혼합된 픽셀의 알파 값을 바꾸지 않습니다. 오직 그것의 RGB 컴포넌트만을 바꿉니다.

Syntax

Fog { Fog Commands }
괄호안의fog 명령어를 명세합니다.
Mode Off | Global | Linear | Exp | Exp2
Fog 모드를 정의합니다. 기본값은 글로벌입니다. 그것은 렌더링 세팅에서 fog가 켜졌는지 여부에 따라서 Off 또는 Exp2로 번역합니다.
Color ColorValue
Fog 색을 세팅합니다.
Density FloatValue
기하급수적인 fog를 위한 밀도를 세팅합니다.
Range FloatValue , FloatValue
선형 fog를 위해 근거리 그리고 원거리의 범위를 세팅합니다.

Details

기본적인 fog 세팅은 Render Settings에 기반합니다: fog 모델은 Exp2 또는 Off 입니다; 세팅으로부터 취해진 밀도 & 색.

사용자가 fragment programs를 사용한다면 그 쉐이더의 Fog 세팅은 여전히 적용될 것입니다. 고정된 Fog 기능이 없는 플랫폼에서 Unity는 요청되는 Fog 모드를 지원하기 위해서 실시간으로 쉐이더를 패치할 것입니다.

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

BindChannels  (0) 2012.07.18
Name  (0) 2012.07.18
AlphaTest  (0) 2012.07.18
CullAndDepth  (0) 2012.07.18
SetTexture  (1) 2012.07.17
Posted by 프리랜서 디자이너

ShaderLab syntax: Alpha testing

알파 테스트는 픽셀을 스크린에 쓰여지는 것으로부터 거절할 수 있는 마지막 기회입니다.

마지막 결과 색상이 계산되어진 후에, 색은 고정 값에 비교되어진 그것의 알파 값을 선택적으로 가질 수 있습니다. 테스트가 실패하면 픽셀은 디스플레이에 쓰여지지 않습니다.

Syntax

AlphaTest Off
모든 픽셀을 그립니다 (기본 세팅).
 
AlphaTest comparison AlphaValue
그것의 알파 값이 특정 범위안에 있는 픽셀들만 그리기 위한 알파 테스트를 세팅합니다.

Comparison

비교는 다음 단어들 중 하나입니다:

Greater 그것의 알파가 AlphaValue보다 큰 픽셀들만 그립니다.
GEqual 그것의 알파가’‘AlphaValue’’ 보다 크거나 같은 픽셀들만 그립니다.
Less 그것의 알파값이’‘AlphaValue’’ 보다 적은 픽셀들만 그립니다.
LEqual 그것의 알파값이’‘AlphaValue’’ 보다 적거나 같은 픽셀들만 그립니다.
Equal 그것의 알파값이’‘AlphaValue’’ 과 같은 픽셀들만 그립니다.
NotEqual 그것의 알파값이’‘AlphaValue’’ 과 다른 픽셀들만 그립니다.
Always 모든 픽셀을 그립니다. 이것은 AlphaTest Off와 기능적으로 동일합니다.
Never 어떠한 픽셀도 그리지 않습니다.

AlphaValue

0과 1사이의 소수점 숫자. 이것은 기본적인 사각형 타입의 괄호 포맷([변수 이름])을 사용해서 쓰여져야 하는 경우에 하나의 float 또는 범위 속성을 레퍼런스하는 변수를 위해 사용될 수 있습니다.

Details

알파 테스트는 투명한 부분들을 가지는 물체를 오목하게 표현할 때 중요합니다. 그래픽 카드는 스크린에 쓰여지는 모든 픽셀의 깊이의 레코드를 유지합니다. 하나의 새로운 픽셀이 이전에 그려진 픽셀보다 멀리 있다면 새로운 픽셀은 디스플레이에 쓰여지지 않습니다. 이것은 Blending과 함께 임에도 불구하고 물체가 들여다 보지 않을 것입니다.

이 그림에서 왼쪽에 나무는 AlphaTest를 사용해서 그려집니다. 그것안에 픽셀들이 어떻게 완전히 투명하거나 불투명한지를 참고하시기 바랍니다. 가운데 나무는 오직 Alpha Blending 사용해서 그려집니다. 나뭇 가지 근처의 투명한 부분들이 깊이 버퍼 때문에 어떻게 멀리있는 나뭇잎들을 커버하는지를 참고하시기 바랍니다.

 

 오른쪽에 있는 나무는 마지막 쉐이더 예를 사용해서 그려집니다 – 그것은 어떠한 아티팩트라도 숨기기 위해서 블렌딩과 알파 테스팅이 결합된 것을 구현합니다.

Examples

가장 간단한 가능한 예는 알파 채널을 가지는 하나의 텍스쳐를 그것에 지정하는 것입니다. 물체는 알파가 0.5보다 큰 곳에서만 보여질 것입니다.

Shader "Simple Alpha Test" {
	Properties {
		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
	}
	SubShader {
		Pass {
			// Only render pixels with an alpha larger than 50%
			AlphaTest Greater 0.5
			SetTexture [_MainTex] { combine texture }
		}
	}
}

이것은 그것 스스로 훨씬 좋지 않습니다. 사용자가 조명을 추가하게 해주고 컷오프 값을 조정 가능하게 만들어 줍니다:

Shader "Cutoff Alpha" {
	Properties {
		_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
		_Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
	}
	SubShader {
		Pass {
			// Use the Cutoff parameter defined above to determine
			// what to render.
			AlphaTest Greater [_Cutoff]

			Material {
				Diffuse (1,1,1,1)
				Ambient (1,1,1,1)
			}
			Lighting On
			SetTexture [_MainTex] { combine texture * primary }
		}
	}
} 

식물과 나무를 그릴 때, 많은 게임들은 일반적인 알파 테스팅의 단단한 모서리를 가집니다. 그것에 대한 하나의 방법은 물체를 두 번 그리는 것입니다. 첫 번째 패스에서 사용자는 50% 보다 더욱 불투명한 픽셀만을 그리기 위해서 알파 테스팅을 사용합니다. 두 번째 패스에서 사용자는 픽셀의 깊이를 기록하는 것 없이 잘려진 부분들에 그래픽을 알파 블렌딩 합니다. 사용자는 멀리 있는 나뭇 가지가 가까이 있는 것을 덮어 씌움에 따라 약간의 혼돈을 가질지도 모릅니다. 그러나 실제로 나뭇잎이 그것들 안에 있는 많은 시각적인 디테일을 가지는 것을 보는 것은 어렵습니다.

Shader "Vegetation" { Properties { _Color ("Main Color", Color) = (.5, .5, .5, .5) _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {} _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5 } SubShader { // Set up basic lighting Material { Diffuse [_Color] Ambient [_Color] } Lighting On // Render both front and back facing polygons. Cull Off // first pass: // render any pixels that are more than [_Cutoff] opaque Pass { AlphaTest Greater [_Cutoff] SetTexture [_MainTex] { combine texture * primary, texture } }              // Second pass: // render in the semitransparent details. Pass { // Dont write to the depth buffer ZWrite off // Don't write pixels we have already written. ZTest Less // Only render pixels less or equal to the value AlphaTest LEqual [_Cutoff] // Set up alpha blending Blend SrcAlpha OneMinusSrcAlpha SetTexture [_MainTex] { combine texture * primary, texture } } } }

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

Name  (0) 2012.07.18
Fog  (0) 2012.07.18
CullAndDepth  (0) 2012.07.18
SetTexture  (1) 2012.07.17
Pass Tags  (0) 2012.07.17
Posted by 프리랜서 디자이너

ShaderLab syntax: Culling & Depth Testing

Culling은 뷰어로부터 방향이 빛나간 다각형들을 그리지 않는 최적화 방법입니다. 모든 다각형은 앞과 뒤쪽 사이드를 가집니다. Culling은 대부분의 물체가 닫혀 있다는 사실을 사용합니다; 사용자가 하나의 정육면체를 가진다면 사용자는 사용자로부터 방향이 빛나가 있는 면은 절대 보지 못할 것입니다 (그것의 앞에 항상 사용자를 마주보는 면이 있습니다). 그래서 사용자는 빛나가 있는 면들은 그릴 필요가 없습니다. 그러므로 그 용어를 사용합니다: Backface culling.

렌더링을 올바르게 보이게하는 다른 특성은 깊이 테스팅 입니다. 깊이 테스팅은 오직 닫혀진 표면 물체들만이 씬에서 그려지는 것을 확실하게 합니다.

Syntax

Cull Back | Front | Off
다각형의 어떤 면이 그려지지 않을 지를 조절합니다.
Back 뷰어로 부터 벗어나 있는 다각형은 그리지 않습니다 (기본 설정).
Front 뷰어를 향하는 다각형은 그리지 않습니다. 물체를 내부로 보낼 때 사용됩니다.
Off culling을 비활성화 – 모든 면을 그립니다. 특별한 효과를 위해서 사용됩니다.

 

 

ZWrite On | Off
이 물체로 부터 픽셀들이 깊이 버퍼로 쓰여지는지 여부를 결정 (기본값은On). 사용자가 고체의 물체를 그리고 있다면 이것을 on으로 합니다. 사용자가 반투명한 효과를 그리고 있다면 ZWrite Off 로 바꿉니다. 자세한 내용을 위해서는 아래의 내용을 읽어보시기 바랍니다.

 

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
깊이 테스팅이 어떻게 실행되는지를 나타냅니다. 기본값은 LEqual (기존 물체로서 거리에서 또는 그것으로 부터 물체를 그립니다; 그것들 뒤에서 물체를 숨깁니다).

 

Offset Factor , Units
사용자가 두 개의 파라미터로 깊이 오프셋을 정하는 것을 허락합니다. factorunitsFactor 는 최대의 Z 기울기를 다각형의 X 또는 Y에 따라 스케일 하고 units은 최소 깊이 버퍼 값을 스케일 합니다. 이것은 사용자가 다각형들이 같은 위치에 있음에도 불구하고 하나의 다각형이 다른 것 위에서 그려지도록 할 수 있습니다. 예를 들어 Offset 0, -1 은 다각형의 기울기를 무시하고 다각형을 카메라 가까이로 당깁니다. 반면 Offset -1, -1 은 방목 각도를 볼 때 심지어 더 가깝게 다각형을 끌어 당깁니다.

Examples

This object will render only the backfaces of an object:

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

그것을 하나의 정육면체에 적용하도록 하고 사용자가 그것 주위에서 선회할 때 기하학적으로 어떻게 잘못되는지 느끼는 것을 주의하시기 바랍니다. 이것은 사용자가 정육면체 내부의 부분만을 오직 보고 있기 때문입니다.

Debugging Normals

다음의 것은 더욱 흥미롭습니다; 첫째로 사용자는 보통의 정점 조명을 가지고 물체를 표현하고 나서 밝은 핑크색으로 뒤쪽 면들을 표현합니다. 이것은 사용자의 normals이 뒤집혀질 필요가 있는 어떤 곳에서는 하이라이팅 효과를 가집니다. 사용자가 어떠한 메쉬에 의해 물려있는 물리적으로 통제되는 물체를 본다면 이 쉐이더를 그들에게 지정하시기 바랍니다. 어떤 핑크색 부분이라도 보이다면 이러한 부분들은 그것을 터치하기에 충분히 불행한 어떠한 곳에서 당겨질 것입니다.

Here we go:

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 Culling

Culling을 통제하는 것은 배면을 디버깅하는 것보다 더욱 유용합니다. 사용자가 투명한 물체를 가진다면 사용자는 꽤 자주 물체의 배면을 보여주기는 원합니다. 사용자가 어떠한 culling (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
            }
        }
    }
} 

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

Fog  (0) 2012.07.18
AlphaTest  (0) 2012.07.18
SetTexture  (1) 2012.07.17
Pass Tags  (0) 2012.07.17
Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
Posted by 프리랜서 디자이너