2017-10-02 79 views
0

DirectX 11 용 HLSL을 배우고 있는데 Vertex Shader의 출력 인 SV_POSITION과 Pixel Shader의 입력이 정확히 무엇인지 궁금합니다.DirectX 11 픽셀 쉐이더 SV_POSITION이란?

1 : 화면의 모든 픽셀 또는 객체의 x, y, z입니까?

2 : 왜 32 비트 부동 소수점입니까?

3 : 정점 출력에이 시스템 변수가 필요합니까?

감사합니다.

답변

1

버텍스 쉐이더 스테이지는 꼭 필요한 출력 하나만 갖습니다 : 버텍스의 위치. 이 값은 고정 함수 래스터 라이저에서 어떤 픽셀이 그려지는지 계산하고 각 픽셀의 픽셀 셰이더를 호출하는 데 사용됩니다. 이것이 시스템 값 의미 SV_Position이 버텍스 쉐이더의 출력을 나타내는 것입니다. 픽셀 쉐이더는 실제로 픽셀 위치를 입력으로 가져갈 필요는 없지만 유용하다면 사용할 수 있습니다. 입력 레이아웃은 또한 SV_Position의 의미를 사용하는 버텍스 쉐이더의 위치를 ​​가져야합니다. 일반적으로 설정

A는 :

  • Tnput 레이아웃은 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을 살펴 보는 것이 좋습니다.

+0

감사합니다. 그러나, 나는 여전히 혼란 스럽다 ... Pixel Shader에 대한 float4 SV_Position 입력은 지오 메트릭 또는 화면의 픽셀 위치이다! 아니면 그냥 정점 출력 SV_Position (그들은 동일)입니까? Pixel Shader가 색상을 출력하기 때문에이 색상은 무엇입니까? 2D의 화면 색상? – Mike5050

+0

당신이 그린 그림에 달려 있습니다. 삼각형을 그리는 경우 정점 쉐이더는 세 모서리마다 한 번씩 실행되지만 픽셀 쉐이더는 삼각형이 만지는 모든 픽셀에 대해 실행됩니다. 버텍스 쉐이더의 출력은 [래스터 라이저 하드웨어] (https://msdn.microsoft.com/en-us/library/windows/desktop/cc627092.aspx)로 보내지며,이 래스터 라이저 하드웨어는 모든 픽셀 위치에서 픽셀 위치를 계산합니다. 상태. 그런 다음 생성 된 각 픽셀에 대해 픽셀 쉐이더를 호출합니다. –

+0

AH 고마워! 픽셀 쉐이더 (삼각형의 경우)의 SV_Position은이 3d 공간입니까? X, Y, Z, W 값은 무엇입니까? 죄송합니다 ... 너무 많은 대답이없는 질문입니다! 편집 : 나는 그것이 단지 화면 위치라고 가정하고 있습니까? 책을 읽으면서 정확하게 이해하고 있는지 확인하고 싶습니다. 정말 명확하지 않았습니다. 예 : 한 책의 내용 : 래스터 라이저는 조각 (조각이란 무엇인가?)을 생성하고 픽셀 쉐이더는이 조각에서 작동합니다. 그것은 단편이 무엇인지 설명하지 못합니다 ... 픽셀 쉐이더가 색상을 출력해야한다는 것입니다. – Mike5050