2010년 5월 9일 일요일

Message Passing v.1(srf to lgt)

Message Passing을 충분히 이해했다고 생각했는데, 상당히 부족한 수준인것 같다.
최근 문제가 생긴부분이 Surface Shader의 특정 color 값을 Light Shader로 보내는 부분이다. 이해도가 떨어지다보니 글을 쓰기도 힘들다.

surface shader :
    output varying color __mycolor = 0;

light shader:
    color mycolor = 0;
    surface("__mycolor", mycolor);

이런식을 기본적으로 생각했었는데, 몇일전 사무실에서 시도하다 실패했다.
color 값이 light shader로 넘어가지 않았다.

여러가지 방법을 시도해본 결과,
surface shader 에서의 illuminance loop과 light shade 에서의 illuminate, solar 등에 대한 이해부족으로 인한 당연한 결과가 아닌가싶다.
참고로 illuminance loop이 돌기전 extern value를 설정하면 아무런 문제가 되지 않는다.

ex. 1
surface
base_srf(
float Kd = 1;
color lgtcolor = color(1);
output varying color __surfcolor = 0;)
{
normal Nn = normalize(N);
vector Nf = faceforward(Nn, I);

__surfcolor = lgtcolor;

color df = diffuse(Nf);

Ci = df;
}


light
base_lgt(
float intensity = 1;)
{
color lgtcolor = 1;
surface("__surfcolor", lgtcolor);
printf("%f, %f, %f\n", lgtcolor[0], lgtcolor[1], lgtcolor[2]);

point from = point "shader" (0,0,0);
vector dir = (0,0,1);

illuminate(from, dir, PI/2) {
Cl = intensity * lgtcolor;
}
}


위에서 언급했던 방법으로 간단하게 shader를 만들었다.

ex. 2
surface
base_srf(
float Kd = 1;
color lgtcolor = color(1);)
{
normal Nn = normalize(N);
color df = 0;

illuminance(P, Nn, PI/2, "send:light:__surfcolor", lgtcolor)
{
float k = Nn.normalize(L);
df += k * Cl;
}
Ci = df;
}


light
base_lgt(
float intensity = 1;
output varying color __surfcolor = 0;)
{
point from = point "shader" (0,0,0);
vector dir = (0,0,1);

illuminate(from, dir, PI/2) {
Cl = intensity * __surfcolor;
}
}


결과는 위의 방법과 같으나 이와 같은 방법으로도 message passing이 가능하다.
RMS 1.0에서는이와 같은 방법을 사용하고 있다.

댓글 없음: