vertex fragment program basic

vertex/fragment program¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ. vertex/fragment programÀº vertex&pixel shader¿Í °°Àº Àǹ̶ó°í »ý°¢ÇÏ¸é µÈ´Ù.

¹öÅؽº ÇÁ·Î±×·¥ = ¹öÅؽº ¼ÎÀÌ´õ
Çȼ¿ ÇÁ·Î±×·¥ = Çȼ¿ ¼ÎÀÌ´õ

¹öÅؽº/ÇÁ·¡±×¸ÕÆ® ¼ÎÀÌ´õ ÇÔ¼öÀÇ ±¸Á¶ÀÌ´Ù.
CGPROGRAM ~ ENDCG »çÀÌ¿¡ Cg Äڵ带 ³ÖÀ¸¸é µÈ´Ù.

Shader "MyCustomShader"  
{
    SubShader
    {
        Pass
        {
            // ... ¿©·¯°¡Áö pass°ü·Ã ¼³Á¤...

            CGPROGRAM
            //Cg code ...
            ENDCG

            // ... pass ¸®¼Â °ü·Ã ¼³Á¤...
        }
    }
}

CGPROGRAM ~ ENDCG¸¦ ±¸Á¶¸¦ ÀÚ¼¼ÇÏ°Ô º¸¸é ´ÙÀ½°ú °°´Ù.
#pragma vertex Áö½ÃÀÚ´Â vertfunc ¶ó´Â ¹öÅؽº ÇÁ·Î±×·¥(¼ÎÀÌ´õ ÇÔ¼ö)À» ÁöÁ¤ÇÑ´Ù.
#pragma fragment Áö½ÃÀÚ´Â fragmentfunc ¶ó ÇÁ·¡±×¸ÕÆ® ÇÁ·Î±×·¥(¼ÎÀÌ´õ ÇÔ¼ö)À» ÁöÁ¤ÇÑ´Ù.

CGPROGRAM

        #pragma vertex vertfunc
        #pragma fragment fragmenfunc

        // ¿©±â¿¡ Cg code

ENDCG

±× ¹ÛÀÇ Áö½ÃÀÚµéÀº #pragma target, #pragma only_renderers, #pragma exclude_renderersµîÀÌ ÀÖ´Ù.

À¯´ÏƼ´Â ±âº»ÀûÀ¸·Î 2.0 ¹öÀü¿¡ ¸ÂÃß¾î ÄÄÆÄÀÏ ÇÑ´Ù. ¸¸¾à ´Ù¸¥ ¹öÀüÀ¸·Î ÄÄÆÄÀÏÀ» ¿øÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÑ´Ù.

#pragma target 3.0

À¯´ÏƼ Áö¿øÇÏ°í ÀÖ´Â ·»´õ·¯µé(d3d9, OpenGL  µîµî)¿¡ ´ëÇؼ­ ¸ðµç ¼ÎÀÌ´õµéÀ» ÄÄÆÄÀÏ ÇÏ°Ô µÈ´Ù.
#pragma only_renderers, #pragma exclude_renderers¸¦ ÀÌ¿ëÇÏ¿© ƯÁ¤ ·»´õ·¯µé¿¡ ´ëÇؼ­¸¸ ÄÄÆÄÀÏ Çϰųª ÄÄÆÄÀÏ ÇÏÁö ¾Êµµ·Ï ÇÒ¼ö ÀÖ´Ù.
ÇöÀç Áö¿øÇÏ´Â ·»´õ·¯µéÀº d3d9, d3d11, opengl, gles, xbox360, ps3, flash, gles3, metalÀÌ ÀÖ´Ù.

xbox360°ú ps3 ·»´õ·¯ ´ëÇؼ­ ÄÄÆÄÀÏÀ» Á¦¿Ü ÇÒ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

#pragma exclude_renderers   xbox360 ps3

¿©·¯ ÄÄÆÄÀÏ Áö½ÃÀÚ¸¦ »ç¿ëÇÑ ¿¹´Â ´ÙÀ½°ú °°´Ù.

Shader "MyCustomShader"  
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
               #pragma vertex vertfunc
               #pragma fragment fragmenfunc
               #pragma target 3.0
               #pragma exclude_renderers   xbox360 ps3

               // add Cg code

            ENDCG
        }
    }
}

½ÇÁ¦ ¼ÎÀÌ´õ¸¦ Àû¿ëÇÑ ¿¹¸¦ º¸ÀÚ.
¸Þ½Ã¸¦ »¡°£»öÀ¸·Î ±×¸®´Â ¼ÎÀÌ´õÀÌ´Ù.

Shader "Custom/TestShader"
{
  SubShader
  {
    Pass    
    {
        CGPROGRAM
        #pragma vertex vertfunc
        #pragma fragment fragfunc            
    
        float4 vertfunc(float4 vertexPos : POSITION) : SV_POSITION
        {
            return mul(UNITY_MATRIX_MVP, vertexPos);
        }

        float4 fragfunc(void) : COLOR
        {
            return float4(1.0, 0.0, 0.0, 1.0);
        }
        ENDCG
    }
  }
}

¹öÅؽº ÇÁ·Î±×·¥À» ±¸Á¶Ã¼À» ÀÌ¿ëÇؼ­ ÀԷ°ú Ãâ·ÂÀ» ³Ñ±â´Â ÄÚµå·Î ¹Ù²Ù¸é ´ÙÀ½°ú °°´Ù.

Shader "Custom/TestShader"
{
  SubShader
  {
    Pass    
    {
        CGPROGRAM
        #pragma vertex vertfunc
        #pragma fragment fragfunc            
    
        struct VertInput {
            float4 pos : POSITION;
        };
        struct VertOutput {
            float4 pos : SV_POSITION;
        };


        VertOutput vertfunc(VertInput input)
        {
            VertOutput o;
            o.pos = mul(UNITY_MATRIX_MVP, input.pos);
            return o;
        }

        float4 fragfunc(void) : COLOR
        {
            return float4(1.0, 0.0, 0.0, 1.0);
        }
        ENDCG
    }
  }
}

¹öÅؽº/ÇÁ·¡±×¸ÕÆ® ¼ÎÀÌ´õ ÇÔ¼öÀÇ ±¸Á¶¿¡ ´ëÇؼ­ ¾Ë¾Æº¸¾Ò´Ù.
¼ÎÀÌ´õ ÇÁ·Î±×·¥ÀÇ ¾Ë°í¸®ÁòÀº ´ÙÀ½¿¡ ¾Ë¾Æº»´Ù.

ÂüÁ¶)
http://jinhomang.tistory.com/54
http://docs.unity3d.com/kr/current/Manual/SL-ShaderPrograms.html