2012-09-29 3 views
7

지금 약간 혼란스러워서 몇 가지 아이디어를 명확하게 얻을 수 있도록 도와 달라.쉐이더에서의 DirectX Shader 리소스보기

HLSL 쉐이더 (예 : 계산 쉐이더)에서 StructuredBuffer sb를 선언 할 수 있습니까? register (t0)와 같은 레지스터에 바인드해야하나요?

응용 프로그램 측면에서 CSSetShaderResources (...)를 호출 할 수 있습니다. 첫 번째 인수 (StartSlot)는 레지스터 선언에서 "t"뒤에있는 작은 숫자와 관련이 있습니까?

StartSlot을 0으로 설정하고 두 번째 인수를 2로 설정하면 API에 두 개의 Shader 리소스 뷰를 바인딩한다는 것을 알려 주면 하나는 레지스터 (t0)에, 다른 하나는 레지스터에 (t1)?

Texture2D tex [10] : register (t0)을 선언하면 CSSetShaderResources (0, 10, ...)를 호출하여 설정할 수 있습니다. 이것은 레지스터 (t0 ~ t9)가 모두 소모되었음을 의미합니까?

질문의 예 "신속한 화재"죄송

,하지만 난 정말 혼란스러워하고있어 내 시험의 일부 confliting 결과를 제공하는 것 ...

어떤 도움을 주시면 감사하겠습니다.

답변

4

그럼 순서로 응답하자 :

예 물론 컴퓨 트 셰이더 (실제로는 쉐이더의 모든 유형을 선언 할 수 있습니다)에 StructuredBuffer을 선언 할 수 있습니다.

효과 프레임 워크 (기술)를 사용하지 않는 경우 레지스터를 선언해야 쉐이더가 데이터에서 읽을 위치를 알 수 있습니다 (효과 프레임 워크를 사용하면 후드에서 수행 할 수 있지만 여전히 explicitely declare).

CSSetShaderResources는 시작 슬롯에서 N 리소스를 바인딩하도록 지시하므로 0,2를 사용하는 것에 대한 설명이 정확합니다.

텍스처 배열의 경우 PIX를 사용하여 체크 아웃해야했지만, 실제로는 말한 방식입니다.

Texture2D tex[10] : register(t0); 

각 텍스처 인덱스가이 지정한 레지스터에서 시작 슬롯을 할당 할 수 있음을 의미한다, 그래서 당신은 CSSetShaderResources (0,10, srvarray)을 설정을 호출해야합니다.

+1

고마워요. 이것은 많은 것들을 지 웁니다 ... 단지 Texture2D tex [10] : register (t0)에서 레지스터 (t1) 또는 레지스터 (t2)를 사용하여 다른 변수를 선언 할 수 없습니다. 그들은 모두 사용하기 때문에 등록 (t9), 맞습니까? (나는 +1, 매우 명시 적 응답, 감사의 말을 해주었습니다.이 마지막 작은 점이 지워지는대로 받아 들일 것입니다.) – l3utterfly

+0

여러 변수를 같은 레지스터에 바인드하려고하면 올바른 것입니다. 컴파일러는이 오류를 "아직 구현되지 않은 레지스터 겹침 의미가 있습니다."라고 알려줍니다. – catflier

+0

감사합니다. 수락 된 대답. – l3utterfly

2

매우 멋진 설명! 나는 또한 혼란스러워하고, 당신의 질문과 설명 후에 나에게 분명하다!

그러나 나는이 게시물에 대한 좋은 예를 발견 했으므로이를 공유하고 싶습니다. 그것은 모든 SetShaderResources 유형에 대한 슬롯의 카운터를 시작하는 것 같습니다. 모든 셰이더 (VS, HS, DS, PS)에는 자체 카운터가있는 것으로 보입니다. 여기에 NVidia 예에서 코드 :

Shaderclass 번호 :

pd3dDeviceContext->HSSetShaderResources(0, 2, Resources); 
pd3dDeviceContext->HSSetShaderResources(8, 1, &m_pRegularWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(9, 1, &m_pQuadWatertightTexSRV); 
pd3dDeviceContext->HSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->DSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(2, 1, &pHeightMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(10, 1, &pNormalMapTextureSRV); 
pd3dDeviceContext->PSSetShaderResources(3, 1, &pTexRenderRV11); 

처음 두 개의 자원을 들고 있으므로 다음 슬롯된다 (라인 4) 시작 슬롯 (0 + 2 (2)를 추가해야 = 2). 모든 SetShaderResources는 0부터 시작해야하지만 코드의 다른 위치에서이를 수행 할 수 있습니다. 따라서 여기에 DS 및 PS 슬롯이 없습니다. 선을 제거하면 여전히 작동하지만 데이터는 연기됩니다. 이제 HLSL의 처음 4 개가 t0, t1, t8 및 t9 줄에 표시되어 다른 레지스터가 다른 곳에 바인딩되었습니다.

HLSL 코드 :

Texture2D<float> GregoryStencil    : register(t0); 
Texture2D<uint> Index      : register(t1);  
Texture2D<float> g_txHeight     : register(t2);  
Texture2D<float> g_depth      : register(t3); 
Texture2D g_FloorTexture      : register(t4); 
Texture2D<float3> regularPatchControlPoints : register(t5); 
Texture2D<float3> gregoryPatchControlPoints : register(t6); 
Texture2D<float4> g_floorHeight    : register(t7); 
Texture2D<float2> RegularWatertightUVs  : register(t8); 
Texture2D<float2> QuadWatertightUVs   : register(t9); 
Texture2D<float3> g_txNormal     : register(t10);