DX12绘制三角形无显示求助(无编译/运行/DX12报错)
DX12 三角形无法显示排查方案
1. 输入装配阶段检查
- 验证顶点缓冲区绑定:确认
IASetVertexBuffers的参数(缓冲区地址、 stride、偏移量)与顶点数据结构完全匹配,且在绘制命令前完成绑定。 - 核对输入布局:输入布局的
SemanticName、SemanticIndex、Format必须与顶点着色器的输入语义严格一致,比如顶点位置语义需为POSITION,避免拼写或大小写错误。 - 确认图元拓扑:调用
IASetPrimitiveTopology设置为D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST(或对应拓扑类型),防止误设为线/点拓扑导致无法渲染三角形。
2. 着色器与根签名校验
- 检查着色器绑定:确保顶点/像素着色器已正确编译并通过
CreateVertexShader/CreatePixelShader创建,且命令列表中已执行VSSetShader和PSSetShader完成绑定。 - 根签名兼容性:除
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT标志外,若着色器使用根参数/常量缓冲区,需保证根签名的定义与着色器引用完全匹配,无参数遗漏或类型不匹配。
3. 命令列表提交流程验证
- 命令列表闭合与提交:确保
Render函数中命令列表录制完成后已调用Close(),提交到命令队列时使用正确的fence同步逻辑,避免GPU未执行绘制命令。 WM_PAINT逻辑检查:在WM_PAINT处理中,确认已正确获取当前帧渲染目标,清除RT后立即执行绘制命令,无步骤跳过或覆盖。
4. 视口与裁剪配置检查
- 视口参数:确认
Viewport的Width、Height与窗口客户端区域匹配,TopLeftX/Y设置正确,避免三角形被视口裁剪。 - 裁剪矩形:若设置了
ScissorRect,需确保其范围覆盖三角形区域,默认不设置时为全窗口范围。
5. 顶点数据与内存验证
- NDC坐标范围:检查顶点坐标是否在DX12的NDC范围内(Z值需在[0,1]区间),超出范围的顶点会被裁剪。
- 顶点缓冲区内存:确认顶点缓冲区使用
D3D12_HEAP_TYPE_UPLOAD或GPU可访问的堆类型,且顶点数据已正确拷贝到缓冲区,无未初始化或拷贝错误。
6. 渲染目标与深度缓冲区(若启用)
- 深度测试状态:若启用深度测试,检查
D3D12_DEPTH_STENCIL_DESC的DepthEnable、DepthFunc参数,避免因深度测试设置错误导致三角形被剔除。 - 混合状态:若使用混合,确认
BlendEnable等参数未导致三角形颜色完全透明,默认关闭混合时应设置D3D12_BLEND_OP_ADD,源/目标因子为D3D12_BLEND_ONE/D3D12_BLEND_ZERO。
内容的提问来源于stack exchange,提问作者Schrottiy
相关产品推荐
相关产品推荐

