Unity Shader Study Day-01

Graphics Programming 2019. 3. 31. 20:35
반응형

https://ko.wikipedia.org/wiki/%EC%85%B0%EC%9D%B4%EB%8D%94

Shader(셰이더)란 무엇인가? 
컴퓨터 그래픽스 분야에서 셰이더(shader)는 소프트웨어 명령의 집합으로 주로 그래픽 하드웨어의 렌더링 효과를 계산하는 쓰인다.
셰이더는 그래픽 처리장치 (GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 프로그래밍하는데 쓰인다.
셰이더는 3차원 모델링에서 광원과 그림자를 만드는 일반적으로 사용됨

 

 

https://thebookofshaders.com/01/?lan=kr

 

The Book of Shaders

Gentle step-by-step guide through the abstract and complex universe of Fragment Shaders.

thebookofshaders.com

셰이더는 명령어들의 집합이다.
이 명령어들은 스크린위에 낱개의 픽셀마다 실행되고 이 실행이 모두 한번에 일어난다는점이다.
명령어들은 스크린위에 필셀의 위치마다 연산이 달라진다는 말이다 
셋들 자체가 스크린 픽셀 위치를 받고 색을 출력하는 하나의 프로그램이자 함수.
컴파일된 이프로그램은 아주 빠름


"픽셀의 위치를 연산하여 스크린에 색을 출력하는 명령어"


"구텐베르크의 인쇄기술과 같다"


 

 

 

[Unity 2019.1.0b6]


Shader
└ Standard Surface Shader 
└ Unlit Shader 
└ Image Effect Shader
└ Compute Shader 
└ Shader Variant Collection 

http://blog.naver.com/PostView.nhn?blogId=heartybrain1&logNo=221171500861

[Unlit Shader]

Unity의 Unlit Shader는 라이트의 영향을 받지 않는 쉐이더
기본 Standard 쉐이더를 사용하는 오브젝트는 씬의 라이트와 엠비언트에 영향을 받는다.

엠비언트?

http://rapapa.net/?p=2525

3D화면에서 빨간색 공이 제대로 그려지려면 공이 가지는 본래 색과 함께 빛의 영향력을 추가로 적용해서 최종적인 색깔이 나오게 된다.

3D Graphics에서 물체가 가지는 최종적인 색상을 이야기 할때 4가지로 구분한다.
Ambient Color
Diffuse Color
Specular Color
Emissive Color


Ambient Color는 환경에 산란하여 물체가 발하는 평균 색상 혹은 고정 색상이다.
그러므로 물체에 비치는 특정 및에 의해서 영향을 받지 않고 모든 버텍스에 댈해서 동일한 강도를 가진다.
이 색상은 물체의 모든 면에 닿는 강도가 같고 방향이 없다. 그래서 Ambient Color만 적용하여 렌더링한 물체는 Flat한 2D Object처럼 보이게 된다.
그래서 Ambient Color를 물체가 빛을 받지 않는 영역인 어두운 쪽의 색상이라고 한다.



http://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter03.html


이 장에서는 일련의 간단한 버텍스 및 프래그먼트 프로그램을 통해 Cg 개념을 계속 제시합니다. 이 장에는 다음 세 단원이 있습니다. "매개 변수"는 Cg 프로그램이 매개 변수를 처리하는 방법을 설명합니다. "텍스처 샘플러"에서는 프래그먼트 프로그램이 텍스처에 액세스하는 방법을 설명합니다. "수학 표현식"은 수학 표현식이 새로운 정점 및 단편 값을 계산하는 방법을 보여줍니다.

 

 

The Cg Tutorial - Chapter 3. Parameters, Textures, and Expressions

Unary operators: negation, increment, decrement, positive, negative, indirection, address, cast

developer.download.nvidia.com

매개 변수 2 장의 C2E1v_green 및 C2E2f_passthrough 예제는 매우 기본입니다.

이제 추가 매개 변수를 소개하기 위해 이러한 예제를 확장 할 것입니다.

 

3.1.1 균일 매개 변수 C2E1v_green (2 장의 38 페이지 참조)은 항상 정점 색상에 녹색을 지정합니다.

C2E1v_green 프로그램의 이름을 변경하고 OUT.color의 값을 할당하는 선을 변경하면 잠재적으로 원하는 모든 색상에 대해 다른 정점 프로그램을 만들 수 있습니다.

예를 들어, 적절한 라인을 변경하면 핫 핑크 쉐이더가 생성됩니다.   

OUT.color = float4 (1.0, 0.41, 0.70, 1.0);

// RGBA 핫 핑크 세상은 다채 롭기 때문에 햇볕 아래 모든 색상에 대해 다른 Cg 프로그램을 작성하고 싶지는 않을 것입니다.

대신, 현재 요청한 색상을 나타내는 매개 변수를 전달하여 프로그램을 일반화 할 수 있습니다.

예제 3-1의 C3E1v_anyColor 정점 프로그램은 응용 프로그램이 특정 상수 색상이 아닌 임의의 색상에 지정할 수있는 constantColor 매개 변수를 제공합니다.

예제 3-1. C3E1v_anyColor 정점 프로그램

 

 

 

 

SubShader, Tags, Pass

CGPROGRAM / ENDCG

Vertex Shader function 
#pragma vertex vert 

Pixel Shader function 
#pragma fragment frag 

Demo - output red from Pixel Shader 
return float4(1,0,0,1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Shader "Unlit/TestShader"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }  
 
        Pass
        {
            CGPROGRAM
            #pragma vertex vs_main    //vertex shader main
            #pragma fragment ps_main    //pixel shader main
 
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 vertex : SV_POSITION;
            };
 
            v2f vs_main (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }
 
            fixed4 ps_main (v2f i) : SV_Target
            {
                return float4(1,1,0,1);
            }
            ENDCG
        }
    }
}
 
 
 

OpenGL Pipeline

Vertex Shader 

Fragment Shader 

 

Data Type

Scalar Types
float - floating point(32bits)
int - integer 
bool -true/false
half - floating point (16bits)
fixed - fixed point (11bits)

Vector types (also for color)
float4 - xyzw, rgba
float3 - xyz, rgb
float2 - xy, rg
int2/3/4, half2/3/4 ...etc

Matrix Types
float4x4 - translate, rotate, scale, projection
float4x3 - without projection
float 3x3 - without projection, translate

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
    public Material mat;
 
    // Start is called before the first frame update
    void Start()
    {
        
    }
 
    // Update is called once per frame
    void Update()
    {
        if (mat != null)
        {
            mat.SetFloat("test"Time.time);
        }
    }
}
 
 
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Unity ShaderLab Property
 
//float property
 
Properties
{
    my_var("My Lovely Variable"float= 0
}
 
//Slider in Inspector 
 
Properties
{
    my_var("My Lovely Variable", range(0,1)) = 0
}
 
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Shader "Unlit/TestShader"
{
    Properties
    {
        test("my testing"float= 0;
    }
 
    SubShader
    {
        Tags { "RenderType"="Opaque" }  
 
        Pass
        {
            CGPROGRAM
            #pragma vertex vs_main    //vertex shader main
            #pragma fragment ps_main    //pixel shader main
 
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 vertex : SV_POSITION;
            };
 
            v2f vs_main (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }
 
            float test;
 
            fixed4 ps_main (v2f i) : SV_Target
            {
                return float4(test, 000.1);
            }
            ENDCG
        }
    }
}
 
 
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Shader "Unlit/TestShader"
{
    Properties
    {
        test("my testing"float= 0
    }
 
    SubShader
    {
        Tags { "RenderType"="Opaque" }  
 
        Pass
        {
            CGPROGRAM
            #pragma vertex vs_main    //vertex shader main
            #pragma fragment ps_main    //pixel shader main
 
            #include "UnityCG.cginc"
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 vertex : SV_POSITION;
            };
 
            v2f vs_main (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }
 
            float test;
 
            fixed4 ps_main (v2f i) : SV_Target
            {
                return float4(test, 000.1);
            }
            ENDCG
        }
    }
}
 
 
 

반응형

'Graphics Programming' 카테고리의 다른 글

셰이더 시맨틱  (0) 2019.04.27
Shader - Always Visible - [Tutorial][C#]  (0) 2019.04.25
[pdf] Cg-3.1_April2012_ReferenceManual  (0) 2019.04.02
[pdf] CgUsersManual  (0) 2019.04.02
: