2017-01-10 18 views
0

16ビットの頂点/テクスチャ座標を使用することを推奨するソースが多数ありますが、これまで見た例のコードはすべて32ビット浮動小数点型です。16ビットの頂点/テクスチャ座標を使用したコード例

16ビットの頂点座標についてはextensionを読んだことがありますが、その使用方法の例は提供していません。

+1

注:OpenGLタグはデスクトップOpenGLにのみ使用するようにしてください。あなたが提供した拡張機能はOpenGLのためのものだと思われるので、あなたはopenglタグを削除することを検討するべきです。たとえば、答えはOpenGL-esに対して部分的にしか有効でない情報を引用しています(さらに、 'GL_HALF_FLOAT'はes 3.0以降に存在するバージョンとの違いになります)。 – BDL

+0

座標データの場合、fp16は実際には通常は十分に高い精度ではないので、画面サイズが大きいほど大きなテクスチャサイズのデバイスでアーチファクトを取得し始めます。座標(頂点とテクスチャの両方)にはfp32データを使用し、位置以外の属性(法線、色データなど)にはfp16を使用します。 – solidpixel

答えて

2

16ビットの頂点/テクスチャ座標は、拡張の必要なしに、最初からOpenGL(およびES)に入っています。符号付き16ビットの数値であるGL_SHORTタイプの座標を指定できます。 glVertexAttribPointerで指定した値をnormalized=trueに渡すと、正規化された値([-1..1])を指定できます。それに応じて、頂点シェーダ内で(正規化されているかどうかにかかわらず)それらをスケーリングすることができます。

詳細については、thisを参照してください。

+0

これは、正規化がネイティブにハードウェアで処理されない場合、ドライバーは場合によってはより多くの作業を行う必要があるため、正しい形式で直接アップロードすることができれば、高速(最高)または少なくとも同じスピードだが、より効率的なパワー(最悪の場合)。 GPUが絶対に必要とするよりも、フレームあたりの作業量を増やさないでください。 – solidpixel

+0

...これも一般的な解決策ではないことに注意してください。オブジェクト空間座標が+1と-1の間にある場合にのみ機能します。 – solidpixel

+0

@solidpixelこれは一般的な解決策です。座標空間をオブジェクト空間に拡大するために、追加のスケーリング行列を追加するだけです(私が答えたところで)。実際、それはOpenGL wiki(https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices)によって提案されたものです。 – MuertoExcobito

0

GLM Library GLMライブラリは、ハーフフロートタイプをサポートしています。使用される接頭辞は 'h'なので、glm::vec3は浮動小数点値の3要素ベクトル、glm::hvec3はハーフ・フロートの3要素ベクトルです。

そして、あなたはまた、彼らは半分が

32ビットの浮動小数点数は、しばしば "と呼ばれている浮かぶ

言うglVertexAttribPointer(..., ..., GL_HALF_FLOAT, GL_FALSE, ..., ...);

このスレッドを参照してください16-bit floats and GL_HALF_FLOAT

Small float formatsようなものが必要単精度浮動小数点型 および64ビットflo atsはしばしば「倍精度」浮動小数点と呼ばれます。したがって、16ビットの 浮動小数点数は「半精度」浮動小数点数と呼ばれ、または「半分 浮動小数点」と呼ばれます。

OpenGLはイメージ・フォーマットで半分のフロートの使用をサポートしていますが、それはまた 頂点がGL_HALF_FLOATにフォーマット コンポーネントタイプを設定することにより、属性としてそれらを使用することができます。

関連する問題