使用适当的 alpha 复制 ID3D11Texture2D
Copying ID3D11Texture2D with proper alpha
我是Direct X的新手,但我已经成功地使用Windows桌面复制API来捕获视频。该 API 还允许您检索鼠标光标信息,包括光标图像的位置、高度、宽度和原始像素数据(在系统内存中)。默认情况下,鼠标光标不会绘制在捕获的屏幕图像上,需要手动处理。
我正在尝试将此鼠标光标数据"复制"到主屏幕捕获图像,以创建具有可见鼠标光标的单个图像。到目前为止,我已经能够通过从光标像素数据创建ID3D11Texture2D
来使光标显示,然后形成一个ID3D11DeviceContext::CopySubresourceRegion
将光标复制到主屏幕图像,也存储为ID3D11Texture2D
。主屏幕图像纹理始终采用DXGI_FORMAT_B8G8R8A8_UNORM
格式,原始光标像素数据似乎采用相同的格式,至少对于DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR
形状而言。
我目前的问题似乎与此副本的 alpha 处理有关。光标将显示,但是当复制矩形时,光标周围的 alpha 将改为用黑色填充。下面是它的外观示例:鼠标周围的黑色边框
此外,对我来说重要的是,这发生在视频内存中,因为最终纹理直接从视频内存进入视频编码器。
如果CopySubresourceRegion
不是适合这项工作的工具,我愿意改变我的方法。关于如何以适当的 alpha 将此光标放在主屏幕图像纹理上的任何想法?
访问 GPU 的 alpha 混合功能的唯一方法是使用绘制命令。如您所见,复制呼叫仅执行替换。
您已经将鼠标光标置于"ID3D11Texture2D"中,您现在需要的是"ID3D11ShaderResourceView"以将其用作纹理,"ID3DVertexShader"和"ID3DPixelShader"对以在表面上渲染。来自目标图面的"ID3D11RenderTargetView"。
一组"ID3D11RasterizerState","ID3D11DepthStencilState"和"ID3D11BlendState"来配置GPU状态,而无需深度测试,alpha混合和其他含义的完整设置,其中大多数默认为您应该没问题。
然后,您需要绘制一个包含所有这些的四边形以显示光标。根据您编写着色器的方式,您将需要一个常量缓冲区、一个顶点缓冲区和一个输入布局,或者同时需要两者。
对于这种四边形,我通常更喜欢只处理单个常量缓冲区,并从顶点着色器内部的SV_VertexID重建顶点位置,但这取决于您。
这就是在没有顶点缓冲区的情况下编写 blit 着色器的方式,具有条带基元拓扑的单个 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++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 使用适当的 alpha 复制 ID3D11Texture2D
- 使用 Alpha 通道复制SDL_Surfaces