CODEONWORT

AGAL에는 조건문이 없다 본문

Season 1/플래시

AGAL에는 조건문이 없다

codeonwort 2012.02.25 16:07
램버트의 조명 모형을 쓰려면 다음을 계산해야 하는데
D = max(-dotProduct(N, L), 0) * C (N은 표면의 단위 법선 벡터, L은 빛의 단위 방향 벡터, C는 빛의 rgb값)

AGAL 명령에는 max가 없는 줄 알았다. 그래서 이런 식으로 계산해야 하는데
d = -dotProduct(N, L)
if(d < 0) d = 0
D = d * C

if문도 없다. 하지만 AGAL에는 sge 명령이 있다.
sge a, b, c (b >= c이면 a에 1을 넣고, 그렇지 않으면 a에 0을 넣는다)

다음과 같이 픽셀 셰이더를 작성하여 램버트의 조명 모형을 구현할 수 있다.
/**********************
v0: 표면의 법선 벡터 (정점 셰이더에서 넘어왔기 때문에 단위 길이가 아님)
fc0: 빛의 단위 방향 벡터. 단 상수를 설정할 때 부호를 뒤집어서 설정했다고 가정한다.
fc1: 빛의 rgb값. w 성분은 0이다. (r, g, b, 0)
**********************/
nrm v0.xyz, v0.xyz                     법선 벡터의 길이를 1로 맞춘다
dp3 ft0.w, v0, fc0                        내적 계산
sge ft0.z, ft0.w, fc1.w                  내적한 값이 0 이상인가?
mul ft0.w, ft0.w, ft0.z                   max를 수행하는 것과 마찬가지
mul ft0.xyz, ft0.www, fc1.xyz       빛의 강도와 색상을 곱한다
mov oc, ft0                                끝

이제보니 max 있다
nrm v0.xyz, v0.xyz
dp3 ft0.w, v0, fc0
max ft0.w, ft0.w, fc1.w
mul ft0.xyz, ft0.www, fc1.xyz
mov oc, ft0
2 Comments
댓글쓰기 폼