DirectX 11 용 HLSL을 배우고 있는데 Vertex Shader의 출력 인 SV_POSITION과 Pixel Shader의 입력이 정확히 무엇인지 궁금합니다.DirectX 11 픽셀 쉐이더 SV_POSITION이란?
1 : 화면의 모든 픽셀 또는 객체의 x, y, z입니까?
2 : 왜 32 비트 부동 소수점입니까?
3 : 정점 출력에이 시스템 변수가 필요합니까?
감사합니다.
DirectX 11 용 HLSL을 배우고 있는데 Vertex Shader의 출력 인 SV_POSITION과 Pixel Shader의 입력이 정확히 무엇인지 궁금합니다.DirectX 11 픽셀 쉐이더 SV_POSITION이란?
1 : 화면의 모든 픽셀 또는 객체의 x, y, z입니까?
2 : 왜 32 비트 부동 소수점입니까?
3 : 정점 출력에이 시스템 변수가 필요합니까?
감사합니다.
버텍스 쉐이더 스테이지는 꼭 필요한 출력 하나만 갖습니다 : 버텍스의 위치. 이 값은 고정 함수 래스터 라이저에서 어떤 픽셀이 그려지는지 계산하고 각 픽셀의 픽셀 셰이더를 호출하는 데 사용됩니다. 이것이 시스템 값 의미 SV_Position
이 버텍스 쉐이더의 출력을 나타내는 것입니다. 픽셀 쉐이더는 실제로 픽셀 위치를 입력으로 가져갈 필요는 없지만 유용하다면 사용할 수 있습니다. 입력 레이아웃은 또한 SV_Position
의 의미를 사용하는 버텍스 쉐이더의 위치를 가져야합니다. 일반적으로 설정
A는 :
SV_Position
로 표시 월드 공간에서 정점의 위치를 설명합니다. 입력 레이아웃은 데이터의 형식을 설명합니다. 예를 들어: 선택적으로 색인 버퍼를 이용하여 정점 버퍼로부터의 입력 레이아웃 복호으로
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
정점 셰이더 입력은 입력 어셈블러로부터 정보를 수신한다. 위치가 어떤 형식이든 일반적으로 셰이더에서 사용하기 위해 float
으로 변환됩니다.
버텍스 쉐이더는 다시 SV_Position
으로 표시된 출력 버텍스 위치를 생성해야합니다. 이것은 (-1, -1)
에서 (1, 1)
범위의 정규화 된 좌표에서 픽셀의 (x, y)
위치입니다. z
은 정규화 된 범위 0
에서 1
까지의 깊이 위치 (깊이 버퍼에 사용됨)입니다. 예를 들어
: 픽셀 쉐이더 임의로 위치를 취할 수 있지만, 그 필요는 없다
float4 VS(float4 Pos : SV_Position) : SV_Position
{
return Pos;
}
. (x,y)
은 픽셀 좌표입니다. 버텍스 출력 ('클립 공간')은 D3D11_VIEWPORT
에서 제공된 뷰포트 상태를 사용하여 픽셀로 변환됩니다.
픽셀 쉐이더는 SV_Target
으로 표시된 float4
결과를 생성해야합니다.예를 들어
:
// We can omit the position
float4 PS() : SV_Target
{
return float4(1.0f, 1.0f, 0.0f, 1.0f);
}
// Or you can take it as input if that's helpful
float4 PS(float4 Pos : SV_Position) : SV_Target
{
return float4(1.0f, 1.0f, 0.0f, 1.0f);
}
는 기술적 정점 셰이더 입력으로 위치를 취할 필요가 없다. Shader Model 4.0 이상의 하드웨어를 사용하면
SV_VertexId
을 사용하여 다음과 같은 코드를 사용하여 버텍스 쉐이더에서 쿼드의 모서리를 자체 생성 할 수 있습니다. 이는 입력 레이아웃, 버텍스 버퍼 또는 인덱스 버퍼를 전혀 사용하지 않습니다 . 물론 픽셀 쉐이더의 출력 위치를 생성해야합니다. 당신은 당신이 새로운
SV_Position
(또는
SV_POSITION
) 의미를 사용하여 거의 모든 장소에 이전 Direct3D를 9
POSITION
의미를 사용할 수 있습니다
VSInputTx VSQuad(uint vI : SV_VertexId)
{
VSInputTx vout;
float2 texcoord = float2(vI & 1, vI >> 1);
vout.TexCoord = texcoord;
vout.Position = float4((texcoord.x - 0.5f) * 2, -(texcoord.y - 0.5f) * 2, 0, 1);
return vout;
}
참고. 유일한 요구 사항은 입력 레이아웃과 버텍스 쉐이더 입력간에 일관성을 가져야한다는 것입니다. 그렇지 않으면 바인딩에 실패합니다.
DirectX를 처음 사용하는 사람이라면 DirectX Tool Kit과 특히 built-in shader source을 살펴 보는 것이 좋습니다.
감사합니다. 그러나, 나는 여전히 혼란 스럽다 ... Pixel Shader에 대한 float4 SV_Position 입력은 지오 메트릭 또는 화면의 픽셀 위치이다! 아니면 그냥 정점 출력 SV_Position (그들은 동일)입니까? Pixel Shader가 색상을 출력하기 때문에이 색상은 무엇입니까? 2D의 화면 색상? – Mike5050
당신이 그린 그림에 달려 있습니다. 삼각형을 그리는 경우 정점 쉐이더는 세 모서리마다 한 번씩 실행되지만 픽셀 쉐이더는 삼각형이 만지는 모든 픽셀에 대해 실행됩니다. 버텍스 쉐이더의 출력은 [래스터 라이저 하드웨어] (https://msdn.microsoft.com/en-us/library/windows/desktop/cc627092.aspx)로 보내지며,이 래스터 라이저 하드웨어는 모든 픽셀 위치에서 픽셀 위치를 계산합니다. 상태. 그런 다음 생성 된 각 픽셀에 대해 픽셀 쉐이더를 호출합니다. –
AH 고마워! 픽셀 쉐이더 (삼각형의 경우)의 SV_Position은이 3d 공간입니까? X, Y, Z, W 값은 무엇입니까? 죄송합니다 ... 너무 많은 대답이없는 질문입니다! 편집 : 나는 그것이 단지 화면 위치라고 가정하고 있습니까? 책을 읽으면서 정확하게 이해하고 있는지 확인하고 싶습니다. 정말 명확하지 않았습니다. 예 : 한 책의 내용 : 래스터 라이저는 조각 (조각이란 무엇인가?)을 생성하고 픽셀 쉐이더는이 조각에서 작동합니다. 그것은 단편이 무엇인지 설명하지 못합니다 ... 픽셀 쉐이더가 색상을 출력해야한다는 것입니다. – Mike5050