Domanda

Ciao e scusate per il titolo oscura:} I `ll cercare di spiegare il meglio che posso.

Prima di tutto, Sono nuovo di HLSL ma capisco la pipeline e cose che provengono dal mondo delle fate. Che `m cercando di fare è utilizzare la GPU per calcoli generali (GPGPU).

Quello che don`t so è: come posso leggere * i vertici (che sono state trasformate usando vertex shader) torna alla mia domanda XNA? Ho letto qualcosa sull'uso della memoria texture della GPU, ma non riesco a trovare qualcosa di solido ...

Grazie in anticipo per qualsiasi info / suggerimento! : -)

* non è sicuro se possibile bacause del rasterizer e il pixel shader (se presente), voglio dire, alla fine è tutta una questione pixel, giusto?

È stato utile?

Soluzione

Per quanto ne so questo non è generalmente possibile.

Che cosa stai cercando di fare? C'è probabilmente un'altra soluzione

EDIT :: Tenendo conto del commento. Se tutto quello che vogliamo fare è calcoli vettoriali generali sul GPU cercano di fare loro nel pixel shader, piuttosto che il vertex shader.

Così, per esempio, diciamo che si vuole fare trasversali due vettori, in primo luogo abbiamo bisogno di scrivere i dati in una texture

//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 });

Così ora abbiamo una texture 2 * 1 con i dati, rendono la texture semplicemente utilizzando SpriteBatch e un effetto:

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();

Tutti abbiamo bisogno ora è l'effetto GPGPU ho mostrato sopra. Questo è solo uno shader post-elaborazione di serie, cercando qualcosa di simile:

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();
    }
}

Questo scriverà il prodotto scalare di A e B nel primo pixel, e il prodotto scalare di B e B nel secondo pixel. Poi si può leggere queste risposte indietro (ignorando quelle inutili)

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

Tada! Ci sono un intero carico di piccoli problemi con il tentativo di fare questo su una scala più ampia, commentare qui e cercherò di aiutarvi con qualsiasi si esegue in:)

Altri suggerimenti

Se si accende il " uscita flusso fase ", le uscite del vertex sarà memorizzata in un buffer di memoria. Successivamente questi valori possono essere letti dalla GPU o CPU come desiderato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top