최근에 내 엔진에 텍스처로드가 구현되었습니다. 그러나 텍스처에는 때로는 약간의 결함이 있습니다.다이나믹 인덱싱을 사용할 때 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
감사합니다. SDK 대신 일부 GPU 지식을 배워야합니다. BTW, 다른 질문을 할 수 있습니까? 1 단계 하드웨어 (예 : Intel Intel HD 4600)에서 쉐이더 단계 당 모든 디스크립터 테이블의 최대 쉐이더 리소스 뷰 수는 최대 128 개입니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까? –
즉, 지연 렌더링 버퍼를 포함하여 128 가지 텍스처 만 사용할 수 있습니다. Texture2D를 Texture2DArray로 바꾸고 같은 해상도를 가진 텍스처를 정리하는 방법을 생각 중입니다. 그러나 이것은 좋은 해결책입니까?덕분에 –
내 진보, dx12를 사용하는 경우 intel gpu에 대해 신경 쓰지 않아도됩니다. 심각하지 않습니다. 계층 1 및 설명자 힙의 개념은 바인딩이없는 하드웨어를 지원하는 것입니다. 실제로 DX12의 최고를 달성하는 데 한계가 있습니다. – galop1n