2016-11-09 3 views
0

this answerによれば、OpenGLでは、頂点シェーダでアクセスできるテクスチャバッファ内に任意のデータを格納することができます。OpenGL ES2、GLSL、C++を使用してモデル行列データをテクスチャにバッファリングするにはどうすればよいですか?

サイズが4096 * 256 * 4のモデルを作成しました。このモデルには、すべてのモデルのワールドマトリックスが含まれています(〜256kモデルでは十分です)。各モデルには、テクスチャからその行列を読み込むために使用されるmodelIndex属性があります。次に、各フレームで、gl.texSubImage2D全体のテクスチャを描画し、各描画呼び出しでできるだけ多く描画します。

シナリオ例:
私は、共通のシェーダを共有するユニークなモデルの束を持って、その頂点位置は、単一のVBOに詰めます。私はテクスチャバッファからフェッチされた一意のモデル行列で各モデルを更新し、これらを単一のglDrawElements()呼び出しで描画したいと思います。

いくつかの非常に大まかな擬似コード:

// In C++ 
struct Vertex { 
    GLFloat x, y; 
    GLuint matrixID; 
} 

// Create an array of floats that represent a unique model matrix 
// Assume pre-calculation of values 
GLfloat data[32] { /* 32 floats, two 4x4 matrices */ } 
glTexImage2D(..., data); 

// Then in the vertex shader 
attribute vec4 in_Position; // x, y, 1.0, matrixID; 
uniform mat4 uf_Projection; 
void main() { 
    // I need help implementing this magical function... 
    mat4 model = getMatrixFromTextureBuffer(in_Position.w); 

    // Apply unique model matrix 
    gl_Position = uf_Projection * model * vec4(in_Position.xy, 1.0, 1.0); 
} 

// Draw everything! 
glDrawElements(...); 

は、誰かがこれを実装する方法の例を共有していただけますか?私は関連情報をオンラインで見つけるのに苦労しています。

答えて

1

OpenGLはあなたが が頂点シェーダでアクセスすることができることをテクスチャバッファ内の任意のデータを格納することを可能にします。

それは2.0のみのGPUがそれをサポートしていないのOpenGL ES 2.0のいくつかの実装では可能だが、それは仕様で必須ではありません(最大頂点テクスチャユニットが0であることを許可されている)、そして非常に多くのOpenGL ES 。

同様に、OpenGL ES 2.0は浮動小数点テクスチャリング(拡張子を除く)をサポートしていないため、動作することは保証されていません。

最後に、たとえ動作させることができたとしても、すべての頂点のテクスチャから16要素のFP32マトリックスを読み込むのは非常に遅いため、デスクトップ用のおもしろいプロジェクトでなければGPU ...(つまり、ターゲットがOpenGL ES 2.xを使用して商用モバイルコンテンツを出荷している場合、これはおそらく良い考えではありません)。

+0

ハイソリッドピクセル、私の答えの検索で、互換性の問題は一切考えていませんでしたが、それを指摘してくれてありがとうございます。あなたはそれが可能だと言いましたので、私はそれを使用しないことを選択したとしても、これがどのように実装されるかを見たいと思います。 私は非常に単純な例だけを扱っているので、記録のために、GPUにアップロードする前にモデルの位置を各頂点にベイクすることにしました。私は、私がまだ遭遇していなかったボトルネックを最適化しようと試みることによって、複雑なことを実現しました。愚か。 – EddieH

関連する問題