HLSL

1. 변수 형식

Awesome Red Tomato 2021. 12. 24. 13:38

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