2017-03-22 18 views
0

일부 버텍스 정보가있는 일부 모델 (기하)이 있습니다. 예를 들어 position, normal, color, texcoord와 같이이 정보는 각각 고유의 정점 버퍼를가집니다. 그러나 이러한 모델 중 일부는 텍스처 좌표를 가지고 있습니다 ... 이 차이점을 관리하기 위해 상수 버퍼 "hasTextureCoordinates"의 플래그가 == 1이면 검사 할 vertexshader를 썼습니다. 그렇다면 texcoord 매개 변수를 사용할지 여부 . 는 그러나 DirectX는하지 정말이 해결 방법처럼 밖으로 인쇄 않습니다directx11에 선택적 vertexbuffer 객체가 있습니다.

D3D11 정보 : ID3D11DeviceContext :: 그리기 :하지만 요소 [3] 현재 입력의 레이아웃 선언 참조 입력 슬롯 3을, 어떤 버퍼이 결합하지가 슬롯. 빈 슬롯에서 읽은 값이 0을 반환하도록 정의되었으므로 정상입니다. 개발자는 데이터가 어쨌든 사용되지 않을 것임을 알 수 있습니다. 이것은 개발자가 실제로 입력 버퍼를 여기에 바인딩하려는 경우에만 문제가됩니다. [실행 정보 번호 348 : DEVICE_DRAW_VERTEX_BUFFER_NOT_SET]

나는 또한 내가 쓸 수 알아 ...이 "경고"모든 프레임 출력 내부 을보고 좋은 아니다, 모든 하드웨어가 올바르게 처리 있는지 확실하지 않습니다 두 개의 쉐이더, 하나는 텍사스가있는 것과 하나는 없는데, 문제는 이것 만이 누락 된 매개 변수가 아니라는 것입니다. 일부는 색상이 다른 것, 일부는 색상과 텍스처 좌표 등이 있습니다. 또한 각 정점 버퍼 입력 조합에 대한 셰이더를 작성하는 것은 극도로 중복됩니다. 이것은 극도로 나쁘다. 왜냐하면 우리가 하나의 셰이더를 변경한다면, 다른 셰이더도 변경해야하기 때문이다. 셰이더의 일부를 다른 파일에 넣고 포함시킬 수도 있지만 혼란 스럽습니다.

directx에서 특정 버텍스 버퍼가 선택 사항이라고 말하는 방법이 있습니까? 아니면 누군가이 문제에 대해 더 나은 해결책을 알고 있습니까?

답변

1

이 특정 메시지는 프로그래밍 방식으로 표시하지 않을 수 있습니다. ERROR 또는 CORRUPTION 메시지가 아닌 INFO 메시지이므로 무시해도됩니다. 디버그, '소음'메시지를 표시하는 것 외에도

#include <wrl/client.h> 

using Microsoft::WRL::ComPtr; 

ComPtr<ID3D11Debug> d3dDebug; 
if (SUCCEEDED(device.As(&d3dDebug))) 
{ 
    ComPtr<ID3D11InfoQueue> d3dInfoQueue; 
    if (SUCCEEDED(d3dDebug.As(&d3dInfoQueue))) 
    { 
#ifdef _DEBUG 
     d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true); 
     d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true); 
#endif 
     D3D11_MESSAGE_ID hide[] = 
     { 
      D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS, 
      D3D11_MESSAGE_ID_DEVICE_DRAW_VERTEX_BUFFER_NOT_SET, // <--- Your message here! 
      // Add more message IDs here as needed 
     }; 
     D3D11_INFO_QUEUE_FILTER filter = {}; 
     filter.DenyList.NumIDs = _countof(hide); 
     filter.DenyList.pIDList = hide; 
     d3dInfoQueue->AddStorageFilterEntries(&filter); 
    } 
} 

빌드 이것은 또한 사람들은 정말해야 당신이 ERROR에게 또는 부패 메시지를 칠 경우 브레이크 포인트를 생성하는 디버그 층의 원인 결정된.

내가 QueryInterface 체인을 단순화하기 위해 여기 ComPtr을 사용하고 Direct3D SDK Debug Layer Tricks

참고를 참조하십시오, 나는 Anatomy of Direct3D 11 Create Device

에있는 것처럼 나는 또한 가정 당신이 ComPtr<ID3D11Device> device으로 장치를 유지한다고 가정 VS 2013 이상을 사용하여 D3D11_INFO_QUEUE_FILTER filter = {};으로 구조체를 0으로 채우기에 충분합니다.

+0

이 해결 방법은이 문제를 해결하는 좋은 방법이라고 생각하십니까? 아니면 더 나은 방법이 있습니까? – Thomas

+1

일반적으로 말해서 더 나은 해결책은 별개의 입력 레이아웃 객체를 갖는 것입니다. 내 요점은 당신이 * 많이 * 걱정하지 않고 INFO 메시지를 억제 할 수 있다는 것입니다. –