2017-02-09 20 views
1

최근에 내 엔진에 텍스처로드가 구현되었습니다. 그러나 텍스처에는 때로는 약간의 결함이 있습니다.다이나믹 인덱싱을 사용할 때 DirectX 12의 이상한 텍스처 결함

문제는 다음 그림과 같이 표시됩니다. enter image description here

이것은 AMD R9 나는 또한 인텔 그래픽 HD 4600에 내 프로그램을 실행하려고 380 테스트,하지만 아무 것도 그려지지 않습니다.

내 쉐이더 코드 (. 어떤 형상은 표시되지 않습니다) :

struct MaterialData 
{ 
    float4 gDiffuseAlbedo; 
    float3 gFresnelR0; 
    float gRoughness; 
    float4x4 gMatTransform; 
    uint gDiffuseMapIndex; 
    uint MaterialPad0; 
    uint MaterialPad1; 
    uint MaterialPad2; 
}; 
StructuredBuffer<MaterialData> gMaterialData : register(t1, space1); 

// texture array for dynamic indexing 
// gMaxNumOfTextures is set to 16 at now 
Texture2D gCommonTexture[gMaxNumOfTextures] : register(t3); 

// in my pixel shader: 
float4 diffuseAlbedoMap = gCommonTexture[matData.gDiffuseMapIndex].Sample(gsamAnisotropicWrap, pin.TexC) * matData.gDiffuseAlbedo; 

나는 이미 matData.gDiffuseMapIndex 재확인하고 올바른 것입니다.

나는 모든 것을이 문제를 해결하기 위해 노력했지만 헛된 것이 었습니다. 코드를 수정할 때까지

// in my pixel shader: 
float4 diffuseAlbedoMap = float4(0,0,0,0); 

uint realMatIndex; 
for(realMatIndex = 0;realMatIndex < gMaxNumOfTextures;realMatIndex++) 
    if(realMatIndex == matData.gDiffuseMapIndex) 
    { 
     diffuseAlbedoMap = gCommonTexture[matData.gDiffuseMapIndex].Sample(gsamAnisotropicWrap, pin.TexC) * matData.gDiffuseAlbedo; 
     break; 
    } 

제대로 작동합니다. 내 R9 380

을 그리고 모든 형상에

어떤 결함은 HD 4600

왜 정상적으로 표시되지 않습니다!?

글리치 방지를 위해 for 루프를 사용하여 인덱스를 다시 검사해야하는 이유는 무엇입니까?

(나는 더 많은 텍스처를 사용하는 경우,이 효율적으로 작동하지 않을 수 있습니다.)이 문제가 발생할 수 있습니다 무엇

?

나는 밤새이 문제를 생각했지만 대답을 찾을 수 없었다.

감사합니다!

전체 쉐이더 코드 : 당신은 컴파일러 수 있도록 NonUniformIndex(matData.gDiffuseMapIndex)를 사용할 필요가 enter link description here

답변

0

인덱스 분명히, 비 균일 알고있다.

이것은 GCN 하드웨어에서 텍스처 설명자가 웨이브를 통해 공유되는 스칼라 레지스터에 저장되기 때문입니다. 내장 함수는 루프를 수행하지만, 모든 스레드가 완료 될 때까지 발견 된 고유 색인 당 스레드를 마스킹하여 조금 더 효율적으로 처리합니다.

물론 이것은 효과적이지만, 균일하지 않은 경우를 곱하면 아주 이상적인 쉐이더로 끝납니다. 그것을 개선하기 위해 유일한 방법은 내장 함수를 사용하지 않고 인덱스가 웨이브에서 균일 할 것을 보장하는 것입니다. 예를 들어, ExecuteIndirect 내에서 여러 재료를 별도의 그리기 호출로 분할합니다.

+1

감사합니다. SDK 대신 일부 GPU 지식을 배워야합니다. BTW, 다른 질문을 할 수 있습니까? 1 단계 하드웨어 (예 : Intel Intel HD 4600)에서 쉐이더 단계 당 모든 디스크립터 테이블의 최대 쉐이더 리소스 뷰 수는 최대 128 개입니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까? –

+1

즉, 지연 렌더링 버퍼를 포함하여 128 가지 텍스처 만 사용할 수 있습니다. Texture2D를 Texture2DArray로 바꾸고 같은 해상도를 가진 텍스처를 정리하는 방법을 생각 중입니다. 그러나 이것은 좋은 해결책입니까?덕분에 –

+0

내 진보, dx12를 사용하는 경우 intel gpu에 대해 신경 쓰지 않아도됩니다. 심각하지 않습니다. 계층 1 및 설명자 힙의 개념은 바인딩이없는 하드웨어를 지원하는 것입니다. 실제로 DX12의 최고를 달성하는 데 한계가 있습니다. – galop1n