Graphics 纹理四边形不渲染

Graphics 纹理四边形不渲染,graphics,2d,rendering,directx-11,Graphics,2d,Rendering,Directx 11,好的,我正在尝试使用DirectX 11在2D中渲染图像。我知道它需要像3D操作一样处理,并渲染为带纹理的四边形。问题是没有渲染,我不知道如何跟踪问题 我已经并将在这里发布代码片段,但请随意查看回购协议,这样您就可以了解完整情况。我所做的一切都是基于流行音乐 我使用的顶点/像素着色器适用于我渲染的三维三角形 顶点着色器: cbuffer MatrixBuffer { matrix World; matrix View; matrix Projection; }; str

好的,我正在尝试使用DirectX 11在2D中渲染图像。我知道它需要像3D操作一样处理,并渲染为带纹理的四边形。问题是没有渲染,我不知道如何跟踪问题

我已经并将在这里发布代码片段,但请随意查看回购协议,这样您就可以了解完整情况。我所做的一切都是基于流行音乐

我使用的顶点/像素着色器适用于我渲染的三维三角形

顶点着色器:

cbuffer MatrixBuffer
{
    matrix World;
    matrix View;
    matrix Projection;
};

struct VertexInputType
{
    float4 Position : POSITION;
    float2 TextureCoordinate : TEXCOORD0;
};

struct PixelInputType
{
    float4 Position : SV_POSITION;
    float2 TextureCoordinate : TEXCOORD0;
};

PixelInputType main(VertexInputType input)
{
    PixelInputType output;

    input.Position.w = 1.0f;

    output.Position = mul(input.Position, World);
    output.Position = mul(output.Position, View);
    output.Position = mul(output.Position, Projection);

    output.Position.z = 0.0f;

    output.TextureCoordinate = input.TextureCoordinate;

    return output;
}
像素着色器

Texture2D Texture;

SamplerState SampleType;

struct PixelInputType
{
    float4 Position : SV_POSITION;
    float2 TextureCoordinate: TEXCOORD0;
};

float4 main(PixelInputType input) : SV_TARGET
{
    return Texture.Sample(SampleType, input.TextureCoordinate);
}
使用此着色器的3D和2D之间的唯一区别在于,在2D中渲染时,投影矩阵设置为正交矩阵。以下是我正在使用的顶点:

//计算位置
顶点[0]。位置=DirectX::XMFLOAT3(_positionX,_positionY,0);
顶点[1]。位置=DirectX::XMFLOAT3(\u位置X+\u宽度,\u位置Y,0);
顶点[2]。位置=DirectX::XMFLOAT3(\u位置X,\u位置Y+\u高度,0);
顶点[3]。位置=DirectX::XMFLOAT3(\u位置X+\u宽度,\u位置Y+\u高度,0);
//计算纹理
顶点[0]。TextureCoordinate=DirectX::XMFLOAT2(0,0);
顶点[1]。TextureCoordinate=DirectX::XMFLOAT2(1,0);
顶点[2]。TextureCoordinate=DirectX::XMFLOAT2(0,1);
顶点[3]。TextureCoordinate=DirectX::XMFLOAT2(1,1);
下面是我要传递的索引:

自动索引=新长[6]
{
0, 3, 2,
0, 1, 3
};
这是我的精灵类的渲染调用:

unsigned int stride=sizeof(TexturedVertex);
无符号整数偏移量=0;
上下文->iSetVertexBuffers(0、1和_vertexBuffer、跨步和偏移);
上下文->iSetIndexBuffer(_indexBuffer,DXGI_FORMAT_R32_UINT,0);
上下文->iSetPrimitiveTopology(D3D11_Primitiver_TOPOLOGY_TRIANGLELIST);
上下文->绘图索引(6,0,0);
我不想只在这里构建代码墙,所以我将省略一些其他关键细节(比如着色器的应用),但还是可以在GitLab上随意翻找,看看我遗漏了什么

我相信我的缠绕顺序是正确的,因为我正在绘制一个带索引的基本体,我认为我可以为四边形绘制4个顶点(而不是教程建议的6个顶点)

我尝试过使用VisualStudio2019的图形调试工具,这些工具确实很酷,但现在对我来说太难消化了。我看到我可以深入研究每个DX对象,看看设置了什么属性,但没有什么问题值得我关注。我在想,如果我可以调试着色器,我可能会看到问题,但VS中有关着色器调试的说明不清楚/不正确;它告诉我打开菜单中找不到的选项

我尝试过使用PIX,但它崩溃了,输出如下:

 [ STATE_CREATION INFO #2097273: CREATE_DEPTHSTENCILSTATE]
D3D11 INFO: Create ID3D11RasterizerState: Name="unnamed", Addr=0x0934BE0C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097276: CREATE_RASTERIZERSTATE]
D3D11 INFO: Create ID3D11Sampler: Name="unnamed", Addr=0x00200F0C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097267: CREATE_SAMPLER]
D3D11 INFO: Create ID3D11Query: Name="unnamed", Addr=0x08F7D51C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097279: CREATE_QUERY]
D3D11 INFO: Create ID3D11Query: Name="unnamed", Addr=0x08F7ED8C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097279: CREATE_QUERY]
D3D11 INFO: Destroy ID3D11Query: Name="unnamed", Addr=0x08F7ED8C [ STATE_CREATION INFO #2097281: DESTROY_QUERY]
D3D11 INFO: Destroy ID3D11Query: Name="unnamed", Addr=0x08F7D51C [ STATE_CREATION INFO #2097281: DESTROY_QUERY]
D3D11 INFO: Destroy ID3D11RasterizerState: Name="unnamed", Addr=0x0934BE0C [ STATE_CREATION INFO #2097278: DESTROY_RASTERIZERSTATE]
D3D11 INFO: Destroy ID3D11DepthStencilState: Name="unnamed", Addr=0x08D8FDB4 [ STATE_CREATION INFO #2097275: DESTROY_DEPTHSTENCILSTATE]
D3D11 INFO: Destroy ID3D11BlendState: Name="unnamed", Addr=0x086DEB7C [ STATE_CREATION INFO #2097272: DESTROY_BLENDSTATE]
D3D11 INFO: Destroy ID3D11Sampler: Name="unnamed", Addr=0x00200F0C [ STATE_CREATION INFO #2097269: DESTROY_SAMPLER]
D3D11 INFO: Destroy ID3D11Context: Name="unnamed", Addr=0x09260050 [ STATE_CREATION INFO #2097227: DESTROY_CONTEXT]
D3D11 INFO: Destroy ID3DDeviceContextState: Name="unnamed", Addr=0x093293C0 [ STATE_CREATION INFO #3145749: DESTROY_DEVICECONTEXTSTATE]
D3D11 INFO: Create ID3D11Context: Name="unnamed", Addr=0x09260050, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097225: CREATE_CONTEXT]
D3D11 INFO: Create ID3DDeviceContextState: Name="unnamed", Addr=0x09328CC8, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #3145735: CREATE_DEVICECONTEXTSTATE]
D3D11 INFO: Create ID3D11BlendState: Name="unnamed", Addr=0x08E4002C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097270: CREATE_BLENDSTATE]
D3D11 INFO: Create ID3D11DepthStencilState: Name="unnamed", Addr=0x0933CEC4, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097273: CREATE_DEPTHSTENCILSTATE]
D3D11 INFO: Create ID3D11RasterizerState: Name="unnamed", Addr=0x002FA694, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097276: CREATE_RASTERIZERSTATE]
D3D11 INFO: Create ID3D11Sampler: Name="unnamed", Addr=0x08E5B784, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097267: CREATE_SAMPLER]
D3D11 INFO: Create ID3D11Query: Name="unnamed", Addr=0x094EC04C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097279: CREATE_QUERY]
D3D11 INFO: Destroy ID3D11Query: Name="unnamed", Addr=0x094EC04C [ STATE_CREATION INFO #2097281: DESTROY_QUERY]
D3D11 INFO: Destroy ID3D11RasterizerState: Name="unnamed", Addr=0x002FA694 [ STATE_CREATION INFO #2097278: DESTROY_RASTERIZERSTATE]
D3D11 INFO: Destroy ID3D11DepthStencilState: Name="unnamed", Addr=0x0933CEC4 [ STATE_CREATION INFO #2097275: DESTROY_DEPTHSTENCILSTATE]
D3D11 INFO: Destroy ID3D11BlendState: Name="unnamed", Addr=0x08E4002C [ STATE_CREATION INFO #2097272: DESTROY_BLENDSTATE]
D3D11 INFO: Destroy ID3D11Sampler: Name="unnamed", Addr=0x08E5B784 [ STATE_CREATION INFO #2097269: DESTROY_SAMPLER]
D3D11 INFO: Destroy ID3D11Context: Name="unnamed", Addr=0x09260050 [ STATE_CREATION INFO #2097227: DESTROY_CONTEXT]
D3D11 INFO: Destroy ID3DDeviceContextState: Name="unnamed", Addr=0x09328CC8 [ STATE_CREATION INFO #3145749: DESTROY_DEVICECONTEXTSTATE]
Frame 000001 ............PRE: AddObject(DXGI Factory, 0x070C4F90, 0x086E70B0)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Factory, 0x070C4F90, 0x086E70B0)
Frame 000001 ........POST: <S_OK> CreateDXGIFactory(IID_IDXGIFactory, 0x005EF4D8)
Frame 000001 ........PRE: <this=0x070c4f90>IDXGIFactory::EnumAdapters(0, 0x005EF4C0)
Frame 000001 ............PRE: AddObject(DXGI Adapter, 0x07085DB0, 0x0926B2E8)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Adapter, 0x07085DB0, 0x0926B2E8)
Frame 000001 ........POST: <S_OK><this=0x070c4f90> IDXGIFactory::EnumAdapters(0, 0x005EF4C0)
Frame 000001 ........PRE: <this=0x07085db0>IDXGIAdapter::EnumOutputs(0, 0x005EF4B4)
Frame 000001 ............PRE: AddObject(DXGI Output, 0x07085E08, 0x086E82F8)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Output, 0x07085E08, 0x086E82F8)
Frame 000001 ........POST: <S_OK><this=0x07085db0> IDXGIAdapter::EnumOutputs(0, 0x005EF4B4)
Frame 000001 ........PRE: <this=0x07085e08>IDXGIOutput::GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, 1, 0x005EF4A8, NULL)
Frame 000001 ........POST: <S_OK><this=0x07085e08> IDXGIOutput::GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, 1, 0x005EF4A8, NULL)
Frame 000001 ........PRE: <this=0x07085e08>IDXGIOutput::GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, 1, 0x005EF490, 0x08E48768)
Frame 000001 ........POST: <S_OK><this=0x07085e08> IDXGIOutput::GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, 1, 0x005EF490, 0x08E48768)
Frame 000001 ........PRE: <this=0x07085e08>IDXGIOutput::Release()
Frame 000001 ............PRE: RemoveObject(DXGI Output, 0x07085E08, 0x086E82F8)
Frame 000001 ............POST: <> RemoveObject(DXGI Output, 0x07085E08, 0x086E82F8)
Frame 000001 ........POST: <0><this=0x07085e08> IDXGIOutput::Release()
Frame 000001 ........PRE: <this=0x07085db0>IDXGIAdapter::Release()
Frame 000001 ............PRE: RemoveObject(DXGI Adapter, 0x07085DB0, 0x0926B2E8)
Frame 000001 ............POST: <> RemoveObject(DXGI Adapter, 0x07085DB0, 0x0926B2E8)
Frame 000001 ........POST: <0><this=0x07085db0> IDXGIAdapter::Release()
Frame 000001 ........PRE: <this=0x070c4f90>IDXGIFactory::Release()
Frame 000001 ............PRE: RemoveObject(DXGI Factory, 0x070C4F90, 0x086E70B0)
Frame 000001 ............POST: <> RemoveObject(DXGI Factory, 0x070C4F90, 0x086E70B0)
Frame 000001 ........POST: <0><this=0x070c4f90> IDXGIFactory::Release()
Frame 000001 ........PRE: D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 2, 0x005EF3D0, 2, 7, 0x005EF3E0, 0x0023A360, 0x0023A364, NULL, 0x0023A368)
D3D11 INFO: Create ID3D11Context: Name="unnamed", Addr=0x09260050, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097225: CREATE_CONTEXT]
D3D11 INFO: Create ID3DDeviceContextState: Name="unnamed", Addr=0x09328CC8, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #3145735: CREATE_DEVICECONTEXTSTATE]
D3D11 INFO: Create ID3D11BlendState: Name="unnamed", Addr=0x093B486C, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097270: CREATE_BLENDSTATE]
D3D11 INFO: Create ID3D11DepthStencilState: Name="unnamed", Addr=0x09352A94, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097273: CREATE_DEPTHSTENCILSTATE]
D3D11 INFO: Create ID3D11RasterizerState: Name="unnamed", Addr=0x08E404DC, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097276: CREATE_RASTERIZERSTATE]
D3D11 INFO: Create ID3D11Sampler: Name="unnamed", Addr=0x08D8FE24, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097267: CREATE_SAMPLER]
D3D11 INFO: Create ID3D11Query: Name="unnamed", Addr=0x092F52F4, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097279: CREATE_QUERY]
D3D11 INFO: Create ID3D11Texture2D: Name="unnamed", Addr=0x095F47C4, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097234: CREATE_TEXTURE2D]
Frame 000001 ............PRE: AddObject(D3D11 Device, 0x07085FD0, 0x094E9EB4)
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Device, 0x07085FD0, 0x094E9EB4)
Frame 000001 ............PRE: AddObject(DXGI Factory, 0x070C4F90, 0x086E70B0)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Factory, 0x070C4F90, 0x086E70B0)
Frame 000001 ............PRE: AddObject(DXGI Adapter, 0x07086030, 0x0926B2E8)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Adapter, 0x07086030, 0x0926B2E8)
Frame 000001 ............PRE: AddObject(DXGI Device, 0x07086088, 0x094E9EB0)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Device, 0x07086088, 0x094E9EB0)
Frame 000001 ............PRE: AddObject(DXGI Swap Chain, 0x070860E8, 0x0929F848)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Swap Chain, 0x070860E8, 0x0929F848)
Frame 000001 ............PRE: AddObject(DXGI Surface, 0x07086180, 0x095F48DC)
Frame 000001 ............POST: <TRUE> AddObject(DXGI Surface, 0x07086180, 0x095F48DC)
Frame 000001 ............PRE: AddObject(D3D10 Texture2D, 0x070861E0, 0x095F487C)
Frame 000001 ............POST: <TRUE> AddObject(D3D10 Texture2D, 0x070861E0, 0x095F487C)
Frame 000001 ............PRE: AddObject(D3D11 Device Context, 0x070C4FE8, 0x09260050)
Frame 000001 ............POST: <TRUE> AddObject(D3D11 Device Context, 0x070C4FE8, 0x09260050)
Frame 000001 ........POST: <S_OK> D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 2, 0x005EF3D0, 2, 7, 0x005EF3E0, 0x0023A360, 0x0023A364, NULL, 0x0023A368)
Frame 000001 ........PRE: <this=0x07085fd0>ID3D11Device::QueryInterface({0x79cf2233, 0x7536, 0x4948, 0x9d, 0x36, 0x1e, 0x46, 0x92, 0xdc, 0x57, 0x60}, 0x005EF3C4)
Frame 000001 ........POST: <S_OK><this=0x07085fd0> ID3D11Device::QueryInterface({0x79cf2233, 0x7536, 0x4948, 0x9d, 0x36, 0x1e, 0x46, 0x92, 0xdc, 0x57, 0x60}, 0x005EF3C4)
Frame 000001 ........PRE: <this=0x07085fd0>ID3D11Device::QueryInterface({0x6543dbb6, 0x1b48, 0x42f5, 0xab, 0x82, 0xe9, 0x7e, 0xc7, 0x43, 0x26, 0xf6}, 0x005EF3B8)
Frame 000001 ........POST: <S_OK><this=0x07085fd0> ID3D11Device::QueryInterface({0x6543dbb6, 0x1b48, 0x42f5, 0xab, 0x82, 0xe9, 0x7e, 0xc7, 0x43, 0x26, 0xf6}, 0x005EF3B8)
Frame 000001 ........PRE: <this=0x070860e8>IDXGISwapChain::GetBuffer(0, IID_ID3D11Texture2D, 0x005EF3AC)
Frame 000001 ........POST: <S_OK><this=0x070860e8> IDXGISwapChain::GetBuffer(0, IID_ID3D11Texture2D, 0x005EF3AC)
Frame 000001 ........PRE: <this=0x07085fd0>ID3D11Device::CreateRenderTargetView(0x070861E0, NULL, 0x0023A36C)
D3D11 CORRUPTION: ID3D11Device::CreateRenderTargetView: First parameter is corrupt! [ MISCELLANEOUS CORRUPTION #13: CORRUPTED_PARAMETER1]
D3D11: **BREAK** enabled for the previous message, which was: [ CORRUPTION MISCELLANEOUS #13: CORRUPTED_PARAMETER1 ]
An unhandled exception occurred.
从VisualStudio调试代码时,我没有遇到此异常

我正在寻找更好的方法来调试我的DirectX 11应用程序,以便将来我可以自己解决这些问题。我还想弄清楚我在PIX上犯了什么错误(这可能是我的应用程序在从PIX运行时产生的一些假设)。最重要的是,我想找出在渲染这个2D四边形时我做错了什么

如果您需要更多信息来帮助,请告诉我。谢谢大家!

编辑: 我还上传了来自VS的框架分析的XML输出,我认为这显示的唯一关键部分是对DX框架的调用

编辑:
我正在使用PIX版本9.29.1962.0000(64位),2010年6月。我正在运行Windows10Build17134。我刚刚意识到这个版本的PIX可能早于DX11,所以我现在正在从微软查看最新版本。我将更新结果。

调试此类问题确实非常棘手。在Visual Studio图形调试器中,您应该能够选择绘制调用并查看各个阶段(顶点着色器,PS)的结果,即使没有逐行着色器调试。也许这会给你一个想法。您还应该能够看到绑定的缓冲区和数据声明——也许它们有问题。最后,如果您使用的是NVIDIA GPU,您可能会更幸运地使用着色器调试。您使用的是哪个版本的“PIX”?传统DirectX SDK中的那个?你正在使用哪个操作系统?