gpt4 book ai didi

c++ - 使用适当的 alpha 复制 ID3D11Texture2D

转载 作者:行者123 更新时间:2023-11-30 02:32:06 25 4
gpt4 key购买 nike

我是 Direct X 的新手,但我已经成功地使用 Windows 桌面复制 API 来捕获视频。 API 还允许您检索鼠标光标信息,包括光标图像的位置、高度、宽度和原始像素数据(在系统内存中)。默认情况下,鼠标光标不会绘制在捕获的屏幕图像上,需要手动处理。

我正在尝试将此鼠标光标数据“复制”到主屏幕捕获图像,以创建具有可见鼠标光标的单个图像。到目前为止,我已经能够通过从光标像素数据创建一个 ID3D11Texture2D 来显示光标,然后执行一个 ID3D11DeviceContext::CopySubresourceRegion 以将光标复制到主屏幕屏幕图像,也存储为 ID3D11Texture2D。主屏幕图像纹理始终采用 DXGI_FORMAT_B8G8R8A8_UNORM 格式,原始光标像素数据 seems to be in the same format ,至少对于 DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR 形状。

我当前的问题似乎与此拷贝的 alpha 处理有关。光标出现,但当矩形被复制时,光标周围的 alpha 被填充为黑色。这是它的外观示例:Black border around mouse

另外,对我来说,这发生在视频内存中很重要,因为最终纹理直接从视频内存进入视频编码器。

如果 CopySubresourceRegion 不是完成这项工作的正确工具,我愿意改变我的方法。关于如何使用适当的 alpha 将此光标放到主屏幕图像纹理上有什么想法吗?

最佳答案

访问 GPU 的 alpha 混合功能的唯一方法是使用绘制命令。如您所见,复制调用仅进行替换。

您已经将鼠标光标置于“ID3D11Texture2D”中,您现在需要的是将其用作纹理的“ID3D11ShaderResourceView”,以及在表面中渲染的“ID3DVertexShader”和“ID3DPixelShader”对。来自目标表面的“ID3D11RenderTargetView”。

一组“ID3D11RasterizerState”、“ID3D11DepthStencilState”和“ID3D11BlendState”,用于配置没有深度测试、alpha 混合和其他含义完整设置的 gpu 状态,其中大多数默认情况下应该没问题。

然后您需要绘制一个四边形来显示您的光标。根据您编写着色器的方式,您将需要一个常量缓冲区、一个顶点缓冲区和一个输入布局,或者同时需要两者。

对于那种 quad blit,我通常更喜欢只处理一个常量缓冲区并从顶点着色器中的 SV_VertexID 重建顶点位置,但这取决于你。

这就是您如何编写 blit 着色器而无需管理顶点缓冲区,具有 strip 基元拓扑的单个 Draw(4,0) 就足够了:

struct IA {
uint vid : SV_VertexID;
};
struct VSPS {
float4 pos : SV_Position;
float2 uv : COLOR;
};
struct Root {
float left;
float top;
float right;
float bottom;
};

ConstantBuffer<Root> root_ : register(b0);
Texture2D<float4> texture_ : register(t0);
SamplerState sampler_ : register(s0);

void mainvs( in IA input, out VSPS output ) {
float x = input.vid < 2 ? 0.f : 1.f;
float y = (input.vid & 1) ? 1.f : 0.f;

output.uv = float2(x, y);

float px = input.vid < 2 ? root_.left : root_.right;
float py = (input.vid & 1) ? root_.bottom : root_.top;;

output.pos = float4(px,py,0.f,1.f);

output.pos.y = 1 - output.pos.y;
output.pos.xy *= 2;
output.pos.xy -= 1;
}

float4 mainps( in VSPS input ) : SV_TARGET {
return texture_.Sample( sampler_, input.uv );
}

关于c++ - 使用适当的 alpha 复制 ID3D11Texture2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36795754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com