2016-04-22 11 views
1

私はDirect Xが初めてですが、Windowsデスクトップ複製APIを使用してビデオをキャプチャすることに成功しました。 APIを使用すると、カーソル画像の位置、高さ、幅、および生のピクセルデータ(システムメモリ内)を含むマウスカーソル情報を取得することもできます。マウスカーソルは、キャプチャされたスクリーンイメージ上にデフォルトで描画されないため、手動で処理する必要があります。ID3D11Texture2Dを適切なアルファベットでコピーする

私はこのマウスカーソルデータをメインスクリーンキャプチャ画像に「コピー」して、表示可能なマウスカーソルで単一の画像を作成しようとしています。これまでは、カーソルピクセルデータからID3D11Texture2Dを作成し、ID3D11DeviceContext::CopySubresourceRegionを実行してカーソルをメイン画面にコピーし、ID3D11Texture2Dとして保存して、カーソルを表示させることができました。メイン画面の画像テクスチャは常にDXGI_FORMAT_B8G8R8A8_UNORM形式であり、生カーソルピクセルデータseems to be in the same format(少なくともDXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLORシェイプの場合)です。

私の現在の問題はこのコピーのアルファ処理に関連しているようです。カーソルが表示されますが、四角形がコピーされると、カーソルを囲むアルファが黒で塗りつぶされます。次のような例があります:Black border around mouse また、最終的なテクスチャがビデオメモリからビデオエンコーダにまっすぐ進むので、これはビデオメモリで発生することが重要です。

CopySubresourceRegionが仕事に適したツールでない場合は、私の方法を変更したいと思います。どのように私は適切なアルファとメイン画面のイメージテクスチャにこのカーソルを取得することができます上の任意のアイデア?

答えて

3

GPUのアルファブレンディング機能にアクセスする唯一の方法は、描画コマンドです。あなたが見るように、コピーコールは交換を行います。

あなたはすでに 'ID3D11Texture2D'にマウスカーソルを持っていますが、これはテクスチャとして使用する 'ID3D11ShaderResourceView'、サーフェスでレンダリングする 'ID3DVertexShader'と 'ID3DPixelShader'のペアです。目的地のサーフェスからの「ID3D11RenderTargetView」。

デプステスト、アルファブレンド、およびその他の意味のフル設定でgpuの状態を設定するには、 'ID3D11RasterizerState'、 'ID3D11DepthStencilState'、 'ID3D11BlendState'のセットが必要です。

次に、カーソルを表示するためにすべてを使ってクワッドを描く必要があります。シェーダーの書き方によっては、定数バッファ、頂点バッファ、入力レイアウトのいずれか、あるいはその両方が必要になります。

この種のクワッドblitでは、通常、単一の定数バッファを扱い、頂点シェーダ内のSV_VertexIDから頂点位置を再構築する方が好きですが、それはあなた次第です。

これは原始的なトポロジは十分にあるストリップでシングルドロー(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); 
} 
+1

が、述べ価値明示的に 'CopySubresourceRegion'はアルファブレンディングを行いません。代わりに、単純な長方形のコピーを行い、宛先(アルファを含む)のすべてのチャンネルを上書きします。黒に見える理由は、ソーステクスチャがカーソル領域の外にある{0,0,0,0}である可能性が高いか、または透明な黒であるためです。表示すると、アルファチャンネルは表示のために無視され、不透明な黒色になります。 – MooseBoys

+0

ありがとう、私はこれに着手しています。成功した実装の後、私は受け入れのために戻ってきます。 – chrisd1100

関連する問題