【发布时间】:2013-11-28 11:57:01
【问题描述】:
我正在开发一个 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,我受到可用纹理寄存器数量的限制。为了便于讨论,我们假设永远不会超过这些限制。
我正在尝试确定更高效的方法,然后再将大量时间投入到任何一种方法中......所以有什么想法吗?
【问题讨论】:
-
是否可以选择纹理?
-
抱歉不熟悉行话,atased?
-
纹理图集是您所谓的精灵表的更通用术语。