2016-11-26 2 views
0

그래픽 응용 프로그램을 디버깅하여 개체가 화면에 렌더링되지 않는 이유를 확인하려고합니다. 그래서 저는 그래픽 디버거에 들어가서 렌더링하려고하는 객체 (간단한 평면)의 파이프 라인 상태를 확인합니다.원본 오류가 발생하는 VS 2015 그래픽 디버거

픽셀 셰이더가 실행되지 않았지만 입력 및 버텍스 셰이더 단계가 잘 보입니다 (평면이 표시됨). 버텍스 쉐이더 아래에있는 플레이 버튼을 클릭하여 디버깅했지만,이 오류가 발생하면 소스 정보가이 모듈의 디버그 정보에 없습니다.

지금까지 몇 가지 프로젝트에서 디버거를 사용해 왔지만이 프로젝트에서는 디버거가 작동하지 않습니다. 내가 사용한 프로젝트는 범용 앱 프로젝트 였으므로 이미 객체가 렌더링 된 많은 코드가 함께 제공되었습니다. 지금 내가하고있는이 프로젝트는 빈 프로젝트로 시작하여 지금까지 모든 것을 스스로 만들었습니다.

오류가 발생하면 내 호출 스택을 검사하여 "알 수 없음"이라는 이름과 HLSL이라는 언어를 제공합니다. 불행히도 도움이되지 않습니다. 문제가 무엇인지 알 수있는 더 좋은 방법이 있습니까? 아니면 내가 가지고있는 잠재적 인 문제를 알고 있습니까?

사이드 노트 : 그래픽 디버거를 사용할 때마다 directx 제어판으로 가서 작업리스트에서 작업중인 프로젝트의 디렉토리를 추가해야한다고 들었습니다. 나는이 프로젝트에 대해서도 오류가 발생한 후에이 작업을 수행했으며, 여전히 가지고 있습니다.

업데이트 일부 이벤트 목록 정보를보고 있는데 셰이더 코드가있는 obj를 보면 "셰이더 편집 및 적용은이 셰이더에서 사용할 수 없습니다. 디버그 정보가없는 쉐이더 나 지원되지 않는 컴파일러로 인해 발생합니다. " 내 프로젝트의 다른 쉐이더에는이 오류가 없기 때문에이 작업과 관련이있을 수 있습니다.

몇 가지 코드를 포함하는 것을 잊었으니 여기를 참조하십시오. 내가하는 코드 중 일부는이 프로젝트에서 다르지만 내가 돌아 오는 모든 HRESULT는 S_OK라고 말합니다. 장치, 스왑 체인 및 장치 컨텍스트를 만들 때와 마찬가지로 디버그 플래그를 보내야합니다. 나는 이것이 내 출력 창을위한 것이라고 생각하지만, 그래픽 디버거에 영향을 미칠 수있는 경우를 대비해 생각했다.

if (_DEBUG) 
{ 
    flags = D3D11_CREATE_DEVICE_DEBUG; 
} 

HRESULT swapResult = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, NULL, NULL, D3D11_SDK_VERSION, &swapChainDesc, swapChain.GetAddressOf(), device.GetAddressOf(), NULL, deviceContext.GetAddressOf()); 

는 또한 D3DCompileFromFile 대신 범용 앱이 (또는 방법 자습서가 온라인을) 그들이 그 일을 한 방법은 나를 복제에 대한 약간 이상한 때문에 그것을 수행하는 방법을 사용해야합니다. 난 그냥 지금 보여주는 기본 객체를 얻으려고하기 때문에

//compile shaders 
Microsoft::WRL::ComPtr<ID3D10Blob> basicVSBuffer; 
Microsoft::WRL::ComPtr<ID3D10Blob> basicPSBuffer; 

HRESULT vsCompResult = D3DCompileFromFile(L"VS_Basic.hlsl", NULL, NULL, "main", "vs_4_0", NULL, NULL, basicVSBuffer.GetAddressOf(), NULL); 
HRESULT psCompResult = D3DCompileFromFile(L"PS_Basic.hlsl", NULL, NULL, "main", "ps_4_0", NULL, NULL, basicPSBuffer.GetAddressOf(), NULL); 

//create shaders 

HRESULT vsCrtResult = device->CreateVertexShader(basicVSBuffer->GetBufferPointer(), basicVSBuffer->GetBufferSize(), NULL, basicVS.GetAddressOf()); 
HRESULT psCrtResult = device->CreatePixelShader(basicPSBuffer->GetBufferPointer(), basicPSBuffer->GetBufferSize(), NULL, basicPS.GetAddressOf()); 

vertexShaders.push_back(basicVS); 
pixelShaders.push_back(basicPS); 

는 마지막으로 내 쉐이더는 매우 맨손으로 뼈입니다. 나는 그들과 어떤 실수가있을 수 있는지를 보지 못했다.

//My Vertex shader (VS_Basic.hlsl) 

// A constant buffer that stores the three basic column-major matrices for  composing geometry. 
cbuffer ModelViewProjectionConstantBuffer : register(b0) 
{ 
matrix model; 
matrix view; 
matrix projection; 
}; 

// Per-vertex data used as input to the vertex shader. 
struct VertexShaderInput 
{ 
float3 pos : POSITION; 
float3 normal : NORMAL; 
float3 uv : TEXCOORD; 
}; 

// Per-pixel color data passed through the pixel shader. 
struct PixelShaderInput 
{ 
float4 pos : SV_POSITION; 
float3 normal : NORMAL; 
float3 uv : TEXCOORD; 
}; 

// Simple shader to do vertex processing on the GPU. 
PixelShaderInput main(VertexShaderInput input) 
{ 
PixelShaderInput output; 
float4 pos = float4(input.pos, 1.0f); 

// Transform the vertex position into projected space. 
pos = mul(pos, model); 
pos = mul(pos, view); 
pos = mul(pos, projection); 
output.pos = pos; 

// Pass the color through without modification. 
output.uv = input.uv; 

//pass normal 
output.normal = input.normal; 

return output; 
} 

가 여기 내 픽셀 쉐이더의 (PS_Basic.hlsl)

struct PS_BasicInput 
{ 
float4 position : SV_POSITION; 
float3 normal : NORMAL; 
float2 uv : TEXCOORD; 
}; 

float4 main(PS_BasicInput input) : SV_TARGET 
{ 
float4 resultColor; 

//just basic test 
resultColor = float4(1, 0, 0, 1); 

return resultColor; 
} 
+0

Welcome to Stackoverflow. 코드를 공유하십시오. [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve)을 읽어보십시오. 답변을 얻을 수있는 기회를 극대화하기 위해 무엇을 제공해야하는지 알려줍니다. – MikeJRamsey56

답변

0

내가 뒷조사 (쉐이더 편집을 수행 한 후 발견하고 적용 오류이 쉐이더를 사용할 수 없습니다. 이것은 구축으로 인해 발생할 수 있습니다 디버그 정보가 없거나 지원되지 않는 컴파일러가있는 쉐이더). 내 머리를 긁어서 셰이더가 플래그를 보낼 수 있는지 확인하기로 결정했습니다. D3DCompileFromFile 함수에는 플래그 매개 변수가 있습니다. D3DCOMPILE_DEBUG를 보내면 해당 쉐이더를 디버깅 할 수 있습니다. 전에 유익한 깃발을 알지 못했기 때문에 나는 그것을 만들 때 NULL로 설정했습니다.