'Shader'에 해당되는 글 69건

  1. 2017.03.14 쉐이더 LOD(Shader Level of Detail)
  2. 2017.02.23 쉐이더 포지 TRANSFORM_TEX()
  3. 2015.07.21 7. Reflaction Shader(사내 교육용으로 작성한 PPT) (3)
  4. 2015.07.06 6. Alpha Bland & Alpha Test(사내 교육용으로 작성한 PPT)
  5. 2015.07.06 5. texture Mask & Vertex Color Mask(사내 교육용으로 작성한 PPT)
  6. 2015.07.06 4. Normal Map & Emision & reflection(사내 교육용으로 작성한 PPT)
  7. 2015.07.06 3. Specular & Fake BDRF(사내 교육용으로 작성한 PPT)
  8. 2015.07.06 2 – Lambert Light & Half Lambert Light(사내 교육용으로 작성한 PPT)
  9. 2015.07.06 1 – Vertex Shader & Pixel Shader(사내 교육용으로 작성한 PPT)
  10. 2013.06.20 유니티 라이트 프로브 셰이더 예제
  11. 2013.04.22 유니티 surface shader로 Unlit shader 만들기.
  12. 2012.12.12 셰이더 프로그래밍 입문-11(마지막단원) (1)
  13. 2012.12.10 셰이더 프로그래밍 입문-10
  14. 2012.12.04 셰이더 프로그래밍 입문-9
  15. 2012.12.03 셰이더 프로그래밍 입문-8
  16. 2012.11.27 셰이더 프로그래밍 입문-7
  17. 2012.11.21 셰이더 프로그래밍 입문-6
  18. 2012.11.19 셰이더 프로그래밍 입문-5
  19. 2012.11.16 셰이더 프로그래밍 입문-4
  20. 2012.11.14 셰이더 프로그래밍 입문-3 (2)
  21. 2012.11.13 셰이더 프로그래밍 입문-2
  22. 2012.11.12 셰이더 프로그래밍 입문-1
  23. 2012.08.27 unity surface shader 공부 7 - surface shader custom Light 예제 따라하기
  24. 2012.08.24 unity surface shader 공부 6 - surface shader custom Light 예제 따라하기
  25. 2012.08.24 Custom Lighting models in Surface Shaders
  26. 2012.08.21 unity surface shader 공부 5 - surface shader 예제 따라하기
  27. 2012.08.20 unity surface shader 공부 4 - surface shader 예제 따라하기
  28. 2012.08.17 unity surface shader 공부 3 - surface shader 예제 따라하기
  29. 2012.07.27 unity surface shader 공부 2 - surface shader 예제 따라하기
  30. 2012.07.26 unity surface shader 공부 1 - surface shader 예제 따라하기

쉐이더 LOD(Shader Level of Detail)

쉐이더 Level of Detail (LOD)은 LOD 값이 정해진 임계 값 이하인 경우, 쉐이더 또는 서브 쉐이더를 사용합니다.

기본적으로 허용되는 LOD 레벨은 제한이 없으며, 사용자의 하드웨어에서 지원하는 모든 쉐이더를 사용할 수 있습니다. 그러나 어떤 경우에는 비록 하드웨어가 지원하는 경우에도 쉐이더의 디테일을 떨어뜨리고 싶은 경우가 있습니다. 예를 들어, 저렴한 그래픽 카드에서 모든 기능이 지원되지만, 속도가 너무 느린 경우가 있습니다. 그래서 parallax normal 매핑을 사용하고 싶지 않은 경우 들수 있습니다.

Shader LOD는 개별 쉐이더마다 설정(Shader.maximumLOD를 사용하여) 하거나 모든 쉐이더에서 전역으로 사용([Shader.globalMaximumLOD](../ScriptReference/Shader -globalMaximumLOD.html)를 사용하여)할 수 있습니다.

사용자가 만든 사용자 지정 쉐이더에서는 LOD 명령을 사용하여 어떤 서브 쉐이더에서나 LOD 값을 설정할 수 있습니다.

Unity 내장 쉐이더는 LOD가 다음과 같이 설정되어 있습니다 :

  • VertexLit 종류의 쉐이더 = 100
  • Decal, Reflective VertexLit = 150
  • Diffuse = 200
  • Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
  • Bumped, Specular = 300
  • Bumped Specular = 400
  • Parallax = 500
  • Parallax Specular = 600


'Shader > 유니티셰이더레퍼런스' 카테고리의 다른 글

쉐이더 LOD(Shader Level of Detail)  (0) 2017.03.14
Custom Lighting models in Surface Shaders  (0) 2012.08.24
SurfaceShaderLighting  (0) 2012.07.26
SurfaceShaders  (0) 2012.07.26
한방에 모아보는 레퍼런스  (1) 2012.07.20
Pass  (0) 2012.07.19
Posted by monsters

댓글을 달아 주세요

Shader/Shader자료2017.02.23 20:16


float3 emissive = tex2D(_MainTexture,TRANSFORM_TEX(node_21.rg, _MainTexture)).rgb;



This line belongs to the fragment shader portion of the shader-combo, which means that this line is run for every pixel. Shader Forge currently has a tendency to do most of its calculations in the fragment shader, keeping only computations which regard the vertices themselves in the vertex shader. This doesn't have to be the case! Considering you often have more pixels to draw for rendering the object than the vertices which make up the model, you can save a lot of calculations by moving them over to the vertex shader. "But of course you need to do texture-lookups for every pixel" you might think for yourself (or out loud). This is of course true, but we certainly don't need to run the TRANSFORM_TEX function every pixel. It handles the Tiling & Offset inputs in the Material inspector. Best of all would be to get rid of it entirely, so if you're not using those inputs (which is often the case) you can just change that line to:



구글 번역


이 선은 셰이더 콤보의 조각 셰이더 부분에 속합니다. 즉이 선은 모든 픽셀에 대해 실행됩니다. 

Shader Forge는 현재 프래그먼트 셰이더에서 대부분의 계산을 수행하는 경향이 있으며 정점 셰이더에서 정점 자체를 고려한 계산 만 유지합니다. 

이것은 사실 일 필요는 없습니다! 


모델을 구성하는 정점보다 오브젝트 렌더링을 위해 더 많은 픽셀을 그리는 경우가 많으므로 정점 셰이더 위로 이동하여 많은 계산을 저장할 수 있습니다. 


"물론 모든 픽셀에 대해 텍스처 조회를 수행해야합니다."라고 생각할 수도 있습니다. 이것은 물론 사실이지만 TRANSFORM_TEX 함수를 모든 픽셀마다 실행할 필요는 없습니다. 


머티리얼 속성에서 타일링 및 오프셋 입력을 처리합니다. 


무엇보다도 가장 좋은 점은 완전히 없애 버리는 것입니다. 입력을 사용하지 않을 경우 (그 경우가 많음) 해당 행을 다음과 같이 변경할 수 있습니다.



수정 UV 코드(픽셀 -> 버텍스)

o.uv0 = v.texcoord0;   =>  o.uv0 = TRANSFORM_TEX(v.texcoord0, _NormalMap_A);

'Shader > Shader자료' 카테고리의 다른 글

쉐이더 포지 TRANSFORM_TEX()  (0) 2017.02.23
유니티 라이트 프로브 셰이더 예제  (0) 2013.06.20
Texture Matrix in Fixed Function  (0) 2012.07.18
HLSL 함수  (0) 2012.07.10
Blending modes..참고 자료  (0) 2012.06.08
기초적인 조명쉐이더  (0) 2012.06.08
Posted by monsters

댓글을 달아 주세요

 

 

 

 

 

 

 

 

 

0123

 

Posted by monsters

댓글을 달아 주세요

  1. 저 내용으로 셰이더 포지 버전으로 만들어서 강의하는구나 ㅋㅋㅋ

    2015.07.30 14:00 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • ㅋㅋ 넵 부족하지만 아는선에서 하고있어요.;;
      더 친절히 잘 알고싶다면 형 강좌 보라고 알려주고있어요. ㅋㅋ

      2015.08.05 01:04 신고 [ ADDR : EDIT/ DEL ]
  2. ㅋㅋㅋ 그 내용도 이젠 구식이라...

    2015.08.05 01:06 신고 [ ADDR : EDIT/ DEL : REPLY ]

 

01234567891011

 

Posted by monsters

댓글을 달아 주세요

 

012345678910

 

Posted by monsters

댓글을 달아 주세요

 

01234567891011121314

 

Posted by monsters

댓글을 달아 주세요

Shader/Shader자료2013.06.20 10:59

유니티 라이트 프로브 셰이더 예제

 

 

 

 

플레그먼트

 

Shader "Probes" {
Properties {
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_SHLightingScale("LightProbe influence scale",float) = 1
}

SubShader {
Tags { "RenderType"="Opaque" "LightMode"="ForwardBase"}
LOD 100

CGINCLUDE
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;

float _SHLightingScale;

struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed3 spec : TEXCOORD1;
fixed3 SHLighting: TEXCOORD2;
};


v2f vert (appdata_full v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;
float3 worldNormal = mul((float3x3)_Object2World, v.normal);
float3 shl = ShadeSH9(float4(worldNormal,1));
o.SHLighting = shl * _SHLightingScale;

return o;
}
ENDCG

Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
fixed4 frag (v2f i) : COLOR
{
fixed4 c = tex2D (_MainTex, i.uv);

c.rgb *= i.SHLighting;

return c;
}
ENDCG 
}
}
}

 

 

 

서피스

 

Shader "Custom/ModifyLightProbes" {

 

Properties {  _Color ("Main Color", Color) = (1,1,1,1)      

         _MainTex ("Base (RGB)", 2D) = "white" {} 

  _Amount ("SH scale", Float) = 1   

}   

 

SubShader {  

      Tags { "RenderType"="Opaque" }       

LOD 200               

CGPROGRAM       

#pragma surface surf Lambert noambient vertex:vert       

#pragma debug        

 

sampler2D _MainTex;       

fixed4 _Color;       

float _Amount;        

 

struct Input {  

float2 uv_MainTex;           

float3 shLight;       

 };               

 

 

void vert (inout appdata_full v, out Input o) {

            // evaluate SH light           

float3 worldN = mul ((float3x3)_Object2World, SCALED_NORMAL);           

o.shLight = ShadeSH9 (float4 (worldN, 1.0));       

}        

 

 

 

void surf (Input IN, inout SurfaceOutput o) {           

half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;           

     o.Albedo = c.rgb;           

o.Alpha = c.a;                       

 

// modify the SH lighting anyway you want,           

// here's just simple scaling           

float3 shLight = _Amount * IN.shLight;       

                

// emission is just added to the final color,           

     // so SH light needs to be multiplied by albedo           

o.Emission = o.Albedo * shLight; 

     

}       

ENDCG   

 }   

FallBack "Diffuse"

}

 

 

 

'Shader > Shader자료' 카테고리의 다른 글

쉐이더 포지 TRANSFORM_TEX()  (0) 2017.02.23
유니티 라이트 프로브 셰이더 예제  (0) 2013.06.20
Texture Matrix in Fixed Function  (0) 2012.07.18
HLSL 함수  (0) 2012.07.10
Blending modes..참고 자료  (0) 2012.06.08
기초적인 조명쉐이더  (0) 2012.06.08
Posted by monsters

댓글을 달아 주세요

유니티 surface shader로 Unlit shader 만들기.

 

회사에서 Unlit 물 셰이더가 필요해서 버텍스 프랴그먼트로 짜려다 너무 귀찮아서 구글 뒤져보니... 커스텀 라이팅으로 unlit을 만들더군요...  저장!!

 

 

CGPROGRAM
 #pragma surface surf NoLighting 

.

.

중략

.

.

 fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten){
         fixed4 c;
         c.rgb = s.Albedo;
         c.a = s.Alpha;
         return c;   
         }

 

기억해두자~

Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.12.12 14:22

외곽선 찾기와 양각효과

 

외곽선찾기

대에충 픽셀의 병도 대비를 이용해 외곽선을 찾는다 인데.....

과정이 뭔소린지 이해가 안된다... 걍 일딴 따라하기 정도로 끝을 내야지.. 잘 모르겠넹....

지난번 세피아 효과에서 세피아 패스만 삭제하고, 변수 추가만 있고 나버진 전부 같다....

흑백 패스에서 픽셀셰이더 코드반 변경.............

 

 

흑백효과  픽셀셰이더 코드

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
};


float3x3 Kx = {-1,0,1,
               -2,0,2,
               -1,0,1};
              
              
float3x3 Ky = {1,2,1,
               0,0,0,
             -1,-2,-1};

              
sampler2D SceneSampler;

float2 gPixelOffset;

float4 ps_main(PS_INPUT Input) : COLOR{
  
   float Lx = 0;
   float Ly = 0;
  
   for( int y = -1; y<=1; ++y ){
      for( int x = -1; x <=1; ++x ){
         float2 offset = float2(x,y) * gPixelOffset;
         float3 tex = tex2D(SceneSampler, Input.mUV + offset).rgb;
         float luminance = dot(tex, float3(0.3,0.59,0.11));
        
         Lx += luminance * Kx[y+1][x+1];
         Ly += luminance * Ky[y+1][x+1];
      }
   }
  
   float L = sqrt((Lx*Lx) + (Ly*Ly));
   return float4(L.xxx,1);
}

 

 

결과

 

 

 

 

 

 

 

 

양각효과

위에 패스를 복사해 패스 추가후 수정....이것역시 왹곽선 찻기로 나온 것을 포토샵의 양각효과처럼 표현한것임....

조금은 이해가지만 잘 몰겠심 ㅜㅜ 헐;;

 

 

양각효과 픽셀셰이더 코드

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
};


float3x3 K =  {-2,-1,0,
               -1,0,1,
               0,1,2 };
              
              
              
              
sampler2D SceneSampler;

float2 gPixelOffset;

float4 ps_main(PS_INPUT Input) : COLOR{
  
   float res = 0;
  
   for( int y = -1; y<=1; ++y ){
      for( int x = -1; x <=1; ++x ){
         float2 offset = float2(x,y) * gPixelOffset;
         float3 tex = tex2D(SceneSampler, Input.mUV + offset).rgb;
         float luminance = dot(tex, float3(0.3,0.59,0.11));
        
         res += luminance * K[y+1][x+1];
      }
   }
  
   res += 0.5f;
   return float4(res.xxx,1);
}


 

 

 

 

결과

 


 

 

 

셰이더 입문 도 이걸로 끝났다...... 물론 다 이해 한것은 아니지만 이다음으로 공부할 이론과 자주 사용하는 함수를 정리하면서 익히자..... 역시 디자이너는 꺼꾸로 배워야 편한듯 ㅎ;; 공부는 힘들어~

 

 

 

 

 

셰이더 프로그래밍 입문 끝!!!

 

 

 

 

 

 

 

 

 

 

Posted by monsters

댓글을 달아 주세요

  1. 가미

    수고하셨습니다! 잘보고갑니다 ^^

    2012.12.21 16:18 [ ADDR : EDIT/ DEL : REPLY ]

Shader/HLSL Shader2012.12.10 14:29

영상처리 기법 흑백/세피아 사진 만들기

 

정점 셰이더

 

struct VS_INPUT{
   float4 mPosition : POSITION;
   float2 mUV : TEXCOORD0;
};

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float2 mUV : TEXCOORD0;
};

VS_OUTPUT vs_main (VS_INPUT Input){
   VS_OUTPUT Output;
  
   Output.mPosition = Input.mPosition;
   Output.mUV = Input.mUV;
  
   return Output;
}

 

//처음부터 투영좌표에 메쉬가 생성되어있기 때문에 정점좌표와 uv만 입출력한다.

//책 참고~

 

픽셀 셰이더

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
};

sampler2D SceneSampler;

float4 ps_main(PS_INPUT Input) : COLOR{
   float4 tex = tex2D(SceneSampler, Input.mUV);
   return tex;
}

//랜더첵스쳐된  SceneSampler 텍스쳐를 입혀준다.

 

 

 

흑백 만들기 /픽셀 셰이더

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
};

sampler2D SceneSampler;

float4 ps_main(PS_INPUT Input) : COLOR{
   float4 tex = tex2D(SceneSampler, Input.mUV);
//   tex.rgb = (tex.r + tex.g + tex.b ) /3;
//   tex.rgb = tex.r * 0.3 + tex.g * 0.59 + tex.g * 0.11;
   tex.rgb = dot(tex.rgb, float3(0.3,0.59,0.11));
   return tex;
}

//흑백으로만들어주는 공식에따라 구현

//dot 공식으로 변경하면 더 빠르다고 함.

 

 

 

 

 

 

 

 

 

세피아 만들기/픽셀 셰이더

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
};

sampler2D SceneSampler;

float4 ps_main(PS_INPUT Input) : COLOR{
   float4 tex = tex2D(SceneSampler, Input.mUV);
  
     float4 sepia;
 //  sepia.a = tex.a;
 //  sepia.r = tex.r * 0.393f + tex.g * 0.769f + tex.b * 0.189f;
 //  sepia.g = tex.g * 0.349f + tex.g * 0.686f + tex.b * 0.168f;
 //  sepia.b = tex.b * 0.272f + tex.g * 0.534f + tex.b * 0.131f;
  
   sepia.a = tex.a;
   sepia.r = dot(tex.rgb, float3(0.393f,0.769f,0.189f));
   sepia.g = dot(tex.rgb, float3(0.349f,0.686f,0.168f));
   sepia.b = dot(tex.rbb, float3(0.272f,0.534f,0.131f));
  
   return sepia;
}

//마이크로소프트(?)가 권한 세피아 색만들기 공식으로 구현

//dot공식으로 변경해주면 더 빠르다고함.

 

 

 

 

...다음은...외곽선 찾기와 양각효과.....면 이책도 끝이군.... 그다음엔 자주 사용하는 공삭들 정리해놔야겠네....이론이 부족하니 깊이가 없어;;

 

 

 

 

Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.12.04 14:17

그림자 기법을 평정한 그림자매핑

 

 

-요약 이론-

그림자 생성단계

1. 랜더링 결과 (빛을 가로막은 첫번째 물체의 깊이)를 저장할 랜더 타깃을 정해준다.

2. 카메라를 광원 위치에 두고 물체들을 그린다.

3. 픽셀 셰이더에서 빛으로부터 현재 픽셀까지의 깊이를 반환한다.

 

그림자 적용단계

1. 랜더링 결과(일반 장면랜더링)를 화면(백버퍼)에 저장한다.

2. 카메라를 눈 위치에 두고 물체를 그린다.

3. 빛으로부터 현재 픽셀까지의 깊이를 그림자맵에 담겨있는 결과와 비교한다. 현재 깊이가 그림자맵의 깊이보다 크면 그림자를 씌운다.

 

 

 

 

 

그림자만들기위한 정점 셰이더

 

struct VS_INPUT {
   float4 mPosition : POSITION;
};

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float4 mClipPosition : TEXCOORD1;
};

 

float4x4 gWorldMatrix;
float4x4 gLightViewMatrix;
float4x4 gLightProjectionMatrix;

float4 gWorldLightPosition;

 

 

VS_OUTPUT vs_main(VS_INPUT Input){
   VS_OUTPUT Output;
  
   float4x4 lightViewMatrix = gLightViewMatrix;
  
   float3 dirZ = -normalize(gWorldLightPosition.xyz);
   float3 up = float3(0,1,0);
   float3 dirX = cross(up, dirZ);
   float3 dirY = cross(dirZ, dirX);
  
   lightViewMatrix = float4x4(
      float4(dirX, -dot(gWorldLightPosition.xyz, dirX)),
      float4(dirY, -dot(gWorldLightPosition.xyz, dirY)),
      float4(dirZ, -dot(gWorldLightPosition.xyz, dirZ)),
      float4(0, 0, 0, 1));
   lightViewMatrix = transpose(lightViewMatrix);
  
   Output.mPosition = mul(Input.mPosition, gWorldMatrix);
   Output.mPosition = mul(Output.mPosition, lightViewMatrix);
   Output.mPosition = mul(Output.mPosition, gLightProjectionMatrix);
  
   Output.mClipPosition = Output.mPosition;
  
   return Output;

  
}
//gLightViewMatrix  = 대입할 시멘틱이 없어서 정점 셰이더에서 구현했다고함.

 

 

 

 

 

그림자만들기위한 픽셀 셰이더

 

struct PS_INPUT{
   float4 mClipPosition : TEXCOORD1;
};

 

 

float4 ps_main(PS_INPUT Input) : COLOR
{
  
   float Depth = Input.mClipPosition.z / Input.mClipPosition.w;
   return float4(Depth.xxx,1);
  
}

float4x4 gWorldMatrix;
float4x4 gLightViewMatrix;
float4x4 gLightProjectionMatrix;

float4 gWorldLightPosition;
//동차좌표에 있는 값을 화면상의 좌표값으로 사용하려면 w 값을 1로 바꿔 줘야한다.

 

 

 

 

 

 

 

 

 

그림자 입히기 위한 셰이더-원환체

 

정점 셰이더 코드

 


struct VS_INPUT{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
};

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float4 mClipPosition : TEXCOORD1;
   float mDiffuse : TEXCOORD2;
};

float4x4 gWorldMatrix;
float4x4 gLightProjectionMatrix;
float4x4 gLightViewMatrix;

float4 gWorldLightPosition;

float4x4 gViewProjectionMatrix;

 

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
 
   float4x4 lightViewMatrix = gLightViewMatrix;

   float3 dirZ = -normalize(gWorldLightPosition.xyz);
   float3 up = float3(0,1,0);
   float3 dirX = cross(up, dirZ);
   float3 dirY = cross(dirZ, dirX);
  
   lightViewMatrix = float4x4(
      float4(dirX, -dot(gWorldLightPosition.xyz, dirX)),
      float4(dirY, -dot(gWorldLightPosition.xyz, dirY)),
      float4(dirZ, -dot(gWorldLightPosition.xyz, dirZ)),
      float4(0, 0, 0, 1));
   lightViewMatrix = transpose(lightViewMatrix);

 

 

   float4 worldPosition = mul(Input.mPosition, gWorldMatrix);
   Output.mPosition = mul(worldPosition, gViewProjectionMatrix);

   Output.mClipPosition = mul(worldPosition, lightViewMatrix);
   Output.mClipPosition = mul(Output.mClipPosition, gLightProjectionMatrix);
  
   float3 lightDir = normalize(worldPosition.xyz - gWorldLightPosition.xyz);
   float3 worldNormal = normalize(mul(Input.mNormal, (float3x3)gWorldMatrix));
   Output.mDiffuse = dot(-lightDir, worldNormal);
  
   return Output;
  
}

 

 

 

픽셀 셰이더 코드

 

sampler2D ShadowSampler;
float4 gObjectColor;

struct PS_INPUT{
   float4 mClipPosition : TEXCOORD1;
   float mDiffuse : TEXCOORD2;
};

float4 ps_main(PS_INPUT Input):COLOR
{
   float3 rgb = saturate(Input.mDiffuse ) * gObjectColor;
   float currentDepth = Input.mClipPosition.z / Input.mClipPosition.w;
  
   float2 uv = Input.mClipPosition.xy /Input.mClipPosition.w;
   uv.y = -uv.y;
   uv = uv * 0.5 +0.5;
  
   float shadowDepth = tex2D(ShadowSampler, uv).r;
  
   if(currentDepth > shadowDepth + 0.0000125f){
      rgb *= 0.5f;
   }
  
   return float4(rgb,1.0f);
}

 

 

 

 

 

 

 

 

 

 

다음은...영상처리 기법.. 거의다 했구먼....입문편도.....

 

 

Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.12.03 14:01

UV 애니메이션과 울렁효과

 

정점 셰이더

 

struct VS_INPUT{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
   float2 mUV : TEXCOORD0;
};

 

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float2 mUV: TEXCOORD0;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

float gWaveHeight;
float gSpeed;
float gWaveFrequency;
float gUVSpeed;

//uv에니메이션과 울렁 효과를 위한 float 타입의 변수 4개 추가

 

float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;
float gTime;

float4 gWorldLightingPosition;
float4 gWorldCameraPosition;


VS_OUTPUT vs_main (VS_INPUT Input){
   VS_OUTPUT Output;
   
   float3 cosTimeX = gWaveHeight * cos(gTime * gSpeed + Input.mUV.x * gWaveFrequency);
   float3 cosTimeY = gWaveHeight * cos(gTime * gSpeed + Input.mUV.y * gWaveFrequency);
   Input.mPosition.xy += cosTimeY + cosTimeX;
    //cos(): 함수를 이용해 uv와 버텍스 애니메이션 구현

    //cosTime  을 하나 더 추가해 y축도 추가로 구현.

   
   Output.mPosition = mul(Input.mPosition, gWorldMatrix);
  
   float3 lightDir = Output.mPosition.xyz - gWorldLightingPosition;
   lightDir = normalize(lightDir);
   
   float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
   Output.mViewDir = viewDir;
   
   Output.mPosition = mul(Output.mPosition, gViewMatrix);
   Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
  
   float3 worldNormal = mul(Input.mNormal,(float3x3)gWorldMatrix);
   worldNormal = normalize(worldNormal);

   
   Output.mDiffuse = dot(-lightDir, worldNormal);
   Output.mReflection = reflect(lightDir,worldNormal);
  
   Output.mUV = Input.mUV + float2(gTime*gUVSpeed, 0);
  
   return Output;
}

 

 

 

 

 

픽셀 셰이더

 

sampler2D DiffuseSampler;
sampler2D SpecularSampler;

float3 gLightColor;

 

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

float4 ps_main(PS_INPUT Input):COLOR{

   float4 albedo = tex2D( DiffuseSampler, Input.mUV );
   float3 diffuse = gLightColor*albedo.rgb*saturate(Input.mDiffuse);
  
   float3 reflection = normalize(Input.mReflection);
   float3 viewDir = normalize(Input.mViewDir);
   float3 spacular = 0;
  
   if( diffuse.x > 0){
      spacular = saturate(dot(reflection,-viewDir));
      spacular = pow(spacular, 20.0f);
     
      float4 specularIntensity = tex2D( SpecularSampler, Input.mUV);
      spacular *= specularIntensity.rgb * gLightColor;
   }
   
   float3 ambient = float3(0.1f, 0.1f, 0.1f) * albedo;

   return float4(ambient + diffuse + spacular,1);
}

 

 

 

 

 

 

*HLSL*

cos() : 코사인 함수

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-10  (0) 2012.12.10
셰이더 프로그래밍 입문-9  (0) 2012.12.04
셰이더 프로그래밍 입문-8  (0) 2012.12.03
셰이더 프로그래밍 입문-7  (0) 2012.11.27
셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.11.27 13:32

입방체 텍스쳐면 있다면

코드 2줄만으로도 만들 수 있는 환경맵핑

 

 

정점 셰이더

 

float4x4 gWorldMatrix;
float4x4 gWorldViewProjectionMatrix;

float4 gWorldLightPosition;
float4 gWorldCameraPosition;

struct VS_INPUT
{
   float4 mPosition : POSITION;
   float3 mNormal: NORMAL;
   float3 mTangent: TANGENT;
   float3 mBinormal: BINORMAL;
   float2 mUV: TEXCOORD0;
};

struct VS_OUTPUT
{
   float4 mPosition : POSITION;
   float2 mUV: TEXCOORD0;
   float3 mLightDir : TEXCOORD1;
   float3 mViewDir: TEXCOORD2;
   float3 T : TEXCOORD3;
   float3 B : TEXCOORD4;
   float3 N : TEXCOORD5;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;

   Output.mPosition = mul( Input.mPosition, gWorldViewProjectionMatrix );
   Output.mUV = Input.mUV;

   float4 worldPosition = mul( Input.mPosition, gWorldMatrix );
   float3 lightDir = worldPosition.xyz - gWorldLightPosition.xyz;
   Output.mLightDir = normalize(lightDir);
  
   float3 viewDir = normalize(worldPosition.xyz - gWorldCameraPosition.xyz);
   Output.mViewDir = viewDir;
  
   float3 worldNormal = mul( Input.mNormal, (float3x3)gWorldMatrix );
   Output.N = normalize(worldNormal);
  
   float3 worldTangent = mul(Input.mTangent, (float3x3)gWorldMatrix );
   Output.T = normalize(worldTangent);
  
   float3 worldBinormal = mul(Input.mBinormal, (float3x3)gWorldMatrix );
   Output.B = normalize(worldBinormal);
  
   return Output;
}

 

 

픽셸 셰이더

 

struct PS_INPUT
{
   float2 mUV : TEXCOORD0;
   float3 mLightDir : TEXCOORD1;
   float3 mViewDir: TEXCOORD2;
   float3 T : TEXCOORD3;
   float3 B : TEXCOORD4;
   float3 N : TEXCOORD5;
};

sampler2D DiffuseSampler;
sampler2D SpecularSampler;
sampler2D NormalSampler;
samplerCUBE EnvironmentSampler;

float3 gLightColor;

float4 ps_main(PS_INPUT Input) : COLOR
{
   float3 tangentNormal = tex2D(NormalSampler, Input.mUV).xyz;
   tangentNormal = normalize(tangentNormal * 2 - 1)*float3(0,0,1);
//노멀값이 너무 쎄서 float3 값을 곱해줘서 환경맵핑이 잘보이게만들어 준다.

   
   float3x3 TBN = float3x3(normalize(Input.T), normalize(Input.B), normalize(Input.N));
   TBN = transpose(TBN);
   float3 worldNormal = mul(TBN, tangentNormal);
  
   float4 albedo = tex2D(DiffuseSampler, Input.mUV);
   float3 lightDir = normalize(Input.mLightDir);
   float3 diffuse = saturate(dot(worldNormal, -lightDir));
   diffuse = gLightColor * albedo.rgb * diffuse;
  
   float3 viewDir = normalize(Input.mViewDir);

//환경맵에도 카메라벡터를 사용하기위해 if문 밖으로 빼주었다.


   float3 specular = 0;
  
   if ( diffuse.x > 0 )
   {
      float3 reflection = reflect(lightDir, worldNormal);

      specular = saturate(dot(reflection, -viewDir ));
      specular = pow(specular, 20.0f);
     
      float4 specularIntensity  = tex2D(SpecularSampler, Input.mUV);
      specular *= specularIntensity.rgb * gLightColor;
     
   }

 

   float3 viewReflect = reflect(viewDir, worldNormal);

//reflect()함수를 사용해 반사벡터를 구한다.


   float3 environment = texCUBE(EnvironmentSampler, viewReflect).rgb;
//   texCUBE()함수를 이용해 환경맵을 구현한다.


   float3 ambient = float3(0.1f, 0.1f, 0.1f) * albedo;
  
   return float4(ambient + diffuse + specular+environment * 0.5f, 1);

//return에 환경맵을 더해주고 강도를 조절을 위해 *0.5f를 해준다.
}

 

 

#HLSL#

texCUBE() : 입방체 텍스쳐를 샘플링하는 함수

reflect() : 카메라의 반사 벡터를 구하는 함수

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-9  (0) 2012.12.04
셰이더 프로그래밍 입문-8  (0) 2012.12.03
셰이더 프로그래밍 입문-7  (0) 2012.11.27
셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.11.21 14:47

폴리곤 수를 늘리지 않고도

디테일을 추가할 수 있는 법선 맵핑

 

-이론-

각 픽셀의 법선 정보를 담고있는 텍스쳐를 법선맵(normal map)이라고 한다.

 

법선

법선백터의 경우 -1~0~1 의 값을 가진다 하지만 텍스쳐는 0~1의 값을 갖는다  그때문에 법선벡터의 값을 수식으로 0~1을 가진것 처럼 만들어 준다. 그렇게 해주면 법선 벡터의 0이 텍스쳐에서는 0.5가 되게 만들어 준다.

법선맵 RGB = XYZ x 0.5 + 0.5 

 

법선맵을 법선백터로 바꾸는 공식

법선벡터 XYZ = 법선맵 RGB x 2 - 1  

 

법선공간

법선벡터는 각 표면을 기준으로 벡터의 방향이 결정된다

법선백터를 접선공간, 혹은 표면공간이라고 한다.

 

시멘틱

uv의 u나 v의 축을 접선이라고 부른다.

외적 계산으로 또 하나의 축을 구한다.이것을 종 법선이라고 한다.

법선맵,접선,종법선의 정보를 이미 모델이나 텍스쳐가 자지고있기 때문에 시멘틱을 사용하는 것만으로 이점보들을 구할 수 있다.

 

 

-HLSL함수-

TANGENT : 정점에서 접선정보를 불어올때 사용하는 시멘틱.

BINORMAL : 정점에서 종법선정보를 불러올때 사용하는 시멘틱.

transpos() : 전치 행렬을 구하는 HLSL함수.

 

 

 

 

-실습-

 

정점 셰이더

 

struct VS_INPUT{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
   float2 mUV : TEXCOORD0;
   float3 mTangent: TANGENT;
   float3 mBinormal:BINORMAL;
};

//탄젠트와 바이노멀 시멘틱 구조체 선언

 

 

 

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float2 mUV: TEXCOORD0;
   float3 mLightDir : TEXCOORD1;
   float3 mViewDir: TEXCOORD2;
   float3 T : TEXCOORD3;
   float3 B : TEXCOORD4;
   float3 N : TEXCOORD5;
};

 

 

float4x4 gWorldMatrix;
float4x4 gWorldViewProjectionMatrix;

float4 gWorldLightPosition;
float4 gWorldCameraPosition;


VS_OUTPUT vs_main (VS_INPUT Input){
   VS_OUTPUT Output;
  
   Output.mPosition = mul(Input.mPosition, gWorldMatrix);
   Output.mUV = Input.mUV;
  
   float4 worldPosition = mul(Input.mPosition, gWorldViewProjectionMatrix);
   float3 lightDir = worldPosition.xyz - gWorldLightPosition.xyz;
   Output.mLightDir = normalize(lightDir);
  
  
  
   float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
   Output.mViewDir = viewDir;
  
   
   
   float3 worldNormal = mul(Input.mNormal,(float3x3)gWorldMatrix);
   Output.N = normalize(worldNormal);
   //노멀 눨드 구하기


   float3 worldTangent = mul(Input.mNormal, (float3x3)gWorldMatrix);
   Output.T = normalize(worldTangent);
    //탄젠트 월드 구하기  


   float3 worldBinormal = mul(Input.mBinormal, (float3x3)gWorldMatrix);
   Output.B = normalize(worldBinormal);
   //바이노멀 월드 구하기


   return Output;
}

 

 

 

픽셀 셰이더

 

sampler2D DiffuseSampler;
sampler2D SpecularSampler;
sampler2D NormalSampler;

//노멀텍스쳐 샘플러

float3 gLightColor;

엠비언트 컬러

 

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
   float3 mLightDIr : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 T : TEXCOORD3;
   float3 B : TEXCOORD4;
   float3 N : TEXCOORD5;
};

 

float4 ps_main(PS_INPUT Input):COLOR{

   float3 tangentNormal = tex2D( NormalSampler, Input.mUV).xyz;
   tangentNormal = normalize(tangentNormal * 2 - 1);
//탄젠트노멀을 0~1까지로 바꿔주는 수식  


   float3x3 TBN = float3x3(normalize(Input.T), normalize(Input.B),normalize(Input.N));
   TBN = transpose(TBN);
//전치 행열  


   float3 worldNormal = mul(TBN, tangentNormal);
  
   float3 lightDir = normalize(Input.mLightDIr);
   float3 diffuse = saturate(dot(worldNormal, -lightDir));
  
   float4 albedo = tex2D(DiffuseSampler, Input.mUV);
   diffuse = gLightColor * albedo.rgb * diffuse;
  
   float3 specular = 0;
      if(diffuse.x>0){
         float3 reflection = reflect(lightDir, worldNormal);
         float3 viewDir = normalize(Input.mViewDir);
        
         specular = saturate(dot(reflection, -viewDir));
         specular = pow(specular, 20.0f);
        
         float4 specularIntendity = tex2D(SpecularSampler, Input.mUV);
         specular *= specularIntendity.rgb * gLightColor;
      }
  
   float3 ambient = float3(0.1f,0.1f,0.1f) * albedo;
  
   return float4(ambient + diffuse * specular,1);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-8  (0) 2012.12.03
셰이더 프로그래밍 입문-7  (0) 2012.11.27
셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
셰이더 프로그래밍 입문-3  (2) 2012.11.14
Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.11.19 13:51

-만화 같은 명암을 입히는 툰 셰이더-

 

 

희안하게 주석 넣으면 오류난다....혹 이거 보시는 분들은 랜더몽키에 주석 빼시길....

 

 

 

정점 셰이더


struct VS_INPUT{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
};

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float3 mDiffuse : TEXCOORD1;
};


float4x4 gWorldViewProjectionMatrix;
//뷰,월드,프로젝션을 미리 구해 합쳐놓은 변수.
float4x4 gInvWorldMatrix;
//라이트 구하기 위한 역행열 변수.
float4 gWorldLightPosition;
//라이트 포지션.


VS_OUTPUT vs_main(VS_INPUT Input){

   VS_OUTPUT Output;
  
   Output.mPosition = mul(Input.mPosition, gWorldViewProjectionMatrix);
   //미리 구해놓은 행열을 가지고 포지션을 구한다.


   float3 objectLightPosition = mul(gWorldLightPosition,gInvWorldMatrix);

//라이트 포지션과 역행열을 이용해 라이트 포지션 구하기.


   float3 LightDir = normalize(Input.mPosition.xyz - objectLightPosition);
//   버텍스 포지션과 라이트 포지션으로 라이트 구현하기.


   Output.mDiffuse = dot(-LightDir, normalize(Input.mNormal));
//구현한 라이트와 노멀을 닷 공식으로 디퓨즈 구현.   
   return (Output);
}

 

 

 

 

픽셸셰이더

 

float3 gSurfaceColor;

//엠비언트 컬러쯤으로 보면된다....

 

struct PS_INPUT{
   float3 mDiffuse : TEXCOORD1;
};

 

float4 ps_main(PS_INPUT Input):COLOR{
   float3 diffuse = saturate(Input.mDiffuse);

//세튜레이트로 1를 넘는값은자른다.
   diffuse = ceil(diffuse * 5)/5.0f;
   //디퓨즈*5/5.0 한 값을 무조건 오림 함수로
   return float4(gSurfaceColor * diffuse.xyz,1);

//엠비언트 컬러에 디퓨즈를 곱해 반환.
}

 

**HLSL함수**

ceil():무조건 올림 함수

 

 

 

 

 

 

 

 

 

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-7  (0) 2012.11.27
셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
셰이더 프로그래밍 입문-3  (2) 2012.11.14
셰이더 프로그래밍 입문-2  (0) 2012.11.13
Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.11.16 14:47

물체에 색을 입히는 디퓨즈/스페큘러맵핑

 

뭐야 왜 주석넣으면 에러나는거지??

지난 기본라이팅 파일을 복사해 이름만 바꿔서 필요한 부분만 추가해서 하고있다......

 

 

 

 

 

정점 셰이더

 

struct VS_INPUT{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
   float2 mUV : TEXCOORD0;
};

//Diffuse 를 위해 UV TEXCOORD0 를 추가해준다.

 

 

 

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float2 mUV: TEXCOORD0;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

//Diffuse 를 위해 UV TEXCOORD0 를 추가해준다.

 

float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;

float4 gWorldLightingPosition;
float4 gWorldCameraPosition;


VS_OUTPUT vs_main (VS_INPUT Input){
   VS_OUTPUT Output;
  
   Output.mPosition = mul(Input.mPosition, gWorldMatrix);
  
   float3 lightDir = Output.mPosition.xyz - gWorldLightingPosition;
   //월드노멀에 라이팅 구하기
   lightDir = normalize(lightDir);
   //정규화.
  
   float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
   Output.mViewDir = viewDir;
   //정반사광 구하기.
  
   Output.mPosition = mul(Output.mPosition, gViewMatrix);
   Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
  
   float3 worldNormal = mul(Input.mNormal,(float3x3)gWorldMatrix);
   //월드노멀 구하기.
   worldNormal = normalize(worldNormal);
   //정규화.
  
   Output.mDiffuse = dot(-lightDir, worldNormal);
   Output.mReflection = reflect(lightDir,worldNormal);
  
   Output.mUV = Input.mUV;
   //OutPut에 uv를 전달해 준다.


   return Output;
}

 

 

 

 

 

픽셀 셰이더

 

sampler2D DiffuseSampler;
sampler2D SpecularSampler;

float3 gLightColor;

//텍스쳐 참조 추가, 라이트 컬러 추가

 

struct PS_INPUT{
   float2 mUV : TEXCOORD0;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

//uv TEXCOORD 받기

 

float4 ps_main(PS_INPUT Input):COLOR{

   float4 albedo = tex2D( DiffuseSampler, Input.mUV );
   float3 diffuse = gLightColor*albedo.rgb*saturate(Input.mDiffuse);
   //tex2D함수 디퓨즈 텍스쳐 적용

  //diffuse에 텍스쳐와 라이트 컬러 적용


   float3 reflection = normalize(Input.mReflection);
   float3 viewDir = normalize(Input.mViewDir);
   float3 spacular = 0;
  
   if( diffuse.x > 0){
      spacular = saturate(dot(reflection,-viewDir));
      spacular = pow(spacular, 20.0f);
     
      float4 specularIntensity = tex2D( SpecularSampler, Input.mUV);
      spacular *= specularIntensity.rgb * gLightColor;

  //tex2D 함수로 스펙큘러 텍스쳐추가및 라이트컬러 적용
   }
   //diffuse.x값이 0보다 크면  스펙큘러 구현.
  
   float3 ambient = float3(0.1f, 0.1f, 0.1f) * albedo;

  //엠비언트에 알베도 적용

   return float4(ambient + diffuse + spacular,1);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
셰이더 프로그래밍 입문-3  (2) 2012.11.14
셰이더 프로그래밍 입문-2  (0) 2012.11.13
셰이더 프로그래밍 입문-1  (0) 2012.11.12
Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.11.14 13:26

기본적인 조명 셰이더

 

 

정점셰이더

 

struct VS_INPUT{
   float4 mPosition : POSITION;
   float3 mNormal : NORMAL;
};

 

 

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

 

 

float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;

float4 gWorldLightingPosition;
float4 gWorldCameraPosition;

 


VS_OUTPUT vs_main (VS_INPUT Input){
   VS_OUTPUT Output;
  
   Output.mPosition = mul(Input.mPosition, gWorldMatrix);
  
   float3 lightDir = Output.mPosition.xyz - gWorldLightingPosition;
   //월드노멀에 라이팅 구하기
   lightDir = normalize(lightDir);
   //정규화.
  
   float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPosition.xyz);
   Output.mViewDir = viewDir;
   //정반사광 구하기.
  
   Output.mPosition = mul(Output.mPosition, gViewMatrix);
   Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
  
   float3 worldNormal = mul(Input.mNormal,(float3x3)gWorldMatrix);
   //월드노멀 구하기.
   worldNormal = normalize(worldNormal);
   //정규화.
  
   Output.mDiffuse = dot(-lightDir, worldNormal);
   Output.mReflection = reflect(lightDir,worldNormal);
  
   return Output;
}

 

 

픽셀 셰이더

 

struct PS_INPUT{
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2;
   float3 mReflection : TEXCOORD3;
};

 

float4 ps_main(PS_INPUT Input):COLOR{
   float3 diffuse = saturate(Input.mDiffuse);
  
   float3 reflection = normalize(Input.mReflection);
   float3 viewDir = normalize(Input.mViewDir);
   float3 spacular = 0;
  
   if( diffuse.x > 0){
      spacular = saturate(dot(reflection,-viewDir));
      spacular = pow(spacular, 20.0f);
   }
   //diffuse.x값이 0보다 크면  스펙큘러 구현.
  
   float3 ambient = float3(0.1f, 0.1f, 0.1f);

//엠비언트추가

   return float4(ambient+diffuse+spacular,1);
}

 

 

 

 

**HLSL함수**

normalize() :정규화 함수

saturate() : 0~1을 넘는 값을 잘라 냄

reflect() : 벡터반사 함수

pow() : 거듭제곱 함수

dot() : 내적 함수

 

 

 

 

 

 

 

 

 

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
셰이더 프로그래밍 입문-3  (2) 2012.11.14
셰이더 프로그래밍 입문-2  (0) 2012.11.13
셰이더 프로그래밍 입문-1  (0) 2012.11.12
Posted by monsters

댓글을 달아 주세요

  1. 가미

    유니티 서페이스 쉐이더도 여기서 배웠는데.. 이제 hlsl도 여기서 배울거같아요!. 항상 좋은 포스팅 감사합니다.

    2012.11.14 15:02 [ ADDR : EDIT/ DEL : REPLY ]
  2. 에공 다른분들 공부하시기엔 좀 빈약한데 도움이 되셨다니 다행이네요~ ^^
    hlsl은 김포프님(블라인드랜더러) 블로그에 이론과 자세한 설명도 해두셨으니 그쪽을 보시면 더 도움 되실꺼에요~

    2012.11.14 15:35 신고 [ ADDR : EDIT/ DEL : REPLY ]

Shader/HLSL Shader2012.11.13 13:53

텍스쳐 맵핑

(기본에작업된 크드를 재활용하자.... 왜냐면 귀찮으니깐....쩝....)

 

 

 

 

1. 정점 셰이더

 

struct VS_INPUT{
   float4 mPosition : POSITION;
   float2 mTexCoord : TEXCOORD0;

//인풋 구조체에 uv 추가
};

 

struct VS_OUTPUT{
   float4 mPosition : POSITION;
   float2 mTexCoord : TEXCOORD0;

//아웃풋 구조채에 uv추가
};

 

 

float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;

 

 

VS_OUTPUT vs_main(VS_INPUT Input){
   VS_OUTPUT Output;
   Output.mPosition = mul( Input.mPosition, gWorldMatrix );
   Output.mPosition = mul( Output.mPosition, gViewMatrix );
   Output.mPosition = mul( Output.mPosition, gProjectionMatrix );
  
   Output.mTexCoord = Input.mTexCoord;
   //인풋uv받아서 아웃풋에 전달한다.
   return Output;
}

 

 

 

 

2. 픽셀 셰이더

 


sampler2D DiffuseSampler;

//2D 텍스쳐 선언

 

struct PS_INPUT{
   float2 mTexCoord : TEXCOORD;
};

//정점셰이더의 uv 인풋

 

float4 ps_main(PS_INPUT Input) : COLOR{
   float4 albedo = tex2D(DiffuseSampler, Input.mTexCoord);

//albedo라는 변수에 tex2D함수로 텍스쳐와 uv를 담는다.


   return albedo.rgba;

//albedo의rgba속성을 출력한다.
}

 

 

 

**팁**

HLSL내장 함수

tex2D(DiffuseSampler, Input.mTexCoord);

함수이름(텍스쳐, Input.uv);

이 함수로 쉽게 구현할수있다.

 

 

 

 

 

 

 

다음은 기본적인 조명 셰이더.....복습이라 조금 지겹지만 좋다..이걸로 더 제대로 셰이더를 알게 될테니...

 

 

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
셰이더 프로그래밍 입문-3  (2) 2012.11.14
셰이더 프로그래밍 입문-2  (0) 2012.11.13
셰이더 프로그래밍 입문-1  (0) 2012.11.12
Posted by monsters

댓글을 달아 주세요

Shader/HLSL Shader2012.11.12 14:34

셰이더 프로그래밍 입문-1

 

오늘부터 짬짬히 hlsl 셰이더 공부를 시작한다. 이미 예전에 포프님의 블로그를 통해 일부 공부했었지만.. 책이 나왔으니 다시 제대로 공부해보장.....물론 내 나름의 정리이니까 이포스팅을 보는 다른분들은 도움이 안될거임..ㅎㅎ;;

"같이 공부하실분은 책을 사거나 블로그로 가보세요~"

교재는 "셰이더 프로그램밍 입문"........

 

 

 

1. 공부 준비하기

별다른 준비는 필요업고 걍 AMD사의 랜더몽키를 설치하면된다.....

 

 

 

 

 

2.진짜 쉬운 빨강 셰이더

 

 

1)정점셰이더 코드

 

struct VS_INPUT{
   float4 mPosition : POSITION;
};

//구조체에는 ; 붙는다

 

struct VS_OUTPUT{
   float4 mPosition : POSITION;
};

//구조체에는 ; 붙는다

 

float4x4 gWorldMatrix;

//월드행열
float4x4 gViewMatrix;

//뷰 행열
float4x4 gProjectionMatrix;

//투영행열

 

VS_OUTPUT vs_main(VS_INPUT Input){
  
   VS_OUTPUT Output;
  
   Output.mPosition = mul( Input.mPosition, gWorldMatrix );

//정점의 월드공간 연산
   Output.mPosition = mul( Output.mPosition, gViewMatrix );

//월드 공간을 뷰공간으로 연산
   Output.mPosition = mul( Output.mPosition, gProjectionMatrix );

//뷰 공간을 투영공간으로 연산
   
   return Output;
}

 

 

**팁**

정점 셰이더 함수의 의미

VS_OUTPUT vs_main(VS_INPUT Input)

함수의 이름은 vs_main 이다.

함수의 인수는 VS_INPUT 데이터형의 input 이다.

함수의 반환값은 VS_OUTPUT 데이터형이다.

 

 

2)픽셀셰이더 코드

 

float4 ps_main() : COLOR{
   return float4 (1.0f,0.0f,0.0f,1.0f);
}

//반한되는 r,g,b,a의 값

 

 

**팁**

픽셀셰이더 함수의 의미

float4 ps_main() : COLOR

함수의이름은 ps_main 이다.

매계변수를 받지 않는다.

반환형은 float4 이다.

반환값을 백 버퍼의 컬러값으로 처리한다.

.

.

.

.

.

.

 

 

 

올만에 다시하니 오타가 또 나오네...예전에 처음 할때보다는 99% 좋아지긴 했지만 짱난다.....

다음은 텍스쳐 맵핑....

 

 

'Shader > HLSL Shader' 카테고리의 다른 글

셰이더 프로그래밍 입문-6  (0) 2012.11.21
셰이더 프로그래밍 입문-5  (0) 2012.11.19
셰이더 프로그래밍 입문-4  (0) 2012.11.16
셰이더 프로그래밍 입문-3  (2) 2012.11.14
셰이더 프로그래밍 입문-2  (0) 2012.11.13
셰이더 프로그래밍 입문-1  (0) 2012.11.12
Posted by monsters

댓글을 달아 주세요

내장 BlinnPhong Shader를 커스텀 라이트 로 표현

 

커스텀 버텍스 스펙큘러 라이트......알파에 스펙뮬러를 적용 안한 라이트라 버텍스로 스펙쿨러가 적용되고있다....

예제는 여기 까지지만 노멀과 림, 리플렉션 등등을 넣으려면 이 커스텀 라이트는 기본 모델일뿐 적용할곳을 몇군데 바꿔야 하는 라이트가 되겠네....역시 예제는 예제일뿐... 실제 적용은 다른 얘기지....

 

다음 공부는 거의 모든 기능이 들어간 서피스 라이트 하나 구현해보고 플레그먼크 셰이더로 넘어가 보자.....

 

 

Shader "DY/surf_Specular" {
 Properties{
  _MainTex("Texture",2D)="white"{}
 }
 
 SubShader{
  Tags{"RenderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf SimpleSpecular
  
  half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten){

   half3 h = normalize (lightDir + viewDir);

 //스펙큘러를 위한 하프노말.

 

   half diff = max(0, dot(s.Normal, lightDir));

//디뷰즈 라이트를 위한 닷..max함수로 음수로 못돌아가게 한것 같다.
   
   float nh = max(0,dot(s.Normal,h));

//하프노멀에 노멀을 닷 해 스펙큘러를 구했다 역시나 max함수 사용.
   
   float spec = pow(nh, 48.0);

//pow함수를 이용해 스펙큘러 구현.
   
   half4 c;
   c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * (atten * 2);

//모든 라이트가 버텍스라이트로 들어가 있다.

 

   c.a = s.Alpha;

//여기서 알파는 별달리 의미가 없다


   return c;
  }
  
  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

 

 

 

 

 

Posted by monsters

댓글을 달아 주세요

surface shader Custom Light 예제 따라하기~

 

 

 

==================================================================================================================

심플 램버트 라이트.....내장 램버트 라이트를 따라한 커스텀 라이트

 

Shader "DY/surf_Diffuse" {
 Properties{
  _MainTex("Diffuse",2D)="white"{}
 }
 SubShader{
  Tags {"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf SimpleLambert
  
  half4 LightingSimpleLambert(SurfaceOutput s, half3 lightDir, half atten){
   half NdotL = dot(s.Normal, lightDir);
   half4 c;
   c.rgb = s.Albedo * _LightColor0.rgb *(NdotL * atten *2);
   c.a = s.Alpha;
   return c;
  }
  //커스텀 램버트 라이트

 


  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

==================================================================================================================

 

하프 램버트 라이트.....밸브의 하프 램버트를 구현한 커스텀 라이트

 

Shader "DY/surf_wraf" {
 Properties{
  _MainTex("Diffuse",2D)="white"{}
 }
 SubShader{
  Tags {"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf WrafLambert
  
  half4 LightingWrafLambert(SurfaceOutput s, half3 lightDir, half atten){
   half NdotL = dot(s.Normal, lightDir);
   half diff = NdotL*0.5+0.5;
   half4 c;
   c.rgb = s.Albedo * _LightColor0.rgb *(diff * atten *2);
   c.a = s.Alpha;
   return c;
  }
  //커스텀 하프램버트 라이트

  //half diff = NdotL*0.5+0.5;

 


  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

==================================================================================================================

 

컬러 텍스쳐를 활용한 커스텀 툰 라이팅.........텍스쳐 메모리 때문에 아마 사용할 일은 없을듯 

 

Shader "DY/Toon Ramp" {
 Properties{
  _MainTex("Diffuse",2D)="white"{}
  _Ramp("shading Ramp",2D)="gray"{}
 }
 SubShader{
  Tags {"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Ramp
  
  sampler2D _Ramp;
  
  half4 LightingRamp(SurfaceOutput s, half3 lightDir, half atten){
   half NdotL = dot(s.Normal, lightDir);
   half diff = NdotL*0.5+0.5;
   half3 ramp = tex2D(_Ramp, float2(diff)).rgb;
   half4 c;
   c.rgb = s.Albedo * _LightColor0.rgb *ramp*(atten *2);
   c.a = s.Alpha;
   return c;
  }

//툰 램프 커스텀 라이트
//half3 ramp = tex2D(_Ramp, float2(diff)).rgb;

 

  struct Input{
   float2 uv_MainTex;
  };
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }
  
  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

=======================================================================================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by monsters

댓글을 달아 주세요

Custom Lighting models in Surface Shaders

Surface Shaders를 쓸 때, 사용자는 표면(albedo color, normal, ...)의 속성을 설명하고 있고 조명 상호 작용이 조명 모델(Lighting Model).

내장된 조명 모델이 Lambert (diffuse 조명)이고 BlinnPhong (반사적인 조명) 입니다.

 

때때로 사용자는 사용자 정의 조명 모델을 사용하기를 원할지도 모르고 표면 쉐이더에서 저것을 하는 것이 가능합니다.

조명 모델이 어떤 규칙을 매치하는Cg/HLSL 함수 두 개보다 더 많지 않습니다. 내장된 LambertBlinnPhong 모델은 Unity 안의 Lighting.cginc 파일에서 정의됩니다(Windows에서 {unity install path}/Data/CGIncludes/Lighting.cginc, Mac에서 /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).

Lighting Model declaration

조명 모델은 Lighting으로 시작하는 이름을 가지는 일반 함수 2개 입니다. 그들은 사용자의 쉐이더 파일 또는included 파일 중 하나에서 어디서나 선언될 수 있습니다. 함수는 이것과 같습니다:

  1. half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);이것은 뷰 디렉션에 의존하지 않는 포워드 렌더링 경로에서 사용됩니다 (예. diffuse).
  2. half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);이것은 뷰 디렉션에 의존하는 조명 모델을 위한 포워드 렌더링 경로에서 사용됩니다.
  3. half4 LightingName_PrePass (SurfaceOutput s, half4 light);이것은 deferred 조명 경로에서 사용됩니다.

사용자가 모든 함수를 선언할 필요가 없다는 것을 참고하세요.

조명 모델은 뷰 디렉션을 사용하거나 또는 하지 않는다는 것입니다.

 

 

 

유사하게 조명 모델이 deferred 조명에서 작동하지 않는다면 사용자는 _PrePass 함수를 선언하지 않고 그것을 사용하는 모든 쉐이더가 포워드 렌더링만으로 컴파일할 것입니다.

 

 

 

 

디렉셔널 라이트맵 디코딩은 어떤 상황들에서는 조명이 포워드와 지연 조명에서처럼 비슷한 방식으로 사용자화(customizing) 될 필요가 있습니다.

 

당신의 라이트 모델이 보는 방향에 의존적인지 아닌지에 따라 아래의 함수 중 하나를 사용하세요.

두개의 함수 다 포워드라이팅과 지연라이팅 렌더링 경로를 자동으로 처리합니다.

  1. half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);이것은 보는 방향 의존적이지 않은 라이트 모델들에 사용됩니다 (e.g. diffuse).

이것은 종속 방향을 볼 수 없습니다 빛이 모델에 사용됩니다(e.g. diffuse).

  1. half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);이것은 보는 방향 의존적인 라이트 모델들에 사용됩니다.

 

 

 

 

 

 

'Shader > 유니티셰이더레퍼런스' 카테고리의 다른 글

쉐이더 LOD(Shader Level of Detail)  (0) 2017.03.14
Custom Lighting models in Surface Shaders  (0) 2012.08.24
SurfaceShaderLighting  (0) 2012.07.26
SurfaceShaders  (0) 2012.07.26
한방에 모아보는 레퍼런스  (1) 2012.07.20
Pass  (0) 2012.07.19
Posted by monsters

댓글을 달아 주세요

 

TintFinalColor 셰이더.........

 

예제파일이 내 유니티 버전과 마지 않는건지 표면지시자가 없다고 나온다...그래서 걍 내식 대로? 고쳐서 넣었다..... 뭐하러 그리 어려게 작성 한걸까???

 

마찬가지로 버텍스에 포그 컬러 넣는 셰이더도 같은 이유로 작성이 안된다.. 패스...귀찮아 내일 부터는 서피스 라이팅이다~

 

 

Shader "DY/TintFinalColor" {
 Properties{
  _MainTex("Texture",2D)="white"{}
  _ColorTint("Tint",Color)=(1.0,1.0,1.0,1.0)
 }
 SubShader{
  Tags{"RenderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
  };
  
  fixed4 _ColorTint;
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb*_ColorTint;
  }

//디퓨즈에 컬러속성을 곱해서 색을 입혀준다..방식은 멀티 플라이라고 보면됨.


  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

 

 

 

 

Posted by monsters

댓글을 달아 주세요

Normal Extrusion 추가....노멀값을 조절 해 메쉬를 뿔리는 셰이더??? 뿔린 메쉬를 뒤집어 툰셰이딩에 응용한다고도 한다....

 

 

Shader "DY/NormalExtrusion" {
 Properties{
  _MainTex("texture",2D)="white"{}
//  _Amount("Extrusion Amount",Range(-1,1))=0.0
  _Amount("Extrusion Amount",float)=0.0
 }

//슬라이드 조절바가 불편해서 수치 입력으로 바꿨다....


 SubShader{


  Tags{"RanderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert vertex:vert
  
  struct Input{
   float2 uv_MainTex;
  };
  
  float _Amount;


  void vert (inout appdata_full v){
   v.vertex.xyz +=v.normal * _Amount;
  }

// cg구문에 옵션에 해당하는 구문

//cg에 정의 되있는 Apptata를 활용해 메쉬가 뿔어나 보이게 만들었다...
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
  }
  ENDCG
 }
 FallBack"Diffuse"
}

 

 

 

 

 

 

 

Custom Vertex Color 추가 ..... 로컬좌표 버텍스에 노멀 컬러를 입혔다...... 어디다 쓰지 ???

 

 

Shader "DY/CustomVertex" {
 properties{
  _MainTex("Texture",2D)="white"{}
 }
 SubShader{
  Tags{"RenderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert vertex:vert
  
  struct Input{
   float2 uv_MainTex;
   float3 customColor;
  };
  
  void vert (inout appdata_full v, out Input o){
   o.customColor = abs(v.normal);
  }

// cg구문에 옵션에 해당하는 구문

//cg에 정의 되있는 Apptata를 활용해 버텍스에 컬러를 입혔다...

//ui쪽엔 버텍스에 컬러 접근해 컬러 바꾸던데... 그런데서나 쓸수 있으려나?
  
  sampler2D _MainTex;
  
  void surf (Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
   o.Albedo *= IN.customColor;
  }
  
  ENDCG
 }
 FallBack"Diffuse"
}

 

 

 

 

 

 

 

 

 

 

Posted by monsters

댓글을 달아 주세요

Cubemap Reflection 넣기......

 

이번 예제파일을 살짝 변경했다 좀더 쎄게~ 강하게~찐하게~ ㅋㅋ

 

worldRefl 라는 내장 함수를 사용해 간단히 구현한다.... 정말 번거롭지 않게 만들어 놓은 서피스 셰이더....

 

 

Shader "DY/WordRef1"{

 

 Properties{

  _MainTex("Texture",2D) = "white"{}

  _Cube("CubeMap",CUBE) = ""{}

 }

 

 SubShader{

  Tags{"RenderType"="Opaque"}

  CGPROGRAM

  #pragma surface surf Lambert

  

  struct Input{

   float2 uv_MainTex;

   float3 worldRefl;

  };

  //worldRef1 내장 함수 선언 reflect 내장함수와 같은 의미 인듯 하다...

 

  sampler2D _MainTex;

  samplerCUBE _Cube;

  float3 texcol;

  //심심해서 조금 바꿔보려고 변수하나 추가했다

 

  void surf(Input IN, inout SurfaceOutput o){

   texcol = tex2D(_MainTex,IN.uv_MainTex).rgb;

   texcol*=texcol;

//텍스쳐 끼리 곱해 멀티플라이 효과를 준당

 

   o.Albedo = texcol;

   o.Emission = texCUBE(_Cube,IN.worldRefl).rgb;

  }

//Emission 에 큐브를 적용한다 이 Emission을 넣으면 전체적으로 밝아지게됨 빛나보이게하려고 그런거 같다....

 

 

  ENDCG

 }

 Fallback"Diffuse"

}

 

 

 

 

 

Cubemap Reflection 에 Normal Map 추가 하기.....

 

이유는 잘 모르겟으나...(뒤져봐야겠지..)INTERNAL_DATA 는 입력 구조체가 필요하고, 픽셀당 반사벡터에 필요한 내장 함수인 WorldReflectionVector(,) 를 넣어야한다~

 

 

Shader "DY/WordRef1_bump" {

 Properties{
  _MainTex("Texture",2D) = "white"{}
  _Cube("CubeMap",CUBE) = ""{}
  _BumpMap ("Bumpmap", 2D) = "bump" {}
 }
 
 SubShader{
  Tags{"RenderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
   float3 worldRefl;
   float2 uv_BumpMap;
   INTERNAL_DATA

  };
  // INTERNAL_DATA 구조체 추가~ 뭐하는 넘일까...

 


  sampler2D _MainTex;
  samplerCUBE _Cube;
  sampler2D _BumpMap;
  float3 texcol;
  
  void surf(Input IN, inout SurfaceOutput o){
   texcol = tex2D(_MainTex,IN.uv_MainTex).rgb;
   texcol*=texcol;
   o.Albedo = texcol;
   o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
   o.Emission = texCUBE (_Cube, WorldReflectionVector (IN, o.Normal)).rgb;

  }

//Emission에 WorldReflectionVector 내장 함수를 넣었다....

//이건 픽셀당 반사 백터를 구하기 위한이란다 그러니까 노멀이 들어가서 필요하게된 변수 라는거지


  ENDCG
 }
 Fallback"Diffuse"
}

 

 

 

 

 

 

 

Slices via World Space Position 구현하기....

 

딱히 쓸일이 있을진 모르겠다.....

clip() Cg/HLSL 함수를 사용해서 구현하고 월드 좌표는 내장 함수인 worldPos 변수를 사용한다......

 

Shader"DY/Slices"{

 Properties{

  _MainTex("Texture",2D)="white"{}

  _BumpMap("BumpMap",2D)="Bump"{}

 }

 

 SubShader{

 

  Tags{"RenderType"="Opaque"}

  

  Cull Off

  //메쉬의 뒷면을 살려라!!~~ 라는것

 

  CGPROGRAM

  #pragma surface surf Lambert

  

  struct Input{

   float2 uv_MainTex;

   float2 uv_BumpMap;

   float3 worldPos;

  };

  

  sampler2D _MainTex;

  sampler2D _BumpMap;

  

  void surf (Input IN, inout SurfaceOutput o){

   clip (frac((IN.worldPos.y+IN.worldPos.z*0.1)*5)-0.5);

//함수와 월드 좌표를 이용해 메쉬를 잘라진 것처럼 랜더링 걸어  버린다.

 

   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

   o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

  }

 

  ENDCG

 }

 Fallback"Diffuse"

}

 

 

 

 

 

 

 

 

 

 

Posted by monsters

댓글을 달아 주세요

4. Rim Lighting 추가....

 

Shader"DY/surf_ex_004"{

 Properties{

 _MainTex("Texture",2D)="white"{}

 _BumpMap("Bump Map",2D)="bump"{}

 _RimColor("Rim Color",Color)=(0.5,0.5,0.5,0.5)

 _RimPower("Rim Power",Range(0.5,8.0))=3.0

 }

//프로퍼티에 림컬러와 림파워 추가

 

 

 SubShader{

 Tags{"RanderType"="Opaque"}

 

 CGPROGRAM

 #pragma surface surf Lambert

 

 

  struct Input{

   float2 uv_MainTex;

   float2 uv_BumpMap;

   float3 viewDir;

  };

  //인풋에 뷰다이렉션 추가

  

  sampler2D _MainTex;

  sampler2D _BumpMap;

  float4 _RimColor;

  float _RimPower;

//아웃풋에 림컬러와 파워를 전달하기위해 변수 선언

 

  void surf(Input IN, inout SurfaceOutput o){

   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

   o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

   half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));

//정규화한 뷰다이렉션과 노멀의 내적을 구하고 1을 넘지한게 세추레이트 함수를 적용 후 뒤집는다.

//림과 림파와를 파워 함수를 적용하고 림컬러와 합성한다.

   o.Emission = _RimColor.rgb*pow(rim,_RimPower);

  }

 ENDCG

 }

 Fallback"Diffuse"

}

 

 

 

5.Detail Texture 추가.....

 

Shader"DY/surf_005"{

 

Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
      _Detail ("Detail", 2D) = "gray" {}
    }


    SubShader {
      Tags { "RenderType" = "Opaque" }


      CGPROGRAM
      #pragma surface surf Lambert


      struct Input {
          float2 uv_MainTex;
          float2 uv_BumpMap;
          float2 uv_Detail;
      };


      sampler2D _MainTex;
      sampler2D _BumpMap;
      sampler2D _Detail;


      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;

          //Albedo를 추가 해 텍스쳐를 멀티플라이형식으로 합성한다. 
          o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
      }


      ENDCG
    }
    Fallback "Diffuse"
  }

 

 

 


 

 

6. DetailMap screen space...변경 적용

 

Shader"DY/surf_ex_006"{

 

Properties {

      _MainTex ("Texture", 2D) = "white" {}

      _Detail ("Detail", 2D) = "gray" {}

    }

 

    SubShader {

      Tags { "RenderType" = "Opaque" }

 

      CGPROGRAM

      #pragma surface surf Lambert

 

      struct Input {

          float2 uv_MainTex;

          float4 screenPos;

      };

 

      sampler2D _MainTex;

      sampler2D _Detail;

 

      void surf (Input IN, inout SurfaceOutput o) {

          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;

          float2 screenUV = IN.screenPos.xy / IN.screenPos.w;

          screenUV *= float2(8,6);

    //float2에 스크린XY좌표와 W스케일 받아오기

   //각각 성분에 8,6 을 곱한값이 screenUV 이다.

          o.Albedo *= tex2D (_Detail, screenUV).rgb * 2;

      }

      ENDCG

    }

    Fallback "Diffuse"

  }

 

 

 

 

Posted by monsters

댓글을 달아 주세요

서피스 셰이더 공부 시작.....예전에 문서 다 읽어 봤지만 마치 처음 읽어 보는 것 같은 이 이상한 기분..;;;;

 

이번은 서피스 셰이더 예제 따라하기~

 

1. 램버트 라이트 에 색상만 출력하는 초 간단 셰이더

 

Shader "DY/surf_ex_001" {
 SubShader{
  Tags{"RenderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert

//기본으로 지정되있는 램버트 라이트 사용
  
   struct Input {
    float4 color : COLOR;
   };

//인풋은 달랑 색상만 받는다


   void surf (Input IN, inout SurfaceOutput o){
    o.Albedo = 0.5;
   }

//Albedo는 색상(Diffuse) 정하는 구문이고 0.5 는 컬러값 (회색)을 준다.
  ENDCG
  }
  //SubShader
}
//Shader

 

 

 

 

 

==========================================================================================

 

 

2. 텍스쳐 추가...디퓨즈 셰이더

 

Shader "DY/surf_ex_002" {
 Properties{
  _MainTex("Texture",2D)="White"{}
 }
 SubShader{
  Tags{"RanderType"="Opaque"}
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
  };
  //인풋에 메인 텍스쳐의 uv정보를 받아온다.


  sampler2D _MainTex;
  //2D텍스쳐를 사용하기 위한 참조.


  void surf(Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
  }

//디퓨즈에 해당하는Albedo에 메인 텍스쳐와 인풋의 uv정보를 적용.
  
  ENDCG
 }
 Fallback "Diffuse"

//그래픽카드가 안맞거나 오류가 생기면 디뷰즈 셰이더로 대체.
}

 

 

 

 

 

 

==========================================================================================

 

 

3. 범프맵 추가 ......(사칙연산이 되는구나......좋다! 서피스!!)

 

Shader "DY/surf_ex_003" {
 Properties{
  _MainTex("Texture",2D)="white"{}
  _BumpMap("Bumpmap",2D)="bump"{}
 }
 SubShader{
  Tags{"RanderType"="Opaque"}
  
  CGPROGRAM
  #pragma surface surf Lambert
  
  struct Input{
   float2 uv_MainTex;
   float2 uv_BumpMap;
  };
  //인풋에 범프맵 uv추가.


  sampler2D _MainTex;
  sampler2D _BumpMap;

//범프맵도 2D텍스쳐니까 참조 추가.
  
  void surf(Input IN, inout SurfaceOutput o){
   o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
   o.Normal = UnpackNormal (tex2D(_BumpMap, IN.uv_BumpMap));
  }

//유니티의 노말압축을 풀어주고(UnpackNormal) 범프맵과 uv정보 적용


  ENDCG
 }
 Fallback"Diffuse"
}


 

 

==========================================================================================

 

 

Posted by monsters

댓글을 달아 주세요