2016-04-08 5 views
0

IOSでCPU-GPUハイブリッドJPEGエンコーダを構築しようとしています。私のCPUテストでは、GPUを使用してDCTや量子化のステップを実行することが理にかなっていると考えています(アプリケーションのボトルネックである膨大な数のJPEGを圧縮する)。変換フィードバックでは、これをGPGPUコンピューティングで素晴らしい結果を得るために使用したので、これは実行可能でなければなりません。トリッキーな部分は、データ(unsigned int8のRGBA)を効率的に取得する方法です。前述のようにOpenGL ES 3.0で整数/バイトテクスチャデータを「そのまま」取得する

、私はGPGPUコンピューティングを行うためのOpenGL ES 3.0を使用するために使用されるので、私は唯一の

によって

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,WIDTH,HEIGHT,0,GL_RGBA,GL_GLOAT,data); 

とシェーダに配信することにより、設定されている浮動小数点テクスチャ、と経験を持っています

texelFetch() 

しかし、私の入力データは、符号なしバイト(またはuint8)の配列として格納されるため、毎回64個ずつ順次取得する必要があります。私は、符号なしバイトのテクスチャとして、またはより効率的に、符号なし整数のテクスチャとしてフェッチし、ビットシフトでそれらを切り離すことができると思います。

私の質問は、どのように実際にそれらのいずれかを行うのですか?具体的には、glTexImage2D()のinternalFormatを,の形式のタイプに設定する方法はありますか?私はたくさんの組み合わせを試しましたが、それらのすべてがシェーダで0だけを提供します(そして、データソースがゼロではないことを二重チェックしました)。

+0

通常のRGBAでは、すでに1ピクセルあたり4バイトです。 glTexImage2D()は、それぞれのvec4コンポーネントがこのバイトの1つを表すため、バイトごとにフェッチするために使用できます。値は正規化されているため、バイトを表す整数値を得るには255を掛ける必要があります。したがって、glTexImage2D()への16(64/4)コールを行うことによって64バイトを得ることができます。または私はここに何かを逃していますか? –

+0

申し訳ありませんが、glTexImage2D()ではありません。シェーダでテクセルをフェッチすることを意味します。 –

+0

はい、私の計画はBでした。私がこの問題を抱えている問題は、符号なしバイトとして格納されているテクスチャを取得する方法(またはそのためにglTexImage2Dを設定する方法)がわからないことです。可能であればplan-Aに飛び込み、1バイトの代わりに整数(4バイト)を「ピクセル」として取り出し、64/4/4 = 4にフェッチする回数を減らしたいと思います。 –

答えて

0

ES 3では、ピクセルアンパックバッファを作成し、ピクセルデータを定式化する場所を取得するためにマップすることを検討してください。少なくともドライバを保存するには、内部でmemcpyとなり、大幅に同期を減らすために使用することができます。 glBindBufferおよびgl[Un]MapBuffer[Range]GL_PIXEL_UNPACK_BUFFERを参照してください。バインドされたバッファが属性、要素などのソースとして指定されているのと同様に、ピクセルアンパックバッファをソースとして指定するにはglTexImage2D(..., (void *)0);になります。GL_MAP_UNSYNCHRONIZED_BITを使用していると仮定して同期を行う場合はglFenceSyncを参照してください。自分自身を同期させる。

完全整数RGBA(スケーリングなし)の場合は、内部フォーマットとしてGL_RGBA8UIを使用し、フォーマットとしてGL_RGBA_INTEGERをタイプとしてGL_UNSIGNED_BYTEをタイプとして使用します。 usampler2d(符号なし、暗黙的に整数の場合は 'u')を宣言し、標準texture(sampler, coordinate)を使用してサンプリングします。

GL_CLAMP_TO_EDGEGL_NEARESTのテクスチャパラメータも必要です。

EDIT:usampler2dからの値は、uvec4であるため、これらは整数です。 ES 2とは異なり、ES 3はビット単位の演算子を含む真の整数を持っています - ES 2では浮動小数点数でエミュレートすることができます(90年代からのもので、これはまさに予期せぬ未来です)。だから、単純化されたと私の最近のエミュレーションプロジェクトからスニペットを言及する価値があることが十分に些細:

もちろん、にTTL-スタイルRGB-で-1バイトのシングルチャネルテクスチャを開梱され、
vec4 rgb_sample(usampler2D sampler, vec2 coordinate) 
{ 
    uint texValue = texture(sampler, coordinate).r; 
    return vec4(texValue & 4u, texValue & 2u, texValue & 1u, 1.0); 
} 

gl_FragColor(飽和に依存する)に適したフォーマット。

+0

詳細な情報をお寄せいただきありがとうございます。それは私には分かりやすく、試した後にそれがどのように機能するかを更新します。 :) –

関連する問題