2016-10-19 3 views
1

浮動小数点テクスチャについて多くの人が議論していないようです。私はそれらを使っていくつかの計算を行い、結果を別のサーフェスシェーダに転送します(特定の変形を得るために)。それはクールです。シェーダで結果をダイジェストすると、私は常にうまくいきます。私は浮動小数点テクスチャを塗りつぶしたGraphics.Blitを呼び出した直後に結果をfloat []配列にします。これはどのように達成できますか?ユニティ3DのRGBAFloatテクスチャからフロート値を読み取る

私はこれまでこの方法を使って見た唯一の男は、彼のKvant WallのようなKeijiroです。もしあなたが他の情報源を持っていれば、私に知らせてくれたら大変感謝しています。

ちなみに、私は計算シェーダとOpenCLとCUDAがあることを知っています。これは今私が必要とする方法です。

+0

Texture2D.ReadPixelsでは必要な機能が提供されていません。 – Bart

+0

Hey @Bart ReadPixelsを使用してRenderTextureの結果をtexture2D(まだFloatARGB形式)にしていますが、それでは何ですか? GetPixelsを使用することはできません。色の配列を返し、値が途切れることになります。私は今、GetRawTextureDataを見ています。私はどこかでそれを得るでしょう。 – SteakOverflow

+0

ええと、私は一見する必要がありますが、GetPixels(Color32の代わりに)完全精度の浮動小数点結果を取得していませんか? – Bart

答えて

0

私はこの解決策を考え出しました。私たちが必要なのフロートでない場合は別の方法として、GetRawTextureDataは、あなたが(のためのシェーダから渡されたデータにいくつかの柔軟性を提供しますSystem.BitConverterを持つ新しいタイプのバイトを変換するために使用することができます

float[] DecodeFloatTexture() 
{ 
    Texture2D decTex = new Texture2D(resultBuffer.width, resultBuffer.height, TextureFormat.RGBAFloat, false); 
    RenderTexture.active = resultBuffer; 
    decTex.ReadPixels(new Rect(0, 0, resultBuffer.width, resultBuffer.height), 0, 0); 
    decTex.Apply(); 
    RenderTexture.active = null; 
    Color[] colors = decTex.GetPixels(); 
    // HERE YOU CAN GET ALL 4 FLOATS OUT OR JUST THOSE YOU NEED. 
    // IN MY CASE ALL 4 VALUES HAVE A MEANING SO I'M GETTING THEM ALL. 
    float[] results = new float[colors.Length*4]; 
    for(int i=0; i<colors.Length; i++) 
    { 
     results[i * 4] = colors[i].r; 
     results[i * 4 + 1] = colors[i].g; 
     results[i * 4 + 2] = colors[i].b; 
     results[i * 4 + 3] = colors[i].a; 
    } 
    return results; 
} 

あなたのフラグメントシェーダーが半分を出力しているかどうか4)。 floatが必要な場合は、最初の方法が優れています。

float[] DecodeFloatTexture() 
{ 
    Texture2D decTex = new Texture2D(resultBuffer.width, resultBuffer.height, TextureFormat.RGBAFloat, false); 
    RenderTexture.active = resultBuffer; 
    decTex.ReadPixels(new Rect(0, 0, resultBuffer.width, resultBuffer.height), 0, 0); 
    decTex.Apply(); 
    RenderTexture.active = null; 
    byte[] bytes = decTex.GetRawTextureData(); 
    float[] results = new float[resultBuffer.width * resultBuffer.height]; 
    for (int i = 0; i < results.Length; i++) 
    { 
     int byteIndex = i * 4; 
     byte[] localBytes = new byte[] { bytes[i], bytes[i + 1], bytes[i + 2], bytes[i + 3] }; // converts 4 bytes to a float 
     results[i] = System.BitConverter.ToSingle(localBytes, 0); 
    } 
    return results; 
} 
関連する問題