我正在尝试向机器学习模型提供大小为 640x640 的 D3D12Resource。但是,我的输入 D3D12Resource 可以是任意大小。如果我有 1024x1024 的输入资源,并且我不想将输入资源调整大小(缩小)到 640x640。如何将此资源平铺到 640x640 D3D12Resources 中,或者如何将 1024x1024 D3D12Resource 的特定区域渲染到 640x640 资源?
我有一个着色器采样器并尝试操作 PORTVIEW 和 SCISSORS RECT:
viewport = CD3DX12_VIEWPORT( static_cast<FLOAT>( 0 ), static_cast<FLOAT>( 0 ), static_cast<float>( 1024 ), static_cast<float>( 1024 ) );
scissorRect = CD3DX12_RECT( static_cast<LONG>( 0 ), static_cast<LONG>( 0 ), static_cast<LONG>( 640 ), static_cast<LONG>( 640 ) );
这将为我提供象限 (0,0, 640, 640 )。但是,如果我将
scissorRect
坐标更改为 (640, 0, 1024, 640),新的渲染资源将无法按照新输出资源的预期渲染新区域。我还尝试更改视口坐标以匹配剪刀,但这也会导致一些渲染偏移。
我不确定我是否正在尝试解决这个问题的正确方法。
ScissorRect 和 Viewport 仅定义输出区域(或
Destination
/Render Target
区域,无论您选择什么名称),它对输入(源)区域没有发言权。
我不知道机器学习或如何使用渲染管道,毕竟渲染管道是为渲染游戏而设计的。
您自己编写了顶点和像素着色器,还是使用了其他人的(第三方库)?您是否有权访问其代码,并且可以控制输入顶点数据吗?
在输出中,
SV_POSITION
(这是一个 float4
值),x 是水平坐标,y 是垂直坐标,z 是深度坐标。
坐标与渲染目标视口相关,X 和 Y 坐标范围从
-1.0
到 +1.0
,这意味着 (0.0, 0.0)
将指示视口的中心。
X 轴和 Y 轴的正方向是向右和向上,这意味着
(-1.0, -1.0)
表示视口的左下角,(+1.0, +1.0)
表示视口的右上角。
ScissorRect 发生在视口之后。在视口顶部,ScissorRect 限制仅渲染定义的 Rect 内的像素。
通常用于从纹理中采样颜色的
float2
坐标(通常称为 UV 坐标),范围从 0.0
到 1.0
。
(0.0, 0.0)
表示纹理的左上角,(1.0, 1.0)
表示纹理的左上角
纹理的右下角。
在您的代码中,我可以看到您将 Viewport 设置为
left=0, top=0, right=1024, bottom=1024
并将 ScissorRect 设置为 left=0, top=0, right=640, bottom=640
并且(如果我理解正确的话)通过这种方式,您将源区域像素精确地 1:1 映射到目标像素,并进行剪裁超出坐标的内容640
.
从这个信息中,我可以推断你必须有如下顶点:
SV_POSITION(视口中的目标坐标) | UV(纹理中的源坐标) | |
---|---|---|
顶点 0 | (左上角) |
(左上角) |
顶点 1 | (右上角) |
(右上角) |
顶点 2 | (左下角) |
(左下角) |
顶点 3 | (右下角) |
(右下角) |
在这种情况下,如果你想从源区域
left=640, top=0, right=1024, bottom=640
渲染到目标区域left=0, top=0, right=384, bottom=640
,最简单的方法是保持顶点和着色器不变,然后像这样调整Viewport和ScissorRects:
视口
left=-640, top=0, right=384, bottom=640
剪刀矩形
left=0, top=0, right=384, bottom=640