Directx DX11三角形列表根本不渲染

Directx DX11三角形列表根本不渲染,directx,directx-11,direct3d,direct3d11,Directx,Directx 11,Direct3d,Direct3d11,我有一个4个顶点的列表加载到一个顶点缓冲区中,一个索引加载到一个索引缓冲区中 我遇到的问题是,虽然LineList rendermode显示的四边形很好(请参见下文),但三角形列表没有显示任何内容(请参见下文) void BLX::Model::load(std::filesystem::path,Model*Model,ID3D11Device*d3dDevice,ID3D11DeviceContext*d3dContext) { //tmp:只是做一个四边形 浮点数=0.5f; 标准::向量

我有一个4个顶点的列表加载到一个顶点缓冲区中,一个索引加载到一个索引缓冲区中

我遇到的问题是,虽然LineList rendermode显示的四边形很好(请参见下文),但三角形列表没有显示任何内容(请参见下文)

void BLX::Model::load(std::filesystem::path,Model*Model,ID3D11Device*d3dDevice,ID3D11DeviceContext*d3dContext)
{
//tmp:只是做一个四边形
浮点数=0.5f;
标准::向量顶点={
顶点{DirectX::XMFLOAT3(-num,-num,0.0f),DirectX::XMFLOAT3(0.0f,0.0f,0.5f),},//0=TL
顶点{DirectX::XMFLOAT3(num,-num,0.0f),DirectX::XMFLOAT3(0.0f,0.5f,0.0f),},//1=TR
顶点{DirectX::XMFLOAT3(num,num,0.0f),DirectX::XMFLOAT3(0.5f,0.0f,0.0f),},//2=BR
顶点{DirectX::XMFLOAT3(-num,num,0.0f),DirectX::XMFLOAT3(0.5f,0.5f,0.0f),},//3=BL
};
//行列表
//向量指数={0,1,1,2,2,3,3,0};
//三角列表
向量指数={0,1,3,3,1,2};
模型->顶点计数=顶点.size();
model->indexCount=index.size();
//顶点缓冲区
D3D11_BUFFER_DESC vbd={};
vbd.BindFlags=D3D11_BIND_VERTEX_BUFFER;
vbd.Usage=D3D11_Usage_默认值;
vbd.CPUAccessFlags=0u;
vbd.MiscFlags=0u;
vbd.ByteWidth=sizeof(BLX::Vertex)*模型->顶点计数;
vbd.StructureByteStride=sizeof(BLX::Vertex);
D3D11_子资源_数据vsd={};
vsd.psysem=&顶点[0];
vsd.SysMemPitch=0;
vsd.SysMemSlicePitch=0;
d3dDevice->CreateBuffer(&vbd,&vsd,&model->vertexBuffer);
///索引缓冲区
D3D11_BUFFER_DESC ibd={};
ibd.Usage=D3D11_Usage_默认值;
ibd.ByteWidth=sizeof(unsigned int)*model->indexCount;
ibd.BindFlags=D3D11\u BIND\u INDEX\u BUFFER;
ibd.CPUAccessFlags=0;
ibd.MiscFlags=0;
D3D11_子资源_数据isd={};
isd.psysem=&指数[0];
isd.SysMemPitch=0;
isd.SysMemSlicePitch=0;
d3dDevice->CreateBuffer(&ibd,&isd,&model->indexBuffer);
//IA=输入组件
//像素着色器
D3DReadFileToBlob(L“PixelShader2.cso”,&model->pBlob);
d3dDevice->CreatePixelShader(model->pBlob->GetBufferPointer(),model->pBlob->GetBufferSize(),nullptr,&model->pPixelShader);
//顶点着色器
D3DReadFileToBlob(L“VertexShader2.cso”,&model->pBlob);
d3dDevice->CreateVertexShader(model->pBlob->GetBufferPointer(),model->pBlob->GetBufferSize(),nullptr,&model->pVertexShader);
常量D3D11输入元素描述[]=
{
//“位置”对应于顶点着色器语义名称
//语义索引
//数据类型格式
//输入槽
//对齐字节偏移量
//输入槽类
//实例数据步进速率
{“位置”,0,DXGI_格式_R32G32B32_浮点,0,0,D3D11_输入_逐顶点_数据,0},
{“COLOR”,0,DXGI_格式_R32G32B32_浮点,0,12,D3D11_输入_逐顶点_数据,0},
};
//需要顶点着色器blob
d3dDevice->CreateInputLayout(ied、阵列化(ied)、模型->pBlob->GetBufferPointer()、模型->pBlob->GetBufferSize()、模型->pInputLayout);
}
void BLX::Model::render(ID3D11Device*d3dDevice,ID3D11DeviceContext*d3dContext,D3D11_VIEWPORT*vp)
{
恒定步幅=顶点大小;
常数偏移量[]={0u,0u};
d3dContext->IASetVertexBuffers(0u、1u、vertexBuffer.GetAddressOf()、跨步和偏移量[0]);
d3dContext->IASetIndexBuffer(*indexBuffer.GetAddressOf(),DXGI_格式_R32_UINT,偏移量[1]);
d3dContext->PSSetShader(pPixelShader.Get(),nullptr,0u);
d3dContext->VSSetShader(pVertexShader.Get(),nullptr,0u);
d3dContext->IASetInputLayout(pInputLayout.Get());
d3dContext->RSSET视口(1u,vp);
//d3dContext->IASetPrimitiveTopology(D3D11_Primitiver_TOPOLOGY::D3D11_Primitiver_TOPOLOGY_LINELIST);
d3dContext->IASetPrimitiveTopology(D3D11_Primitiver_TOPOLOGY::D3D11_Primitiver_TOPOLOGY_TRIANGLELIST);
d3dContext->DrawIndexed(indexCount,0,0);
}
使用线列表索引和拓扑时:

使用三角形列表索引和拓扑时:

但当我这么做的时候:

//tmp:只是做一个四边形
浮点数=0.5f;
标准::向量顶点={
顶点{DirectX::XMFLOAT3(0.0f,num,0.0f),DirectX::XMFLOAT3(0.0f,0.0f,0.5f),},
顶点{DirectX::XMFLOAT3(num,-num,0.0f),DirectX::XMFLOAT3(0.0f,0.5f,0.0f),},
顶点{DirectX::XMFLOAT3(-num,-num,0.0f),DirectX::XMFLOAT3(0.5f,0.0f,0.0f),},
};
//三角列表
向量指数={0,1,2};
(其他都一样)我得到了这个:


我只是很好奇,当我试图渲染两个三角形以组成一个四边形时,我没有看到或得到什么

你的两个网格,三角形和四边形,具有相反的三角形缠绕顺序。这是怎么做的

,D3D11使用CullMode=向后和向前逆时针=假。 这意味着它只渲染正面,正面定义为“顶点为逆时针方向时”

如上图所示,三角形的顺序确实是逆时针的,但是四边形的两个三角形都是顺时针的,GPU将它们视为背面,并跳过这两个面

您有很多方法可以修复,以下任何一种都可以

  • 在顶点缓冲区中对顶点重新排序
  • 将索引缓冲区中的三角形翻转到
    {0,3,1,1,3,2}
  • 更改光栅化器状态以禁用背面消隐,
    CullMode=D3D11\u CULL\u NONE
  • 更改光栅化器状态以切换正面缠绕方向,
    front逆时针=TRUE
  • 更改传递给顶点着色器的矩阵以包括镜像补偿
      std::vector<unsigned int> indices = { 0, 3, 1, 3, 2, 1 };
    
    D3D11_RASTERIZER_DESC raster_desc;
    raster_desc.FillMode = D3D11_FILL_SOLID;
    raster_desc.CullMode= D3D11_CULL_NONE;
    raster_desc.FrontCounterClockwise = false;
    raster_desc.DepthBias = 0;
    raster_desc.DepthBiasClamp= 0.0f;
    raster_desc.SlopeScaledDepthBias= 0.0f;
    raster_desc.DepthClipEnable= true;
    raster_desc.ScissorEnable= false;
    raster_desc.MultisampleEnable= false;
    raster_desc.AntialiasedLineEnable= false;
    
       ID3D11RasterizerState* raster_state;
       HRESULT hr =d3dDevice->CreateRasterizerState(&raster_desc, &raster_state);
    
       d3dContext->RSSetState(raster_state);