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(...);
は、誰かがこれを実装する方法の例を共有していただけますか?私は関連情報をオンラインで見つけるのに苦労しています。
ハイソリッドピクセル、私の答えの検索で、互換性の問題は一切考えていませんでしたが、それを指摘してくれてありがとうございます。あなたはそれが可能だと言いましたので、私はそれを使用しないことを選択したとしても、これがどのように実装されるかを見たいと思います。 私は非常に単純な例だけを扱っているので、記録のために、GPUにアップロードする前にモデルの位置を各頂点にベイクすることにしました。私は、私がまだ遭遇していなかったボトルネックを最適化しようと試みることによって、複雑なことを実現しました。愚か。 – EddieH