성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Unity로 실습하는 Shader (3) - 고로 셰이딩(gouraud shading) + 퐁 모델(Phong model) + Texture</h1> <p> 지난 글에 만든 고로 셰이딩에,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unity로 실습하는 Shader (2) - 고로 셰이딩(gouraud shading) + 퐁 모델(Phong model) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11609'>http://www.sysnet.pe.kr/2/0/11609</a> </pre> <br /> Texture를 연결해 보겠습니다. 이를 위해 Properties에 Texture 정의를 하나 추가하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Properties { <span style='color: blue; font-weight: bold'>_MainTex("Texture", 2D) = "white" {}</span> } </pre> <br /> texture 용 UV 좌표도 포함한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>sampler2D _MainTex;</span> struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; <span style='color: blue; font-weight: bold'>float2 uv : TEXCOORD0;</span> }; struct v2f { float4 vertex : SV_POSITION; float4 illumination : COLOR0; <span style='color: blue; font-weight: bold'>float2 uv : TEXCOORD0;</span> }; </pre> <br /> pixel shader에서 다음과 같이 texture 색상과 빛을 조합할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); float4 color = col * i.illumination; return color; } </pre> <br /> 위의 상태에서 테스트하면 다음과 같은 결과를 얻을 수 있습니다.<br /> <br /> <img alt='gouraud_light_texture_1.png' src='/SysWebRes/bbs/gouraud_light_texture_1.png' /><br /> <br /> 좌측은 gouraud shader를 적용한 것이고 우측은 단순 texture만 씌운 것입니다. 오히려 좀 어두워진 것 같은데요. (물론, 계수를 조정해 주면 밝게 만들 수 있습니다.) 그런데 검색해 보면, 원래 texture 색상에 적용하는 것은 주변광과 확산광이라고 합니다. 그래서 pixel shader 측에 "주변광 + 확산광"한 값과 반사광 값을 분리해서 보내주고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > struct v2f { float4 vertex : SV_POSITION; <span style='color: blue; font-weight: bold'>float4 diffuse : COLOR0; float4 specular : COLOR1;</span> float2 uv : TEXCOORD0; }; v2f vert (appdata v) { v2f o; // ...[생략]... o.diffuse = float4(ambientReflection + diffuseReflection, 1.0); o.specular = float4(specularReflection, 1.0); return o; } </pre> <br /> pixel shader에서 texture에 주변광과 확산광만 곱하고 반사광은 더해 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); <span style='color: blue; font-weight: bold'>float4 color = col * i.diffuse + i.specular;</span> return color; } </pre> <br /> 반사광의 효과가 더 나오는 것을 볼 수 있습니다.<br /> <br /> <img alt='gouraud_light_texture_2.png' src='/SysWebRes/bbs/gouraud_light_texture_2.png' /><br /> <br /> 다음은 이번 실습에서 사용한 shader의 전체 소스입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Shader "My/gouraudShader" { Properties { _MainTex("Texture", 2D) = "white" {} _Ka("Ambient Reflectance", Float) = 1.0 _Color("Main Color", Color) = (1.0, 1.0, 1.0, 1.0) } SubShader { Pass { <a target='tab' href='http://www.sysnet.pe.kr/2/0/11642'>Tags{ "LightMode" = "ForwardBase" }</a> CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" uniform float _Ka; float4 _Color; sampler2D _MainTex; struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; <span style='color: blue; font-weight: bold'>float2 uv : TEXCOORD0;</span> }; struct v2f { float4 vertex : SV_POSITION; <span style='color: blue; font-weight: bold'>float4 diffuse : COLOR0; float4 specular : COLOR1; float2 uv : TEXCOORD0;</span> }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); <span style='color: blue; font-weight: bold'>o.uv = v.uv;</span> // 주변광 float4 ambientReflection = _Ka * UNITY_LIGHTMODEL_AMBIENT; // 확산광 float3 worldNormal = UnityObjectToWorldNormal(v.normal); float3 lightDir = normalize(_WorldSpaceLightPos0); /* float4 _WorldSpaceLightPos0; */ float3 diffuseReflection = 1.0 * _LightColor0.rgb * saturate(dot(worldNormal, lightDir)); // 반사광 float3 reflectedDir = reflect(-lightDir, worldNormal); float3 viewDir = normalize(_WorldSpaceCameraPos - worldNormal); /* float3 _WorldSpaceCameraPos; */ float reflectIntensity = saturate(dot(reflectedDir, viewDir)); float n = 4.0; reflectIntensity = pow(reflectIntensity, n); float3 specularReflection = 1.0 * _LightColor0 * reflectIntensity; <span style='color: blue; font-weight: bold'>o.diffuse = float4(ambientReflection + diffuseReflection, 1.0); o.specular = float4(specularReflection, 1.0);</span> return o; } fixed4 frag (v2f i) : SV_Target { <span style='color: blue; font-weight: bold'>fixed4 col = tex2D(_MainTex, i.uv);</span> <span style='color: blue; font-weight: bold'>float4 color = col * i.diffuse + i.specular;</span> return color; } ENDCG } } } </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9273
(왼쪽의 숫자를 입력해야 합니다.)