PO到RTV

--POR entered --3 records applied and saved
SELECT rh.authorization_status,
       rh.requisition_header_id,
       rh.*
  FROM po_requisition_headers_all rh
 WHERE segment1 = '1952058'
   AND org_id = 84;
--authorization_status:INCOMPLETE

SELECT *
  FROM po_requisition_lines_all
 WHERE requisition_header_id = 4327744
   AND requisition_line_id = 4409451;

SELECT d.distribution_id,
       d.*
  FROM po_req_distributions_all d
 WHERE requisition_line_id = 4409451;
--distribution_id:4455570

---------------------------------------------------
--submited and go to Workflow User to approve the POR
-------------------------------------------------
--PO approved --4 records applied and saved
SELECT h.wf_item_type,
       h.wf_item_key,
       h.authorization_status,
       h.type_lookup_code,
       h.closed_code,
       h.org_id,
       h.*
  FROM po_headers_all h
 WHERE segment1 = '439825775';
--po_header_id = 1015429 Authorization_status:APPROVED 

SELECT l.po_line_id,
       l.closed_code,
       l.*
  FROM po_lines_all l
 WHERE po_header_id = 1015429;
--po_line_id = 8971344 

SELECT loc.line_location_id,
       loc.ship_to_organization_id,
       loc.approved_flag,
       loc.inspection_required_flag,
       receipt_required_flag,
       loc.closed_code,
       loc.accrue_on_receipt_flag,
       loc.*
  FROM po_line_locations_all loc
 WHERE po_line_id = 8971344;
--Line_location_id:14293816 
--Approved_Flag:Y  
--Receipt_required_flag=Y 
--Closed_code:OPEN
--accrue_on_receipt_flag:Y

SELECT dis.po_distribution_id,
       dis.code_combination_id,
       dis.destination_type_code,
       dis.*
  FROM po_distributions_all dis
 WHERE line_location_id = 14293816;
--po_distribution_id:14224451 
--Code_combination_id:1209 
--Destination_type_code:INVENTORY

-----------------------------------------------------
--PO receipts --2 records applied and saved

SELECT * --shipment_line_id:9655858
  FROM rcv_shipment_lines
 WHERE po_header_id = 1015429
   AND po_line_id = 8971344
   AND po_line_location_id = 14293816;
--shipment_line_id:9655858 
--shipment_header_id = 4081557

SELECT * FROM rcv_shipment_headers WHERE shipment_header_id = 4081557;

SELECT rt.transaction_type,
       rt.interface_source_code,
       rt.source_document_code,
       rt.destination_type_code,
       rt.inspection_status_code,
       rt.*
  FROM rcv_transactions rt
 WHERE po_header_id = 1015429
   AND po_line_id = 8971344
   AND po_line_location_id = 14293816
   AND shipment_line_id = 9655858
   AND shipment_header_id = 4081557;
--transaction_id = 16396290 
--transaction_type:RECEIVE 
--destination_type_code:RECEIVING

SELECT mo.txn_source_id, --PO Receipts: rcv_transactions.transaction_id:16396290 接受阶段的接受事务处理id
       mo.reference, --PO_LINE_LOCATION_ID
       mo.reference_id, --po_line_location_id:14293816
       mo.*
  FROM inv.mtl_txn_request_lines mo
 WHERE inventory_item_id = 13139193;
--header_id:7098464

SELECT * FROM inv.mtl_txn_request_headers WHERE header_id = 7098464;

-----------------------------------------------------
--PO receiving transactions(DELIVER) --1 records applied and saved

SELECT rt.transaction_type,
       rt.interface_source_code,
       rt.source_document_code,
       rt.destination_type_code,
       rt.inspection_status_code,
       rt.subinventory,
       rt.transfer_lpn_id,
       rt.*
  FROM rcv_transactions rt
 WHERE po_header_id = 1015429
   AND po_line_id = 8971344
   AND po_line_location_id = 14293816
   AND shipment_line_id = 9655858
   AND shipment_header_id = 4081557
   AND po_distribution_id = 14224451;
---transaction_id = 16396310 
--transaction_type = DELIVER 
--destination_type_code = INVENTORY

SELECT mmt.source_code, --RCV
       mmt.source_line_id, --rcv_transaction_id:16396310   接受阶段的接受事务处理id
       transaction_source_id, --po_header_id:1015429
       mmt.*
  FROM inv.mtl_material_transactions mmt
 WHERE rcv_transaction_id = 16396310
   AND transaction_source_id = 1015429; --po_header_id
--Transaction Type:PO Receipt 
--Transaction Action:Receipt into stores 
--Inventory_item_id:13139193

SELECT mo.txn_source_id, --PO Receipts: rcv_transactions.transaction_id:16396290
       mo.reference, --PO_LINE_LOCATION_ID
       mo.reference_id, --po_line_location_id:14293816
       mo.*
  FROM inv.mtl_txn_request_lines mo
 WHERE txn_source_id = 16396290;
--header_id:7098464

SELECT * FROM inv.mtl_txn_request_headers WHERE header_id = 7098464;

----------------------------------------------------
--PO Return 
---------------
--Return To Receiving --1 records applied and saved

SELECT rt.transaction_type,
       rt.interface_source_code,
       rt.source_document_code,
       rt.destination_type_code,
       rt.inspection_status_code,
       rt.subinventory,
       rt.transfer_lpn_id,
       rt.*
  FROM rcv_transactions rt
 WHERE po_header_id = 1015429
   AND po_line_id = 8971344
   AND po_line_location_id = 14293816
   AND shipment_line_id = 9655858
   AND shipment_header_id = 4081557
   AND po_distribution_id = 14224451
   AND interface_source_code IS NULL;
--Transactiion_type:RETURN TO RECEIVING 
--Source_document_code:PO 
--Destination_type_code = INVENTORY
--Transaction_id:16396330

SELECT mmt.source_code, --RCV
       mmt.source_line_id, --rcv_transaction_id:16396330
       transaction_source_id, --po_header_id:1015429
       mmt.*
  FROM inv.mtl_material_transactions mmt
 WHERE rcv_transaction_id = 16396330
   AND transaction_source_id = 1015429; --po_header_id
--Transaction Type:          Return to Vendor 
--Transaction Action:        Issue from stores 
--Inventory_item_id:         13139193

--0 rows selected
SELECT mo.txn_source_id, --PO Receipts: rcv_transactions.transaction_id:16396290
       mo.*
  FROM inv.mtl_txn_request_lines mo
 WHERE txn_source_id = 16396330;

------------------
--Return To Supplier --1 records applied and saved
SELECT rt.transaction_type,
       rt.interface_source_code,
       rt.source_document_code,
       rt.destination_type_code,
       rt.inspection_status_code,
       rt.subinventory,
       rt.transfer_lpn_id,
       rt.*
  FROM rcv_transactions rt
 WHERE po_header_id = 1015429
   AND po_line_id = 8971344
   AND po_line_location_id = 14293816
   AND shipment_line_id = 9655858
   AND shipment_header_id = 4081557
      --AND po_distribution_id = 14224451
   AND interface_source_code IS NULL;
--Transactiion_type:RETURN TO VENDOR 
--Source_document_code:PO 
--Destination_type_code = RECEIVING 
--transaction_id:16396350

--0 rows selected
SELECT mo.txn_source_id, --PO Receipts: rcv_transactions.transaction_id
       mo.*
  FROM inv.mtl_txn_request_lines mo
 WHERE txn_source_id = 16396350;
------------------------------------------------------------

SELECT *
  FROM rcv_receiving_sub_ledger
 WHERE rcv_transaction_id IN (16396290, 16396350);
--RECEIVING, RETURN TO VENDOR
-----------------------------------------------------------

po_requisition_headers_all

po_requisition_lines_all

po_req_distributions_all

po_headers_all

po_lines_all

po_line_locations_all

po_distributions_all

po_releases_all

rcv_shipment_lines

rcv_shipment_headers

rcv_transactions

mtl_txn_request_lines

mtl_txn_request_headers

mtl_material_transactions_temp  

mtl_material_transactions

mtl_onhand_quantities_detail  

rcv_receiving_sub_ledger
<think>我们正在排查禁用混合(Blend)和深度测试(DepthTest)后,部分像素未写入渲染目标视图(RTV)的问题。根据之前的讨论,我们已经排除了混合和深度测试的影响,因此需要从其他角度进行排查。以下是一些可能的原因和排查步骤: ### 1. **检查光栅化状态** - **裁剪(Scissor)测试**:如果启用了裁剪测试,且裁剪矩形设置不正确,可能会导致部分像素被裁剪掉。 - 检查光栅化描述符(`D3D12_RASTERIZER_DESC`)中的`ScissorEnable`是否被设置为`TRUE`。如果是,请确保裁剪矩形(通过`RSSetScissorRects`设置)覆盖了所有需要绘制的区域。 - 临时禁用裁剪测试:将`ScissorEnable`设置为`FALSE`,然后重新运行程序,观察问题是否消失。 - **多重采样(Multisampling)**:如果使用了多重采样,且样本覆盖不足,可能导致某些像素未被着色。 - 检查渲染目标的创建描述(`D3D12_RESOURCE_DESC`)中的`SampleDesc`(采样数量和采样质量)。确保与管线状态对象(PSO)中的设置一致。 - 在像素着色器中,确保使用了正确的语义(如`SV_Position`)和采样方式。 ### 2. **检查视口设置** - 视口(Viewport)定义了渲染目标上的绘制区域。如果视口设置不正确,可能导致部分像素位于视口之外。 - 检查`RSSetViewports`设置的视口是否覆盖了渲染目标的整个区域(或预期区域)。 - 在顶点着色器中,确保输出的位置坐标(`SV_Position`)在归一化设备坐标(NDC)范围内$[-1,1]^3$。如果超出这个范围,则不会被光栅化。 ### 3. **检查顶点着色器输出** - 顶点着色器输出的位置信息必须正确变换到齐次裁剪空间(通过乘以世界视图投影矩阵)。如果变换不正确,可能导致三角形不在视锥体内,从而不被光栅化。 - 在顶点着色器中,检查`vout.PosH`的计算是否正确(如引用[3]所示): ```hlsl vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj); ``` - 确保常量缓冲区中的`gWorldViewProj`矩阵正确更新,且与当前帧的物体变换和摄像机设置一致。 ### 4. **检查资源绑定** - 虽然禁用了深度测试,但深度模板视图(DSV)的绑定可能会影响某些硬件的优化行为(如深度测试被隐式跳过,但绑定状态仍可能导致问题)。 - 尝试不绑定深度模板视图(即在OM阶段不设置DSV),观察问题是否消失。 - 确保渲染目标视图(RTV)已正确绑定到输出合并(OM)阶段,且其格式与PSO中设置的格式一致。 ### 5. **像素着色器中的丢弃操作** - 在像素着色器中,如果使用了`clip()`函数或手动丢弃像素(例如,通过`discard`指令),则这些像素不会被写入RTV。 - 检查像素着色器代码,是否存在条件判断导致某些像素被丢弃。例如: ```hlsl if (condition) { discard; // 或 clip(-1); } ``` - 临时修改像素着色器,使其始终输出一个固定颜色(如红色),以排除着色器内部逻辑的影响。 ### 6. **几何体数据问题** - **索引缓冲区**:如果使用索引绘制(`DrawIndexed`或`DrawIndexedInstanced`),检查索引是否正确,特别是起始索引位置(`StartIndexLocation`)和基本顶点位置(`BaseVertexLocation`)是否设置正确。 - **顶点缓冲区**:确保顶点缓冲区绑定正确,且顶点数据包含正确的位置和纹理坐标等信息。 - **拓扑结构**:图元拓扑类型(如三角形列表、三角形带等)设置不正确可能导致部分三角形未被正确绘制。 ### 7. **调试工具** - **使用PIX或RenderDoc**:通过图形调试工具(如PIX for Windows)捕获一帧,检查绘制调用的详细情况: - 查看顶点着色器输出的位置是否正确。 - 检查光栅化后的像素是否被生成(即查看像素着色器的输入)。 - 检查像素着色器执行后,哪些像素被写入RTV。 - **调试输出**:在像素着色器中添加调试输出,例如根据位置返回不同颜色,以帮助定位问题区域。例如: ```hlsl // 在像素着色器中: float4 PS(VertexOut pin) : SV_Target { // 将屏幕坐标归一化到[0,1] float2 screenUV = pin.PosH.xy / float2(1280, 720); // 假设屏幕分辨率为1280x720 // 如果像素位于屏幕左上角1/4区域,则返回红色 if (screenUV.x < 0.5 && screenUV.y < 0.5) { return float4(1, 0, 0, 1); } return float4(0, 1, 0, 1); // 其他区域返回绿色 } ``` 通过这种方式,可以直观地看到哪些像素被着色器处理。 ### 8. **其他可能原因** - **资源状态**:渲染目标资源在绘制前必须处于正确的状态(如`D3D12_RESOURCE_STATE_RENDER_TARGET`)。使用资源屏障(Resource Barrier)确保状态转换正确。 - **清除操作**:在开始渲染前,是否清除了渲染目标?如果部分区域未被重绘,可能保留之前的黑色。 - **多线程问题**:如果使用多线程渲染,确保资源在渲染时不被其他线程修改。 ### 排查步骤总结 1. **简化测试**:将像素着色器替换为输出固定颜色的简单着色器,排除着色器逻辑问题。 2. **禁用裁剪测试**:检查光栅化状态中的`ScissorEnable`,并临时禁用。 3. **检查视口和裁剪矩形**:确保它们覆盖整个渲染目标。 4. **检查顶点变换**:确保顶点着色器输出的位置在NDC范围内。 5. **移除深度模板视图**:尝试不绑定DSV。 6. **使用图形调试工具**:捕获一帧并逐步检查渲染管线各阶段。 7. **验证资源绑定和状态**:确保RTV正确绑定,且资源状态正确。 通过以上步骤,通常可以定位到问题所在。如果问题依旧,请提供更多信息(如相关代码片段或调试工具截图)以便进一步分析。 --- ### 相关问题 1. 如何正确设置视口和裁剪矩形? 2. 在DirectX 12中如何正确使用资源屏障? 3. 如何使用PIX for Windows调试渲染问题? 4. 像素着色器中丢弃像素的常见应用场景有哪些?</think>### 排查禁用混合和深度测试后部分像素未写入RTV的原因 以下是系统化的排查方案,重点针对已禁用混合(Blend)和深度测试(DepthTest)的场景: --- ### 🔍 1. **检查视口与裁剪矩形配置** ```cpp // 验证视口和裁剪矩形是否覆盖整个RTV D3D12_VIEWPORT viewport = { 0.0f, 0.0f, // TopLeftX, TopLeftY static_cast<float>(width), // Width static_cast<float>(height), // Height 0.0f, 1.0f // MinDepth, MaxDepth }; D3D12_RECT scissorRect = { 0, 0, // left, top static_cast<LONG>(width), // right static_cast<LONG>(height) // bottom }; cmdList->RSSetViewports(1, &viewport); cmdList->RSSetScissorRects(1, &scissorRect); ``` - **关键检查**: - 确认视口尺寸与RTV分辨率完全匹配 - 检查光栅化状态中的 `ScissorEnable` 是否被禁用(除非需要裁剪) - 验证裁剪矩形是否覆盖整个渲染区域 - 在像素着色器输出屏幕UV坐标可视化: ```hlsl return float4(frac(screenPos.xy / screenSize), 0, 1); // 显示UV渐变 ``` --- ### ⚙️ 2. **验证资源绑定完整性** ```cpp // 检查描述符堆绑定和根签名 cmdList->SetGraphicsRootDescriptorTable( 0, cbvSrvUavHeap->GetGPUDescriptorHandleForHeapStart() ); ``` - **排查要点**: - 确认PS使用的纹理/缓冲区寄存器(如 `t0`)与根签名声明一致 - 验证描述符堆类型为 `D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV` - 检查资源生命周期(确保纹理/缓冲区在绘制时有效) - 使用PIX检查描述符堆内容: - 对比CPU端设置的描述符与GPU端实际使用的差异 - 确认SRV指向的纹理子资源状态正确[^1] --- ### 📐 3. **几何体绘制参数验证** ```cpp // 检查Draw*调用参数 cmdList->DrawIndexedInstanced( indexCount, // 索引数量 1, // 实例数 startIndex, // 起始索引位置 baseVertex, // 基础顶点偏移 0 // 起始实例 ); ``` - **常见问题**: - `startIndex` 超出索引缓冲区范围 - `baseVertex` 未正确指向顶点缓冲区起始位置 - 多物体绘制时未更新顶点/索引偏移量 - **数据验证**: - 在顶点着色器输出NDC坐标可视化: ```hlsl // 检查坐标是否在[-1,1]范围内 if (any(abs(PosH.xy) > 1)) return float4(1,0,0,1); // 越界显示红色 ``` --- ### 🧪 4. **像素着色器输出诊断** ```hlsl // 添加调试输出检测异常值 float4 PS(VertexOut pin) : SV_Target { // 1. 检查输入值有效性 if (any(isnan(pin.Color)) || any(isinf(pin.Color))) return float4(1,0,0,1); // NaN/INF显示红色 // 2. 简化测试:直接输出固定颜色 // return float4(1,0,0,1); // 统一红色测试 // 3. 检查纹理采样 float3 texColor = gTexture.Sample(gSampler, pin.UV); if (length(texColor) < 0.001f) return float4(0,1,0,1); // 低亮度显示绿色 return texColor; } ``` - **诊断步骤**: 1. 添加NaN/INF检测逻辑 2. 替换为固定颜色输出(排除计算逻辑影响) 3. 检查纹理采样结果是否异常 4. 验证所有代码路径都有返回值 --- ### 🔧 5. **RTV创建与状态验证** ```cpp // 检查RTV创建参数 D3D12_RENDER_TARGET_VIEW_DESC rtvDesc = {}; rtvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; device->CreateRenderTargetView( texture.Get(), &rtvDesc, rtvHeap->GetCPUDescriptorHandleForHeapStart() ); ``` - **关键检查点**: - 确认RTV格式与PS输出格式匹配(如 `DXGI_FORMAT_R8G8B8A8_UNORM`) - 验证绑定的纹理资源: - 具有 `D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET` 标志 - 当前状态为 `D3D12_RESOURCE_STATE_RENDER_TARGET` - 使用资源屏障确保正确状态转换: ```cpp CD3DX12_RESOURCE_BARRIER::Transition( texture.Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET ); ``` --- ### 🖥️ 6. **系统化调试流程** 1. **PIX帧捕获分析**: - 检查目标绘制调用的PS输出 - 查看RTV在绘制调用前后的变化 - 验证输入装配阶段的顶点数据 2. **API验证层启用**: ```cpp ID3D12Debug* debugController; D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)); debugController->EnableDebugLayer(); ``` 3. **最小化测试场景**: - 创建全屏四边形绘制 - 使用最简单的顶点/像素着色器 - 逐步添加复杂逻辑直到问题复现 --- ### 根本原因概率分布 | 原因 | 概率 | 验证方法 | |---------------------|--------|------------------------------| | 视口/裁剪设置错误 | 35% | 输出屏幕UV可视化 | | 资源绑定失效 | 25% | PIX检查描述符堆 | | 几何体参数错误 | 20% | 绘制简化几何体测试 | | RTV状态异常 | 15% | 检查资源屏障和创建标志 | | 着色器逻辑缺陷 | 5% | 替换为固定颜色着色器 | > 通过上述步骤,可定位95%以上的部分像素丢失问题。若仍存在,需检查硬件特性支持(如Conservative Rasterization)或驱动兼容性问题[^1][^3]。 --- ### 相关问题 1. **如何正确配置DirectX 12中的视口和裁剪矩形?** > 需确保视口尺寸匹配RTV分辨率,裁剪矩形覆盖整个区域,并禁用不必要的裁剪[^1]。 2. **PIX如何调试资源绑定问题?** > 在"Resource State"标签页检查描述符堆内容,对比CPU/GPU描述符差异[^1]。 3. **DrawIndexedInstanced参数错误会导致什么现象?** > 可能引发部分几何体缺失、顶点错位或访问越界崩溃,需验证索引偏移量[^3]。 4. **如何检测RTV创建参数是否正确?** > 检查格式兼容性、资源状态标志,并使用D3D12调试层捕获创建错误[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值