2008년 4월 23일 수요일

slim expression을 이용한 재미난 장난...

pointbased occlusion이 은근히 불편했다.

bake3d를 이용해서 ptc 파일을 생성하고 이를 불러와서 occlusion을 연산해야하니...
픽사에서 샘플로 만든 템플릿을 사용하면되지만,
slim shading network을 이용해서 rendering을 걸때 발생하는 에러나... 기타의 몇가지 문제점들이 많다.
이에 대한 부분은 차후 프로젝트가 끝나면 정리를 해볼까한다.

우선은...
$ELEMENTTYPE값을 이용해서 쉐이더가 적용되는 값을 바꿔봤다.
ㅋㅋㅋ

#include "normals.h"

surface
masin_occ ( uniform string opa_file = "", filename = "", context = "";
float maxdist = 1e15; )
{
color bkocc;
color opacity;
if ( opa_file != "" )
opacity = texture(opa_file, 1*s, 1*t);
else
opacity = color(1, 1, 1);

if ( context == "reference" )
{
normal Nn = normalize(N);
float a = area(P, "dicing");
float op = 0.333333 * (opacity[0] + opacity[1] + opacity[2]);

a *= op;

if (a > 0)
bake3d(filename, "_area", P, Nn, "interpolate", 1, "_area", a);

bkocc = color(1, 1, 1) * opacity;
}
if ( context == "final" )
{
normal Ns = shadingnormal(N);

float occ;

occ = occlusion(P, Ns, 0, "pointbased", 1, "filename", filename,
"hitsides", "both",
"maxdist", maxdist,
"bias", 0.01,
"falloff", 0,
"falloffmode", 0,
"samplebase", 0,
"clamp", 1,
"maxsolidangle", 0.05);

bkocc = (1 - occ) * opacity;
}

Ci = bkocc;
Oi = opacity;
}

RibBox - Matte1

RibBox의 활용범위는 상당히 넓은것 같다.

"Matte 1" 을 했을경우 그냥 쌩~ 으로 빠져버린다.

Matte를 적용한 오브젝트가 모든 Rib file에 똑같이 적용이 되기때문...
이를 해결하려면 Rib file 종류에 따라 다른 값을 적용한다.

MTOR의 경우 Rib을 생성할때 ELEMENTTYPE으로 구별을 한다.
final, shadow, reference... 몇개 더 있었던것 같다.

[
if {$ELEMENTTYPE == "shadow"} {
return "Surface \"null\""
} else {
return "Matte 1"
}
]
주로 이렇게 사용을 했었는데... 지금생각해보니

[
if {$ELEMENTTYPE == "final"} {
return "Matte 1"
}
]
그냥 final rib file에만 Matte를 적용하면 될것 같다.
첫번째 방법은 Deep Shadow를 사용했을경우 반투명 쉐도우에 문제가 있을듯... 뭐 쉐이더를 적용할수는 있지만...
조금 불편한듯....

모션벡터 쉐이더

픽사포럼에서 발견...

이번 게임동영상 프로젝트를 하면서 필요했던 쉐이더.

surface reelSmartMotionBlur(
uniform float MaxDisplace = 32;

// I don't need float option...


) {
// Get blur vector on image plane in pixels
point rasterP = transform( "raster", P );
point rasterPdPdtime = transform( "raster", P + dPdtime );
vector pixelsMoved = rasterPdPdtime - rasterP;
pixelsMoved *= vector( 1, -1, 0 ); // Revert y-axis

// Original lm2dmv - r->r = (miScalar)( (-v_rMVx/v_dMVNorm) + 1.0f )*0.5f

pixelsMoved = .5 * ( -pixelsMoved / MaxDisplace + 1 );


Oi = 1;
Ci = color( pixelsMoved );

// We dont need blue channel - rsmv takes onlu r, g;

Ci *=color (1,1,0);
}