我正在尝试调试我的图形应用程序,以查看为什么该对象没有呈现到屏幕上。所以我进入我的图形调试器并检查我尝试渲染的对象的管道状态(一个简单的平面)。
Pixel Shader没有运行,但输入和顶点着色器阶段看起来很好(它显示了一个平面)。我点击了顶点着色器下面的播放按钮进行调试,但是当我这样做时,我立即收到此错误:此模块的调试信息中缺少源信息。
到目前为止,我已经在几个项目中使用了调试器,但是对于这个项目,调试器不能工作。我使用的那些项目虽然是通用应用程序项目,但是它们带有一堆已经有对象呈现的代码。我现在正在做的这个项目我从一个空项目开始,到目前为止我自己做了一切。
当我收到错误时,我检查了我的调用堆栈,它给了我名字" unknown"和HLSL语言。不幸的是,没有真正帮助。有没有更好的方法来查看问题可能是什么?或者你知道我可能遇到的任何潜在问题吗?
附注:每当我使用图形调试器时,我被告知要转到directx控制面板并添加我在可执行文件列表中工作的项目目录。在我遇到错误之后,我也为这个项目做了这个,我仍然拥有它。
更新我正在查看一些事件列表信息,当我查看具有我的着色器代码的obj时,它会说," Shader编辑并应用不适用于此着色器。这可能是由于构建着色器而没有调试信息或者编译器不受支持而引起的。"也许这与它有关,因为我的其他项目中的其他着色器没有这个错误。
我忘了包含一些代码,所以这里有一些。我正在做的一些代码在这个项目中是不同的,但我回来的所有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而不是Universal App的方式(甚至是在线教程的方式),因为他们这样做的方式让我复制有点奇怪。
//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 :(得分:1)
在进行一些挖掘后我注意到的错误(着色器编辑和应用不适用于此着色器。这可能是由于构建没有调试信息的着色器或使用不受支持的编译器造成的。)让我挠头,我决定看看着色器是否可以发送标志。果然,在D3DCompileFromFile函数中,有一个flag参数。发送D3DCOMPILE_DEBUG,您将能够调试该着色器。我前几天把它设置为NULL因为我不知道任何有益的标志。