2018년 1월 16일 화요일

Semantics in HLSL

Semantics in HLSL


Direct3D 의 Shader에서는 CPU가 전달한 메모리, 쉐이더 코드, GPU 렌더링 파이프라인간 연계를 위하여 시멘틱 semantic 을 사용한다.


무슨말이냐 하면… 가령 버텍스 쉐이더와 프레그먼트 쉐이더가 있다고 가정하자.


버텍스 쉐이더의 출력이 프레그먼트 쉐이더로 전달 되어야 한다.
그러면 어떤 값이 전달되고 전달되는 값이 무엇을 의미하는지를 알아야 한다.


즉 어떤 변수가 있다고 하면 해당 변수의 형식과 이름을 지정하게 되지만 이 변수가 어떤 의미로 사용되는 지는 알 수가 없다.


가령 int a; int b; 라는 변수가 있다고 가정해보자. 이 문장에 의하여 a 와 b의 타입과 변수 이름을 알게 된다. 또한 어떠한 값을 대입하거나 참조할 수도 있다. 그러나 해당 값이 , 해당 변수가 어떤 의미로 사용됬는지는 프로그래머 자신은 알 수 있지만 쉐이더간 함수들은 서로 모른다는 것이다.


즉 버텍스 쉐이더가 a 라는 것을 프레그먼트 쉐이더로 전달했다고 하면 프레그먼트 쉐어더는 전달되온 a 가 어떤 의미의 값인지 모른다는 것이다.


이런 상황에서 전달되는 변수의 의미를 지정하는 것이 “Semantic” 인 것이다.


semantic에는 대표적으로 SV_Position 과 SV_Target 이 있다.
이 둘은 거의 필수적으로 사용되는 시멘틱이다.


우선 SV_Position과 SV_Target은 GPU 파이프라인에서 전달되는 값이다. 모두 float4를 사용한다


SV_Position은 레스터라이즈 이전 쉐이더 (버텍스 쉐이더, 지오메트리 쉐이더등)에서 출력 시킨다. 거꾸로 말하면 이 시멘틱 값은 파이프라인의 레스터라이져에서 받아 사용하게 되는 것이다.


SV_Target은 버텍스 쉐어더에서 출력 시키고 파이프라인의 output merger에서 사용된다.
이는 rgba 의 값을 갖는 색상값이 된다.


정리하자면


“셰이더를 작성할 때, 사용자가 임의로 설정하는 전역변수나 버텍스 셰이더, 프래그먼트 셰이더의 입력 구조체의 변수들이 어떤 자료와 연결될지 알려주는 것이 바로 이 시맨틱이다”


OpenGL의 GLSL에는 Semantic이 필요 없다. 그 이유는 OpenGL의 Shader 관련 프로그램 방식을 알아야 하는데, 간단히 말하면 OpenGL은 각각의 쉐이더들이 하나의 프로그램으로 물려 돌아가기 때문이다. 즉 모든 쉐이더가 하나의 프로그램 안에 있다난 것이다.  그러나 Direct3D의 쉐이더 운영은 각각 분리 되어 있다. 이렇게 분리되어 있기 때문에 시멘틱이 필요한 것이다.


System-Value Semantics
System-Value Semantics 는 Direct3D10 부터 새롭게 추가된 기능이다.
모든 System-Value 는 SV_POSITION 과 같이 SV_prefix 로 시작한다.


System-Value 들은 렌더링 파이프라인의 모든 영역으로 연결되어 있다.


예를 들어 SV_Position 은 출력뿐만 아니라 버텍스 쉐이더의 입력으로 사용할 수 있다.


입력은 함수의 인수전달이고 출력은 함수의 return 값이 된다.


어떤 쉐이더의 입력과 출력은 다른 파이프라인의 다른 스테이지 또는 쉐이더와 서로 연결되는 부분이라 생각하면 된다.


픽셀쉐이더의 경우 출력으로 SV_Delth 와 SV_Target 만 사용할 수 있다.


보다 자세한 내용은 Semantics 링크를 참조하기 바란다.


Vertex Shader Input Semantics (Input / Description / Type)BINORMAL[n] / Binormal / float4
BLENDINDICES[n] / Blend indices / uint
BLENDWEIGHT[n] / Blend weight / float
COLOR[n] / Diffuse and specular color / float4
NORMAL[n] / Normal vector / float4
POSITION[n] Vertex position in object space / float4
POSITIONT / Transformed vertex position / float4
PSIZE[n] / point size / float
TANGENT[n] : Tangent / float4
TEXCOORD[n] / Texture coordinates / float4

Vertex Shader Output Semantics (Output / Description / Type)COLOR[n] / Diffuse or specular color / float4
FOG / Vertex fog / float
POSITION[n] / Position of a vertex in homegenous space. Compute position in screen space by dividing (x, y, z) by w. Every vertex shader must write out a parameter with this semantics / float4

PSIZE[n] : Point size / float
TESSFACTOR[n] / Tessellation factor / float
TEXCOORD[n] / Texture coordinates / float4


Pixel Shader Input Semantics (Input / Description / Type)COLOR[n] / Diffuse or specular color / float4
TEXCOORD[n] / Texture coordinates / float4
VFACE / Floating-point scalar that indicates a back-facing primitive. A negative value faces backwards, while a positive value faces the camera / float

VPOS / The pixel location (x, y) in screen space. To convert a Direct3D 9 shader (that uses this semantic) to a Direct3D 10 shader/ float2

Pixel Shader Output Semantics (Output / Description / Type)COLOR[n] / Output color / float4
DEPTH[n] / Output depth / float

댓글 없음:

댓글 쓰기

Vertex , 정점 정보의 확장

Vertex , 정점 정보의 확장 그동안의 설명에 있어서 우리는 VERTEX 정보에 대하여 3 차원의 위치 정보만 사용하였다. struct VERTEX {float x,y,z;}; 이제 이를 확장하여 색상을...