2017-04-14 14 views
0

大きな行列/画像に対して簡単な操作を行うためにシェーダを使用しようとしています。私は通常のOpenGLを使っていくつかのコードをフレームバッファオブジェクト内の単一チャネル浮動小数点テクスチャにレンダリングすることで書いていますが、これはうまくいきます。OpenGL ES/Angle:単一チャネルの浮動小数点テクスチャへのレンダリング

私はOpenGL ES 2.0にコードを移植しようとしていますので、別のプラットフォーム(UWP + Angle、Android、...)で動作させる必要があります。通常のRGBA画像でも動作させることができますが、浮動画像では動作しません。

27.0000000 float 
22.7840576 float 
11.4528332 float 
-3.45501971 float 
-17.2838974 float 
-25.7151508 float 
-26.1157665 float 
(...) 
:私はDATA_OUTに期待するもの

format = GL_RED_EXT; 
type = GL_FLOAT; 
internal_format = GL_RED_EXT; 
glTexImage2D(GL_TEXTURE_2D, 0, internal_format, 
    width, 
    height, 
    0, format, type, 
    Data); 
(...) 
glReadPixels(0, 0, width, height, GL_RED_EXT, GL_FLOAT, data_out); 

を:どのような作品

format = GL_RGBA; 
type = GL_UNSIGNED_BYTE; 
internal_format = GL_RGBA; 
glTexImage2D(GL_TEXTURE_2D, 0, internal_format, 
    width, 
    height, 
    0, format, type, 
    Data 

(...) 
glDrawElements(GL_TRIANGLES, (2) * 3, GL_UNSIGNED_SHORT, 0); 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data_out); 

何をして動作しません(出力バッファは 'DATA_OUTは、' レンダリングの結果が含まれています)

入手方法:

-25.7161427 float 
-25.7161427 float 
-25.7161427 float 
-25.7161427 float 
-25.7161427 float 
-17.2863979 float 
-17.2863979 float 
(...) 

私は、以下の議論を除いて、オンラインの多くの同様の問題を見つけることができませんでした:「それは行うことができない」、しかしだからである2012年

に書き戻された結論に思われ、 https://groups.google.com/forum/#!topic/webgl-dev-list/ms21hnWk0tg OpenGL ES 2.0を使って、単一チャンネルのフロートテクスチャにレンダリングする方法は本当にありませんか?それは私のプロジェクトにとって大きな問題になるからです。

更新 - 私はfloatを以下のコメントに記載されているRGBAエンコーディングに/から試しました。

inline float4 EncodeFloatRGBA(float v) { 
float4 enc = float4(1.0, 255.0, 65025.0, 160581375.0) * v; 
enc = frac(enc); 
enc -= enc.yzww * float4(1.0/255.0,1.0/255.0,1.0/255.0,0.0); 
return enc; 
} 
inline float DecodeFloatRGBA(float4 rgba) { 
return dot(rgba, float4(1.0, 1/255.0, 1/65025.0, 1/160581375.0)); 
} 
void main() 
{ 
float raw_value = DecodeFloatRGBA(texture2D(myTextureSampler, UV)); 
gl_FragColor = EncodeFloatRGBA(raw_value); 
} 

I 4のうちわずか3バイトを取得し、任意の値(5.23)を充填したテクスチャーを押すとglReadPixels有するディスプレイを取り出す、アルファが0

入力値に貼り付けている(バイトあたりのバイト)浮動小数点フォーマットSUについて

[0] 41 ')' unsigned char 
[1] 92 '\\' unsigned char 
[2] 167 '§' unsigned char 
[3] 64 '@' unsigned char 

出力値(バイトあたりのバイト)

[0] 41 ')' unsigned char 
[1] 92 '\\' unsigned char 
[2] 167 '§' unsigned char 
[3] 0 '\0' unsigned char 

答えて

0

https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt

それは8888または4444レンダーターゲットの複数のチャネル間で浮動小数点数をエンコードする珍しいアプローチはありません:あなたは拡張子を必要とするフォーマットをレンダリングhttps://www.khronos.org/registry/OpenGL/extensions/OES/OES_texture_float.txt

単一チャネルの場合:あなたは拡張子が必要PPORT。ここに例といくつかのリンクがあります:http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/

+0

ありがとうございました。私は次のコマンドで拡張子をチェックしました:const 'GLubyte * msg = glGetString(GL_EXTENSIONS);'、そしてリストにGL_OES_texture_floatとGL_EXT_texture_rgがあります。私がそれを理解する方法では、私はそのようなテクスチャを扱うことができますが、レンダリングしません。浮動体をRGBA形式にエンコード/デコードする方法を調べますが、パフォーマンスに影響すると思います。 – Alx

+0

あなたは正しいです。 https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_half_float.txtにはGLES 2用の半浮動小数点が追加されていますが、https://www.khronos.org/以外の浮動小数点はありませんGLES 3が必要なレジストリ/ OpenGL/extensions/EXT/EXT_color_buffer_float.txt。 – Columbo

+0

私は単純なパススルーテストで上記のエンコード/デコード機能(http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/)を実装しましたアルファチャネルがゼロに設定されているため、結果はソースとは異なります。さらに見て、私はこれを見つけました。http://stackoverflow.com/questions/6893302/decode-rgb-value-to-single-float-without-bit-shift-in-glslアルファも(このように)highp浮動小数点は24ビット長であり、通常は32通りではないからです。だから、コードの最初のバージョンは動作するはずがありません? – Alx

関連する問題