私はWebGLバッチレンダラーに取り組んでいます(質問はOpenGLランドでも有効です)。可能な限り少ない drawArrays/drawElements 呼び出し (理想的には 1 回) で描画されるシーン内のすべてのグラフィックスとも呼ばれます。これには、属性に基づいてテクスチャを決定できるようにすることも含まれます。
したがって、私のフラグメント シェーダーでは、次の 2 つのシナリオを検討しています。
1.テクスチャ 0 を画面に描画し、属性を使用して、メモリ内のスプライト シート上でテクスチャが配置される「フレーム」を決定します。フラグメント シェーダーは次のようになります。
precision mediump float;
uniform sampler2D u_spriteSheet;
// Represents position that's framed.
varying vec4 v_texturePosition;
void main() {
gl_FragColor = texture2D(u_spriteSheet, v_texturePosition);
}
2.シェーダーで「if」ステートメントを実行して、使用する均一な sampler2d を決定します。フラグメント シェーダーは次のようになります。
precision mediump float;
uniform sampler2D u_image1;
uniform sampler2D u_image2;
uniform sampler2D u_image3;
uniform sampler2D u_image4;
....
uniform sampler2D u_image32;
varying uint v_imageId;
// Represents texture position that's framed
varying vec4 v_texturePosition;
void main() {
if(v_imageId == 1) {
gl_FragColor = texture2D(u_image1, v_texturePosition);
}
else if (v_imageId == 2) {
gl_FragColor = texture2D(u_image2, v_texturePosition);
}
...
else if (v_imageId == 32) {
gl_FragColor = texture2D(u_image32, v_texturePosition);
}
}
オプション 1 では最大テクスチャ サイズによって制限され、アプローチ 2 では使用可能なテクスチャ レジスタの数によって制限されることを理解しています。議論のために、これらの制限を超えることはないと仮定しましょう。
どちらかにかなりの時間を費やす前に、よりパフォーマンスの高いアプローチを決定しようとしています...すっごく何か考えはありますか?