我正在开发一个 WebGL 批处理渲染器(问题在 OpenGL 领域仍然有效)。也就是在尽可能少的 drawArrays/drawElements 调用(理想情况下为 1)中绘制的场景中的所有图形。其中一部分涉及允许基于属性确定纹理。
因此,在我的片段着色器中,我正在考虑两种情况:
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,我受到可用纹理寄存器数量的限制。为了讨论,我们假设这些限制永远不会被通过。
在将大量时间投入其中之一之前,我正在尝试确定更高效的方法......所以有什么想法吗?