如何从另一个较大的 D3D12Resource 的特定区域创建较小的 D3D12Resource

问题描述 投票:0回答:1

我正在尝试向机器学习模型提供大小为 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),新的渲染资源将无法按照新输出资源的预期渲染新区域。我还尝试更改视口坐标以匹配剪刀,但这也会导致一些渲染偏移。

我不确定我是否正在尝试解决这个问题的正确方法。

gpu directx directx-12
1个回答
0
投票

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
(X=-1.0, Y=1.0,  ...)
(左上角)
(U=0, V=0)
(左上角)
顶点 1
(X=1.0,  Y=1.0,  ...)
(右上角)
(U=1, V=0)
(右上角)
顶点 2
(X=-1.0, Y=-1.0, ...)
(左下角)
(U=0, V=1)
(左下角)
顶点 3
(X=1.0,  Y=-1.0, ...)
(右下角)
(U=1, V=1)
(右下角)

在这种情况下,如果你想从源区域

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

© www.soinside.com 2019 - 2024. All rights reserved.