質問

こんにちは、あいまいなタイトルのために申し訳ありません:} 私ができる最善を説明しようとI`llます。

まず、私は、HLSLに新しいですが、私は妖精の世界からですパイプラインやものについて理解しています。何i`mがやろうとすると、一般的な計算のためのGPU(GPGPU)を使用している。

私が知っている `tをどのようなものです:どのように私は戻って私のXNAアプリケーションに(頂点シェーダを使用して形質転換されている)の頂点*読むことができますか?私は、GPUのテクスチャメモリを使用してについて何かを読んで、私は何かを見つけることができません固体...

すべての情報/先端を事前に感謝! : - )

*ラスタライザとピクセルシェーダ(もしあれば)の可能性bacauseが、私は意味し、最終的にそれはすべての画素についてですかどうかわからない、右?

役に立ちましたか?

解決

私は、これは一般的に可能ではありません知っている限ります。

正確に何をしようとしていますか?別のソリューションは、おそらくあります。

EDIT ::アカウントにコメントを取ります。やりたいことがある場合は、GPU上での一般的なベクトル計算が頂点シェーダではなく、ピクセルシェーダでそれらをやってみます。

例えばので、最初私たちはテクスチャにデータを書き込む必要がある、あなたはクロス二つのベクトルをしたいと言う。

//Data must be in the 0-1 range before writing into the texture, so you'll need to scale everything appropriately
Vector4 a = new Vector4(1, 0, 1, 1);
Vector4 b = new Vector4(0, 1, 0, 0);

Texture2D dataTexture = new Texture2D(device, 2, 1);
dataTexture.SetData<Vector4>(new Vector4[] { a, b });

だから今、私たちは内のデータと2 * 1テクスチャを持って、spritebatchと効果を使用して、単純にテクスチャをレンダリングします:

Effect gpgpu;
gpgpu.Begin();
gpgpu.CurrentTechnique = gpgpu.Techniques["DotProduct"];
gpgpu.CurrentTechnique.Begin();
spriteBatch.Begin();
gpgpu.CurrentTechnique.Passes[0].Begin();
spriteBatch.Draw(dataTexture, new Rectangle(0,0,2,1), Color.White);
spriteBatch.end();
gpgpu.CurrentTechnique.Passes[0].End();
gpgpu.CurrentTechnique.End();

私たちが今必要なのは、私が上に示してきたGPGPUの効果です。すなわち、このような何かを探して、ちょうど標準の後処理シェーダです。

sampler2D DataSampler = sampler_state
{
    MinFilter = Point;
    MagFilter = Point;
    MipFilter = Point;
    AddressU = Clamp;
    AddressV = Clamp;
};

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
    float4 A = tex2D(s, texCoord);
    float4 B = tex2D(s, texCoord + float2(0.5, 0); //0.5 is the size of 1 pixel, 1 / textureWidth
    float d = dot(a, b)
    return float4(d, 0, 0, 0);
}

technique DotProduct
{
    pass Pass1
    {
        PixelShader = compile ps_3_0 PixelShaderFunction();
    }
}

これは最初の画素にAとBの内積を書き込み、第2の画素へのB及びBのドット積であろう。そして、あなたは(役に立たないものを無視して)これらの答えを読み取ることができます。

Vector4[] v = new Vector4[2];
dataTexture.GetData(v);
float dotOfAandB = v[0];
float dotOfBandB = v[1];

多田! 大規模にこれをやろうとしていると、ほとんどの問題の全体の負荷がありますが、ここでコメントし、私はあなたがに実行するすべてのお手伝いをしようとするでしょう。

他のヒント

あなたは「ストリーム出力をオンにした場合ステージには、」あなたの頂点シェーダの出力は、メモリバッファに格納されます。以降、これらの値は、必要に応じてGPU又はCPUから読み出すことができる。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top