Shader 는 정점 프로 그래 밍 을 바탕 으로 하 는 Lambert 빛, Phong 빛 과 Blinn - Phong 빛 을 기반 으로 합 니 다.
Shader "Custom/ShaderLambert" {
SubShader {
Pass{
CGPROGRAM
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
struct params{
float4 Pos:POSITION;
float4 Col:COLOR;
};
params vert(appdata_base ab)
{
params pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT; //
float3 N;
float3 L;
//
//N = normalize(UnityObjectToWorldNormal(ab.normal)); // UnityObjectToWorldNormal:
N = normalize(ab.normal); //
N = mul(float4(N,0),_World2Object).xyz; // , ,
//
//L = normalize(WorldSpaceLightDir(ab.vertex)); // WorldSpaceLightDir:
L = normalize(_WorldSpaceLightPos0); // , mul,
float DotNL = saturate(dot(N,L)); //
pms.Col += _LightColor0 * DotNL; // +
return pms;
}
float4 frag(params INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}
Phong 광선 모델 (환경 광 + 난반사 + 거울 면 하 이 라이트):
Shader "Custom/ShaderPhong_Vertex" {
Properties{
_SpecularColor("SpecularColor",color) = (1,1,1,1)
}
SubShader {
Pass{
CGPROGRAM
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
float4 _SpecularColor;
struct parmas{
float4 Pos:POSITION;
float4 Col:COLOR;
};
parmas vert(appdata_base ab)
{
parmas pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT; //
float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
float3 L =normalize(WorldSpaceLightDir(ab.vertex)).xyz;
float DotNL = saturate(dot(N,L)); // [0,1]
pms.Col = pms.Col+_LightColor0 * DotNL; // +
// Reflect
float3 R = normalize(reflect(-WorldSpaceLightDir(ab.vertex),N)); // reflect()
//float3 R = normalize(2*dot(N,L)*N-L); // R
float3 V = normalize(WorldSpaceViewDir(ab.vertex));
float DotRV = max(0,dot(R,V)+0.1); //
pms.Col = pms.Col*0.8+_SpecularColor*DotRV*0.1; // + +
return pms;
}
float4 frag(parmas INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}
Blinn - Phong 빛 사진 모델 (환경 광 + 난반사 + 반 각 거울 면 하 이 라이트):
Shader "Custom/ShaderBlinnPhong_Vertex" {
Properties{
_SpcularColor("SpecularColor",color) = (1,1,1,1)
}
SubShader {
Pass{
CGPROGRAM
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
float4 _SpcularColor;
struct parmas
{
float4 Pos:POSITION;
float4 Col:COLOR;
};
parmas vert(appdata_base ab)
{
parmas pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT; //
float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
float3 L = normalize(WorldSpaceLightDir(ab.vertex)).xyz;
float DotNL = saturate(dot(N,L));
pms.Col = pms.Col + _LightColor0*DotNL; // +
//
float3 BJ = normalize(L + normalize(WorldSpaceViewDir(ab.vertex)));
float DotLBJ = saturate(dot(BJ,N));
pms.Col = pms.Col*0.8 + pow(_SpcularColor*DotLBJ*0.6,4); // + +
return pms;
}
float4 frag(parmas INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity 공부 일지~블렌드 셰이프 조작 방법 그 ①게임을 만들고 싶다 ~라고 생각하고 마지막 날부터 Unity를 만지기 시작했습니다 HITOMI2236입니다. 이번 블렌드 셰이프에 대해 조사했으므로 여기에 기록하려고 합니다. 개인용 메모입니다만, 만약 같은 곳에서 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.