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

  1. 2012.07.12 Color, Material, Lighting (fixed funtion)
  2. 2012.07.12 Performance Tips when Writing Shaders
  3. 2012.07.12 Writing vertex and fragment shaders

ShaderLab syntax: Color, Material, Lighting

재질과 조명 파라미터는 내장된 정점 조명을 조절하기 위해 사용됩니다. 정점 조명은 각 꼭지점을 위해서 계산되는 기본적인Direct3D/OpenGL 조명 모델입니다. 조명은 켜집니다. 조명은 Material, ColorMaterial 그리고 SeparateSpecular들에 의해 영향을 받습니다.

픽셀당 조명은 보통 사용자 정의 vertex/fragment 프로그램과 함께 구현됩니다. 이것들을 위해서 사용자는 여기에 설명된 어떠한 명령도 사용하지 않고 대신 사용자가 모든 조명, 텍스쳐 그리고 다른 것들을 스스로 하는 곳에서 사용자의 자신만의 vertex and fragment programs를 정의합니다.

꼭지점 컬러링 & 조명은 어떠한 렌더된 기하학을 위해 계산되어진 첫 번째 효과입니다. 그것은 꼭지점 레벨에서 작동하고 텍스쳐가 적용되기 전에 사용된 기본 색상을 계산합니다.

Syntax

최고 레벨 명령은 고정 함수 조명을 사용할지 여부 또는 구성 선택 사항들을 조절합니다. 주요 셋업은Material Block 안에 있고 제사한 내용은 아래와 같습니다.

Color Color
물체를 단색으로 세팅합니다. 색상은 괄호안의 RGBA 값이거나 또는 사각 괄호안에서 색상 속성 이름입니다.
Material { Material Block }
Material block은 물체의 재질적인 소성을 정의하기 위해서 사용됩니다.
Lighting On | Off
Material block에서 정의된 세팅이 어떠한 효과를 가지기 위해서 사용자는 Lighting On 명령을 가지고 조명을 활성화해야 합니다. 조명이 꺼지면 대신 색상이 Color 명령어로 부터 직접적으로 취해집니다.
SeparateSpecular On | Off
이 명령은 쉐이더의 패스의 끝에 추가될 반사적인 조명을 만들고 반사적인 조명은 텍스쳐링에 영향을 받지 않습니다. Lighting On이 사용될 때의 효과만을 가집니다.

:ColorMaterial AmbientAndDiffuse | 재질에서 세팅된 색상 대신에 사용되는 색상을 만듭니다. AmbientAndDiffuse는 재질의 Ambient와Diffuse값을 대체합니다; 발산은 재질의 발산 값을 대체합니다.

Material Block

이것은 재질이 조명에 어떻게 반응하는지에 대한 세팅을 포함합니다. 이러한 속성들 중 어떠한 것도 검정을 기본 세팅으로 하는 경우에 남겨지지 않을 수 있습니다 (즉. 효과가 없습니다).

Diffuse Color
확산 색상 컴포넌트. 이것은 물체의 기본 색상입니다.
Ambient Color
주명의 색상 컴포넌트. 이것은 class-RenderSettings에 세팅된 주변 조명 세팅에 의해 그것이 부딪힐 때 물체가 가지는 색상을 의미합니다..
Specular Color
물체의 반적인 하이라이트 색상.
Shininess Number
조명의 날카로움을 0과 1 사이 값으로 표현. 0에서 사용자는 퍼져있는 조명처럼 보이는 커다란 하이라이트를 얻을 것이고 0에서는 아주 작은 얇은 자국을 얻습니다.
Emission Color
어떠한 조명에서도 부딪히지 않을 때 물체의 색상.

조명에 부딪히는 물체의 전체 새상은 다음과 같습니다:

Ambient * RenderSettings ambient setting + (Light Color * Diffuse + Light Color * Specular) + Emission

방정식의 조명 부분은 (괄호 안에) 물체에 부딪히는 모든 조명에 대해서 반복됩니다.

일반적으로 사용자는Diffuse와Ambient의 색상을 같도록 유지하기를 원합니다 (모든 내장 Unity 쉐이더들도 이것을 합니다).

Examples

항상 물체를 순수 빨강색으로 헨더합니다:

Shader "Solid Red" {
    SubShader {
        Pass { Color (1,0,0,0) }
    }
} 

물체를 하얀색으로 칠하는 그리고 정점 조명을 적용하는 기본 쉐이더:

Shader "VertexLit White" {
    SubShader {
        Pass {
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
        }
    }
} 

Material Inspector에서 visible 속성으로 재질의 색상을 추가하는 확장된 버전입니다:

Shader "VertexLit Simple" {
    Properties {
        _Color ("Main Color", COLOR) = (1,1,1,1)
    }
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
            }
            Lighting On
        }
    }
} 

마지막으로 완전히 깃털이 난 정점 조명 쉐이더 (SetTexture 레퍼런스 페이지를 참고해 주세요):

Shader "VertexLit" {
    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 {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
            SetTexture [_MainTex] {
                Combine texture * primary DOUBLE, texture * primary
            }
        }
    }
} 

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

SetTexture  (1) 2012.07.17
Pass Tags  (0) 2012.07.17
Performance Tips when Writing Shaders  (0) 2012.07.12
Writing vertex and fragment shaders  (0) 2012.07.12
Blending  (0) 2012.06.25
Posted by 프리랜서 디자이너

Performance Tips when Writing Shaders

Use Common sense ;)

사용자가 필요한 것들만 계산합니다; 실제로 필요하지 않은 것들은 제거될 수 있습니다. 예를 들어 재질당 색상을 지원하는 것은 쉐이더를 좀 더 융통성있게 만들기에 좋으나 만약 사용자가 항상 그 색을 흰 색으로 세팅한다면 그것은 스크린에 그려지는 꼭지점 또는 픽셀을 위해서 수행되어지는 쓸모없는 계산이 됩니다.

또 다른 기억해야하는 한 가지는 계산의 빈도수 입니다. 보통 꼭지점들이 있는 것(정점 쉐이더 실행)보다 더 많은 픽셀이 그려집니다 (그러므로 그들의 픽셀 쉐이더가 실행됩니다); 그리고 그려지는 물체보다 더 많은 꼭지점들이. 그래서 일반적으로 사용자가 할 수 있다면 픽셀 쉐이더를 정점 쉐이더로 계산을 움직이고 또는 쉐이더들로 완전히 움직이고 스크립트로부터 값을 한 번에 세팅합니다.

Less Generic Surface Shaders

Surface Shaders는 조명과 상호작용하는 쉐이더를 쓰기 위해 훌륭합니다. 그러나 그들의 기본적인 옵션은 일반적인 케이스를 위한 것입니다. 많은 경우에 사용자는 쉐이더들을 더욱 빠르게 또는 적어도 더 적게 실행하기 위해서 그들을 조절할 수 있습니다:

  • 뷰 디렉션을 사용하는 쉐이더를 위한 approxview 디렉티브는 뷰 디렉션을 픽셀당 하는 것 대신에 일반화된 정점당 하는 것으로 만들 것입니다. 이것은 대략적이나 자주 충분히 좋습니다.
  • Specular 쉐이더 타입을 위한 halfasview은 훨씬 빠릅니다. Half-vector(조명 방향과 뷰 벡터 사이의 중간)는 정점당 계산될 것이고 일반화될 것입니다. 그리고lighting function은 뷰 벡터 대신에 하나의 파라미터로서half-vector를 이미 받을 것입니다.
  • noforwardadd은 Forward 렌더링에서 하나의 쉐이더를 오직 하나의 방향성 있는 조명만을 지원하도록 만들 것입니다. 나머지 조명은 여전히 정점당 조명 또는 주변의 하모니로서 영향을 가질 수 있습니다. 이것은 심지어 다수의 조명이 있음에도 쉐이더를 더 적게 만들고 그것인 항상 한 번의 패스에서 렌더된다는 것을 확인하기에 좋습니다.
  • noambient은 주변의 조명과 쉐이더 위의 조화를 이루는 조명을 비활성화 할 것입니다. 이것은 약간 더 빠를 수 있습니다.

Precision of computations

Cg/HLSL에서 쉐이더를 쓸 때, 3 가지의 기본 숫자 타입이 있습니다: float, half 그리고 fixed (vector & 그들의 matrix 변형 뿐만 아니라, 예. half3와float4x4):

  • float: 고도로 정밀한 부동 소수점. 일반적으로32 비트, 보통의 프로그래밍 언어에서 float 타입처럼.
  • half: 중간 정도로 정밀한 부동 소수점. 일반적으로16 비트, -60000 과 +60000 사이이고 3.3 정확도의 자릿수.
  • fixed: 낮은 정도로 정밀한 부동 소수점. 일반적으로11 비트, -2.0과 +2.0사이이고1/256정확도.

가능한 가장 낮은 정확도를 사용하세요; 이것은iOS 그리고Android같은 모바일 플랫폼에서는 특별히 중요합니다. 중요한 규칙입니다:

  • 색상과 유닛 벡터를 위해서 fixed를 사용하세요
  • 다른 것들을 위해서 만약 범위와 정확도가 좋다면 half를 사용하시고 그렇지 않다면 float를 사용하세요.

모바일 플랫폼에서 키는 프래그먼트 쉐이더에서 낮은 정확도에서 가능한한 오래 머무르도록 확실시 하는 것입니다. 대부분의GPUs에서 스위즐을 낮은 정확도(fixed/lowp)타입으로 적용하는 것은 비용이 듭니다; fixed/lowp와 더 높은 정확도 타입으로 바꾸는 것도 역시 꽤 비용이 많이 듭니다.

Alpha Testing

고정된 함수 AlphaTest 또는 프로그래밍 할 수 있는 동일한clip()은 다른 플랫폼에서 다른 성능적인 특징들을 가집니다:

  • 일반적으로 그것을 대부분의 플랫폼에서 완전히 투명한 픽셀을 잘라내기 위해서 사용하는 것은 작은 장점입니다.
  • 그러나iOS 에서 발견된 PowerVR GPUs와 다른 Android 디바이스들에서 알파 테스팅은 비용이 많이 듭니다. 그것을 성능 최적화로서 사용하지 마시기 바랍니다. 그것은 더욱 느리게 할 것입니다.

Color Mask

플랫폼들에서 (주로iOS와Android 디바이스에서 발견되는 모바일GPUs) 어떤 채널(e.g. ColorMask RGB)들을 남겨두기 위해 ColorMask를 사용하는 것은 비용이 많이 들 수 있으므로 오직 그것을 정말로 필요할 때만 사용하시기 바랍니다.

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

Pass Tags  (0) 2012.07.17
Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
Writing vertex and fragment shaders  (0) 2012.07.12
Blending  (0) 2012.06.25
Fallback  (0) 2012.05.21
Posted by 프리랜서 디자이너

Writing vertex and fragment shaders

ShaderLab 쉐이더는 단순히 "hardware shaders"보다 더 많이 둘러싸고 있습니다. 그들은 많은 것들을 합니다. 그들은 제재 인스펙터에서 보여지는 속성들을 설명하고 다른 그래픽 하드웨어를 위해 다수의 쉐이더 구현을 포함합니다. 그리고 정해진 함수 하드웨어 상태를 구성합니다. 꼭지점 그리고 프래그먼트 프로그램처럼 실제 프로그램이 가능한 쉐이더는 전체ShaderLab의 쉐이더 컨셉의 단지 한 부분일 뿐입니다. 기본적인 지시사항을 위해서 shader tutorial를 살펴보시기 바랍니다. 우리는 낮은 레벨의 하드웨어 shader programs를 부를 것입니다.

사용자가 조명과 상호작용하는 쉐이더를 쓰기를 원한다면 Surface Shaders 서류를 살펴보시기 바랍니다. 이 페이지의 나머지 부분은Unity조명과 상호작용하지 않는 쉐이더를 가정할 것입니다 (예. 특수 효과, Image Effects 등.)

쉐이더 프로그램은 쉐이더 텍스트에 미리보기를 끼워넣음으로서 Pass 명령안에 어딘가에 Cg / HLSL 언어로 쓰여집니다. 그들은 이것처럼 보입니다:

  Pass {
      // ... the usual pass state setup ...

      CGPROGRAM
      // compilation directives for this snippet, e.g.:
      #pragma vertex vert
      #pragma fragment frag

      // the Cg code itself

      ENDCG
      // ... the rest of pass setup ...
  }

Cg snippets

Cg 프로그램 미리보기는 CGPROGRAMENDCG사이에서 쓰여집니다.

미리보기의 시작에서 컴파일 지시어는 #pragma 문장으로 주어질 수 있습니다. Unity에 의해 인식되어지는 지시어는 다음과 같습니다:

  • #pragma vertex name - 함수 name가 꼭지점 프로그램임을 나타냅니다.
  • #pragma fragment name - 함수 name가 프래그멘트 프로그램임을 나타냅니다.
  • #pragma fragmentoption option - 컴파일된OpenGL 프래그먼트 프로그램에 option을 추가합니다. 사용가능한 옵션의 리스트를 위해서 ARB fragment program 상세 내용을 살펴보시기 바랍니다. 이 지시어는 꼭지점 프로그램이나OpenGL이 아닌 타겟으로 컴파일된 프로그램에서는 영향을 가지지 않습니다.
  • #pragma target name - 어떤 쉐이더 타겟이 컴파일이 될지를 나타냅니다. 자세한 내용을 위해서 shader targets를 살펴보시기 바랍니다.
  • #pragma only_renderers space separated names - 주어진 렌더러만을 위한 쉐이더를 컴파일합니다. 기본적으로 쉐이더는 모든 렌더러를 위해서 컴파일 됩니다. 자세한 내용을 위해서 renderers를 살펴보시기 바랍니다.
  • #pragma exclude_renderers space separated names - 주어진 렌더러들을 위해서 쉐이더를 컴파일하지 않습니다. 기본적으로 쉐이더는 모든 렌더러를 위해서 컴파일 됩니다. 자세한 내용을 위해서 renderers를 살펴보시기 바랍니다.

각각 미리보기는 꼭지점 프로그램이나 프래그먼트 프로그램 또는 둘 다를 포함해야만 합니다. 그러므로 #pragma vertex 또는 #pragma fragment 지시어가 또는 둘 다 필요되어 집니다.

Shader targets

기본적으로 Unity는 동등한 쉐이더 모델 1.1로 꼭지점 프로그램을 컴파일하고 쉐이더 모델 2.0으로 프래그먼트 프로그램을 컴파일 합니다. #pragma target을 사용하는 것은 쉐이더가 다른 레벨로 컴파일 되는 것을 허락합니다. 현재 이러한 타겟들이 지원됩니다:

  • #pragma target default - 기본 타겟으로 컴파일:
    • Direct3D 9에서 Vertex shader 1.1 그리고 pixel shader 2.0.
    • 128 인스트럭션 제한을 가진 ARB_vertex_program 그리고 96 인스트럭션 제한을 가진 ARB_fragment_program (32 텍스쳐+ 64 산수), 16 일시적인 레지스터와 4 텍스쳐 우회.
  • #pragma target 3.0 - 쉐이더 모델 3.0으로 컴파일:
    • Direct3D 9에서 Vertex shader 3.0 그리고 pixel shader 3.0.
    • 인스트럭션 제한을 가지지 않는 ARB_vertex_program 그리고1024인스트럭션 제한을 가진ARB_fragment_program (512텍스쳐+ 512산수), 32일시적인 레지스터와4 텍스쳐 우회. #pragma profileoption directive 지시어를 사용해서 이러한 제한을 덮어쓰는 것은 가능합니다. 예 #pragma profileoption MaxTexIndirections=256은 텍스쳐 우회 제한을 256으로 올립니다. derivative 지시사항과 같은 몇몇 셰이더 모델 3.0 기능들은 ARB_vertex_program/ARB_fragment_program 에 의해 지원되지 않습니다. 당신은 제한이 덜한 GLSL로 대신 번역하기 위해 #pragma glsl를 사용할 수 있습니다. 3.0 타겟으로 컴파일 할 때 꼭지점과 프래그먼트 프로그램 둘 모두 존재해야 합니다.

Renderers

Unity는 몇몇의 렌더링APIs를 지원하고 (예. Direct3D 9 와 OpenGL), 기본적으로 모든 쉐이더 프로그램은 지원되는 렌더러를 위해서 컴파일 되어 집니다. 사용자는 어떤 렌더러가 컴파일되는지 #pragma only_renderers 또는 #pragma exclude_renderers 을 사용해서 지정할 수 있습니다. 이것은 사용자가 오직Mac OS X(Direct3D은 없습니다)만을 타겟으로 할 것이라는 것을 안다면 또는 오직Windows만을(Unity가 D3D을 기본적으로 정하는 곳에서) 또는 어떤 특별한 쉐이더만이 오직 가능하다면 매우 유용합니다. 현재 지원되는 렌더러의 이름은 다음과 같습니다:

  • d3d9 - Direct3D 9.
  • opengl - OpenGL.
  • gles - OpenGL ES 2.0.
  • xbox360 - Xbox 360.
  • ps3 - PlayStation 3.
  • flash - Flash.

예를 들어 이 라인은 쉐이더를D3D9 모드로 오직 컴파일 할 것입니다:

  #pragma only_renderers d3d9

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

Color, Material, Lighting (fixed funtion)  (0) 2012.07.12
Performance Tips when Writing Shaders  (0) 2012.07.12
Blending  (0) 2012.06.25
Fallback  (0) 2012.05.21
RenderTech-VertexLit  (0) 2012.05.17
Posted by 프리랜서 디자이너