1. 스칼라 형식
2. 벡터 형식
int2, half3 bool4 등 가능
벡터를 초기화 방법
float3 v = {1.0f, 2.0f, 3.0f};
float2 w = float2(x, y);
float4 u = float4(w, 3.0f, 4.0f); // u = (w.x, w.y, 3.0f, 4.0f)
vec.x = vec.r = 1.0f;
vec.y = vec.g = 2.0f;
vec.z = vec.b = 3.0f;
vec.w = vec.a = 4.0f;
벡터 u = (ux, uy, uz, uw)의 성분들을 벡터 v에 복사하되, v = (uw, uy, uy, ux)가 되도록 성분을 뒤섞어서 복사하고 싶다고 하자. 가장 직접적인 방법은 u의 각 성분을 하나하나 복사해주는 것이다. 그러나 HLSL은 이런식으로 복사해주는 구문을 따로 제공한다. 이러한 종류의 복사를 스위즐링(swizzling)이라고 부른다.
float4 u = {1.0f, 2.0f, 3.0f, 4.0f};
float4 v = {0.0f, 0.0f, 5.0f, 6.0f};
v = u.wyyx;
3. 행렬 형식
행렬의 특정 성분에 접근할 때에는 이중 배열 첨자(색인) 구문을 사용한다.
M[i][j] = value;
또한, 객체의 멤버나 구조체의 필드에 접근할 때 사용하는 구문을 이용해서 벡터의 성분에 접근할 수 있다. 사용 가능한 멤버 이름은 다음과 같다.
1 기준 색인:
M._11 = M._12 = M._13 = M._14 = 0.0f;
M._21 = M._22 = M._23 = M._24 = 0.0f;
M._31 = M._32 = M._33 = M._34 = 0.0f;
M._41 = M._42 = M._43 = M._44 = 0.0f;
0 기준 색인:
M._m00 = M._m01 = M._m02 = M._m03 = 0.0f;
M._m10 = M._m11 = M._m12 = M._m13 = 0.0f;
M._m20 = M._m21 = M._m22 = M._m23 = 0.0f;
M._m30 = M._m31 = M._m32 = M._m33 = 0.0f;
4. 배열
배열을 선언하는 구문은 C++와 동일하다.
float M[4][4];
half p[4];
float3 v[12];
5. 구조체
이 역시 C++와 동일하다. 다만 HLSL의 구조체에는 멤버 함수를 둘 수 없다.
struct SurfaceInfo
{
float3 pos;
float3 normal;
float4 diffuse;
float4 spec;
};
SurfaceInfo v;
litColor += v.diffuse;
dot(lightVec, v.normal);
float specPower = max(v.spec.a, 1.0f);
6. typedef 키워드
C++와 동일하다.
typedef vector<float, 3> point;
vector<float, 3> myPoint;
point myPoint;
typedef const float CFLOAT;
7. 변수 선언 한정사
8. 캐스팅
HLSL의 캐스팅 구문은 C 프로그래밍 언어와 동일하다.
float f = 5.0f;
float4x4 m = (float4x4)f; // f를 m의 모든 성분에 복사한다.
'HLSL' 카테고리의 다른 글
4. 함수 (0) | 2021.12.24 |
---|---|
3. 프로그램의 흐름 (0) | 2021.12.24 |
2. 키워드와 연산자 (0) | 2021.12.24 |