16ビットの頂点/テクスチャ座標を使用することを推奨するソースが多数ありますが、これまで見た例のコードはすべて32ビット浮動小数点型です。16ビットの頂点/テクスチャ座標を使用したコード例
16ビットの頂点座標についてはextensionを読んだことがありますが、その使用方法の例は提供していません。
16ビットの頂点/テクスチャ座標を使用することを推奨するソースが多数ありますが、これまで見た例のコードはすべて32ビット浮動小数点型です。16ビットの頂点/テクスチャ座標を使用したコード例
16ビットの頂点座標についてはextensionを読んだことがありますが、その使用方法の例は提供していません。
16ビットの頂点/テクスチャ座標は、拡張の必要なしに、最初からOpenGL(およびES)に入っています。符号付き16ビットの数値であるGL_SHORT
タイプの座標を指定できます。 glVertexAttribPointer
で指定した値をnormalized=true
に渡すと、正規化された値([-1..1])を指定できます。それに応じて、頂点シェーダ内で(正規化されているかどうかにかかわらず)それらをスケーリングすることができます。
詳細については、thisを参照してください。
これは、正規化がネイティブにハードウェアで処理されない場合、ドライバーは場合によってはより多くの作業を行う必要があるため、正しい形式で直接アップロードすることができれば、高速(最高)または少なくとも同じスピードだが、より効率的なパワー(最悪の場合)。 GPUが絶対に必要とするよりも、フレームあたりの作業量を増やさないでください。 – solidpixel
...これも一般的な解決策ではないことに注意してください。オブジェクト空間座標が+1と-1の間にある場合にのみ機能します。 – solidpixel
@solidpixelこれは一般的な解決策です。座標空間をオブジェクト空間に拡大するために、追加のスケーリング行列を追加するだけです(私が答えたところで)。実際、それはOpenGL wiki(https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices)によって提案されたものです。 – MuertoExcobito
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にフォーマット コンポーネントタイプを設定することにより、属性としてそれらを使用することができます。
注:OpenGLタグはデスクトップOpenGLにのみ使用するようにしてください。あなたが提供した拡張機能はOpenGLのためのものだと思われるので、あなたはopenglタグを削除することを検討するべきです。たとえば、答えはOpenGL-esに対して部分的にしか有効でない情報を引用しています(さらに、 'GL_HALF_FLOAT'はes 3.0以降に存在するバージョンとの違いになります)。 – BDL
座標データの場合、fp16は実際には通常は十分に高い精度ではないので、画面サイズが大きいほど大きなテクスチャサイズのデバイスでアーチファクトを取得し始めます。座標(頂点とテクスチャの両方)にはfp32データを使用し、位置以外の属性(法線、色データなど)にはfp16を使用します。 – solidpixel