제1강-매트세이더
매트세이더는 합성시 알파생성을 위해 많이 씁니다.
코드는 다음과 같습니다.
matte.sl;
surface matte()
{
Oi=1;
Ci=0;
}
matte.vfl;
surface matte(float alpha=0)
{
Cf = 0;
Of = 1;
Af = alpha;
}
벡스는 렌더맨 세이더랑은 다르게 Af가 따로 있습니다. 보시면 아시겠지만,
Cf는 변수타입이 color입니다. 즉 0이라는 값은 (0, 0, 0)이라는겁니다. 블랙이져!
Af는 타입이 float입니다. 이점 주의 하세여!
일단 벡스나 렌더맨 세이더는 클래스 구조랑 비슷합니다. C++의 특성을 잘 나타내고 있죠!
세이딩이 되는 원리는 일단 st와 같은 좌표에서 0,0 -> 1,1까지 포인트를 샘플링합니다.
그런다음 위의 식에 대입을 해서 포인트 마다의 적용되는 컬러값을 리턴해 주는거져!
한마디로 st좌표가 0,0이라는점(sample rate에 따라 빈도가 다름)의 값이
0,0 에서의 컬러값=0, 투명도=1; 알파는 0;
0,001(예를들어)에서도 컬러값=0, 투명도=1; 알파는 0;
-
-
-
1,1(예를들어)에서도 컬러값=0, 투명도=1; 알파는 0;
가 되는 것입니다. 이 일례는 매트세이더에 적용이 되는것입니다. 세이딩 모델이 적용되면 다른 양상이 되겠져!
여기에서 이전에 선형항수가 적용이 가능하다는겁니다.
if(s<.5>
Cf=0;
else
Cf=1;
간단하지만 실제로 세이더를 코딩하고 컴파일해 보시기 바랍니다.
과제:
1. 본인만의 매트세이더를 만들어 본다.
2. 후디니 유저들은 VOPs에서 매트세이더를 구현해 본다
리플이 올라오지 않으면 다음과정으로 넘어가지 않겠습니다.
pinkclear
Wed, 03/05/2003 - 01:33
Permalink
Re: 제1강-매트세이더
'포인트를 샘플링 합니다'
라는 말이 이해가 가지 않습니다
좀더 자세히 말씀부탁드리겠습니다
pinkclear
Houdini
Wed, 03/05/2003 - 01:53
Permalink
음..
세이딩이 되는 영역을 말하는 겁니다. 좌표계에 따라 세이딩 영역이 정해지면 순차적으로 샘플링만큼 좌표를 분할해서 렌더링을 하게 되는데 그 하나하나의 단위를 포인트라 지칭했습니다. "point P"라고 생각하시면 됩니다. 위 설명은 다분히 세이더가 있으면 각각의 P값을 기준으로 좌표를 인식해서, 시선....빛의 방향, 반사 등등을 가지고 컬러값을 계산한다는 것입니다.
Houdini
Wed, 03/05/2003 - 18:45
Permalink
Re: 세상에 쉬운건 없군여 ㅡㅡ
예 너무 앞서 가시는군요! 좋습니다.
surface
matte(float Ka= 1, Kd= 1 )
{
point Nf = faceforward(normalize(N),I);
Oi = Os;
Ci = Os * Cs * ( Ka*ambient() + Kd*diffuse(Nf) ) ;
}
함수 func() 가로 않에 들어 가는 것을 인자라고 합니다.
예를들면
test.c
#include
void main()
{
}
의경우 함수의 기본골격만 갖추었지. 인자도 없고 리턴하는 데이타도 없습니다.
surface matte(float Ka= 1, Kd= 1 )의 경우 궂이 주석을 달자면,
세이더의 형태가 surface이고 이름은 matte 상수인 Ka및 Kd를 외부참조하기 위해 정의를 하였습니다. 한마디로 컴파일된 세이더를 유저디파인하는 통로가 되는거져!
point Nf = faceforward(normalize(N),I);
여기서 중요한것은 변수랑 함수를 잘 구분하는겁니다.
Nf 사용자지정 방향벡터
N 노말
I 시선에서 P까지의 방향벡터
faceforward(), normalize()는 함수입니다. 이건 함수 스펙을 잘 봐야할 문제인데, 받는 인자가 서로 다르다는 것을 알 수 있을겁니다. 함수부분에서 다룹시다.
point Nf;
Nf = faceforward(normalize(N),I); 이렇게 보시면 더 이해하기 쉬우실겁니다. 사용자변수랑 전역변수(글로벌변수)랑 헷갈리지 마시기 바랍니다. 조만간 표 올리겠습니다.
Ci, Oi는 컬러타입의 파이널 데이타입니다. P에서의 컬러정보와 투명도 정보가 출력이 되는 거지요! 가장먼저 셋팅해야 되는 중요한 정보입니다.
ambient(), diffuse()는 우리가 흔히 말하는 세이딩모델을 구성하는 기본함수들입니다. 각각 필요한 인자들이 다릅니다. 반사값을 다룬다면 방향벡터가 필요하겠져! diffuse()가 쓰일려면, 필요한 인자인 Nf가 있어야 된다는 것입니다. 필요한 함수가 있는데 어떤 인자(요소)들이 필요한지 역으로 코드를 분석해 보는것도 중요하리라 생각되어집니다.
이런건 그냥 외우세염!
Houdini
Wed, 03/05/2003 - 18:58
Permalink
후디니 VOPs세이더입니다.
렌더맨, 벡스,밥스까지..
tojam
Fri, 03/07/2003 - 04:57
Permalink
질문.
아마도 제가 가장 바보같은 질문을 많이 할것같습니다.
matte.sl; ----> 파일 이름이고,
surface matte() ----> Surface 종류의 매트를 만드는거고,
{
Oi =1; ----> Opacity 가 1 이니깐, 완전 불투명이고,
Ci = 0; -------> Color 가 0 이니간,,,블랙이라는거고
}
-----------
st 좌표라함은 Sample Rate 의 준말인가요? 원리를 알았으면 좋겠는데..
---------
Vops 에서,,,
왜 Constant 를 쓰는지, 아니면 다른것을 써서 같은 결과를 나타낼수 있는지,궁금하고요, 기본적인 Vop 노드의 설명을 해주시면 도움이 많이 될것같습니다.
예를들어서,
Constant
Global Variables
Parameters
-------------------
Constant 노드 에서 Contant Type에서 리스트가 나오는데 간단하게 설명해주십시요.
1 Float (float)
Angle(float)
3 Floats (vector)
Direction (vector)
4 Floats (vector4)
9 Floats (matric3)
16 Floasts (matrix)
Integer (int)
Toggle (int)
String (string)
File (string)
Image (string)
Geometry (string)
Color (vector)
Color with Alpha (vector4)
감사,,토잠..
명언) 좋은 책은 바보같다고 생각하는 질문에서부터 시작된다.
Houdini
Fri, 03/07/2003 - 12:58
Permalink
Re: 질문.
마야의 UV에 대응될 수 있는 텍스쳐좌표입니다. 타입은 float입니다.
VOPs에서 중요한것은 함수가 요구하는 인자의 타입을 제공해 주는겁니다. VOPs OP가 vector3타입을 원하는데 플로트형을 입력하면 오류가 나듯이, OP가 원하는 값을 주는게 중요합니다. 입력단에 마우스를 가져다 대면 어떤 타입이 입력이 되어야 하는지 알 수 있습니다. 그런다음에는 어떠한 OP든 거기에 맞는 값만 있으면 노드에 입력이 가능합니다. 그런의미에서 파악하시면 되구여!
벡스는 color보단 vector3를, 알파가 포함되면 vector4를 많이 쓴다는거 알아주십시요!
matte.vfl;
surface matte(float alpha=0)
{
Cf = 0;
Of = 1;
Af = alpha;
}
의 경우 VOPs에서 어떠한 노드를 쓰든지, Cf, Of가 vector3를 요구하고,
Af는 플로트형을 요구한다는 것만 알면 됩니다.
tojam
Fri, 03/14/2003 - 01:04
Permalink
Re: 질문.
surface matte(float Ka=1, Kd=1)
{
point Nf = faceforward(normalize(N), I);
Oi = Os;
Ci = Os * Cs *(Ka*ambient()+Kd*diffuse(Nf));
}
----------------------
위의 코드를 shader 했더니, error 가 생기는데 왜그럴까요.
line 3: warning: Tpe mismatch.
Assigned a normal to a point.
line 5: warning: diffuse, arg1: type mismatch
vector or normal expected instead of point
위의 예는 kiwi 님이 올리신건데,
꾸벅~
tojam
Fri, 03/14/2003 - 01:09
Permalink
Re: 질문.
surface matte(float Ka=1, Kd=1)
{
normal Nf = faceforward(normalize(N), I);
Oi = Os;
Ci = Oi * Cs *(Ka*ambient()+Kd*diffuse(Nf));
}
이렇게 주니깐 되는데,,어떤 차이인지,,궁금합니다. 코드가 잘못된것이었는지,,
tojam
Fri, 03/14/2003 - 03:47
Permalink
Vop code output
VOP 에서 Oupput 했더니 이런결과가 나오는군요...토잠.
//
// VEX Code Generated by Houdini 5.5.36
// Date: Thu Mar 13 14:44:07 2003
// From: /vex/matte1 (untitled.hip)
//
#define VOP_SHADING
#define VOP_SURFACE
surface
matte1()
{
vector constant;
vector constant1;
float constant2;
// Code produced by: constant1
constant = { 0, 0, 0 };
// Code produced by: constant2
constant1 = { 1, 1, 1 };
// Code produced by: constant3
constant2 = 0;
// Code produced by: output1
Cf = constant;
Of = constant1;
Af = constant2;
}
tojam
Fri, 03/14/2003 - 03:57
Permalink
Re: Vop code output
----matte.vfl-----------------------
surface matte(float alpha=0)
{
Cf = 0;
Of = 1;
Af = alpha;
}
------------------------------------
을 컴파일 했더니(vcc),
---matte.vex ------------------
#
# "matte.vex" created on Thu Mar 13 14:53:41 2003
# with vcc
#
_name matte
_decl alpha float parm 0
_decl &constci0 int const 0
_decl &constci1 int const 1
set@VI Cf &constci0
set@VI Of &constci1
set@FF Af alpha
_code_end
------------------------------------
로 나오는데,,위에 있는 후디니에서 저장된 코드하고 왜 다른지 알고싶습니다.
Houdini
Wed, 03/19/2003 - 13:38
Permalink
상술형 참고..
테스트립임...
Houdini
Fri, 03/21/2003 - 10:15
Permalink
Re: 질문.
일단 Oi = Os;로 정의가 되었는데, Oi를 않쓰고 Os를 쓴것은 원칙에 어긋나는것 같구여! 기본적으로 논리상 문제는 없지만, Os가 Oi에만 쓰이는 변수일 수도 있습니다.
이렇게 한번 해 보세여! 아예 변수를 하나 정의해서 같이 넣어 보세여! Os변수만의 특수성 때문에 그런건지 아실 수 있을것 같습니다.
PROTO
Thu, 03/27/2003 - 16:26
Permalink
쉐이딩 노멀과 관련된 작업은 normal로 선언.
과거 초기 렌더맨 표준에서는 point 타입 만이 존재했습니다. prman 3.6에 이르러서 point 타입이 normal, vector 타입으로 다시 분산되었습니다.
쉐이딩 노멀과 관련된 연산이 아래와 같이 point 타입으로 되어 있는 소스코드들은 옛날에 작성된 것들이란 애기죠.
point Nf = faceforward(normalize(N), I);
N 은 전연변수로서 쉐이딩 노멀 벡터 타입입니다. 현재의 렌더맨 표준에서는 더이상 쉐이딩 노멀과 관련된 연산을 point 변수에 대입하는 것은 유효하지 않습니다.
normal Nf = faceforward(normalize(N), I);
위와 같이 normal 타입으로 바꾸어서 컴파일 하면 됩니다. 이제 point 타입은 본래의 순수한 의미로서 특정한 surface point를 의미하게 됩니다. 과거에는 이 point 타입이 normal vector, vetor를 모두 표현하는 다용도로 사용했으나, 의미상 문제인지는 몰라도, 현재는 normal, vector로 파생되어 사용됩니다.
그래서 surface point와 관련된 작업이라면 변수는 point 타입이 되지만,
쉐이딩 노멀과 과련된 작업은 normal로,
벡터 처리와 관련된 것은 vector로 해야 합니다.
그런데 이와같은 상황이 아주 엄격하게 적용되는 것 같지는 않습니다. 렌더맨 렌더러를 만드는 벤더간의 차이가 있을 수도 있을 것이고, 위의 예만 보더라도 normal 타입이 vector 타입으로 가능함을 알 수 있는 것처럼 말입니다.....
Houdini
Fri, 04/11/2003 - 17:56
Permalink
아 그렇군요..
벡스에서는 보편화 되어 있는데....렌더맨에서도 그런게 적용이 되나 보네여! 그냥 지나쳤는데..렌더맨도 변화가 있었군요!
Houdini
Mon, 06/23/2008 - 16:31
Permalink
Re: 질문.
노말은 좌표계가 달라져도 크기가 항상 1이고 같은 방향을 유지하지요. 포인트는 좌표계의 변화에 모든 영향을 다 받습니다. 벡터는 크기는 달라져도 좌표계의 이동에 관계없이 방향을 유지하구여! 결국 벡터와 노말이 비슷합니다.
좌표를 참조하면 무조건 포인트를써야 합니다.