我一直试图找到一个明确的答案,但似乎没有人明确提出这个问题。
我可以在WebGL Chrome,Firefox,Safari,IE等中使用1D采样器和1D纹理吗?
编辑
可以理解的是1确实是2的幂(2 ^ 0 = 1)意味着你可以有效地使用2D采样器和纹理,使用1的高度和256或512等的宽度来复制1D纹理。
1D纹理不是没有实际意义,它们的存在是因为它们不仅有目的,而且旨在转化为GPU本身的优化(而不是2D纹理)。请记住,每个参数都需要时间加载到调用堆栈,几乎所有GPU编程都是优化每个可能操作的技术。
计算着色器经常需要单个浮动列表而没有额外的维度,使用1D纹理和采样器提供强类型提供的相同清晰度。即,在1D结构中表示1D数据,并且在2D结构中表示2D数据。它还删除了索引到行/列转换所需的额外操作。
问题不在于他们是否有充分理由,而是支持他们。
在 WebGL 1.0 基于 OpenGL ES 2.0 作为 09 / MAY / 2014
你为什么需要1D纹理?只需制作N像素宽和1像素高的2D纹理。
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
// 3x1 pixel 1d texture
var oneDTextureTexels = new Uint8Array([
255,0,0,255,
0,255,0,255,
0,0,255,255,
]);
var width = 3;
var height = 1;
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE,
oneDTextureTexels);
无论是通用还是设置过滤都不需要mips
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_W, gl.CLAMP_TO_EDGE);
用它取样 0.5
对于 y
uniform sampler2D u_texture;
varying float v_texcoord;
void main() {
vec4 color = texture2D(u_texture, vec2(v_texcoord, 0.5));
...
这是使用1D纹理的示例。它使用典型照明计算的点积来从1d渐变纹理中查找值以遮蔽对象。
直接回答你的问题。 WebGL中没有1D纹理,因为WebGL基于OpenGL ES 2.0,而OpenGL ES 2.0不支持1D纹理。 OpenGL ES 3.0和3.1都没有。如果他们在合并OpenGL和OpenGL ES时没有完全删除1D纹理,我会感到惊讶
WebGL 1.0基于OpenGL ES 2.0,不支持1D纹理。该 纹理对象 WebGL规范中的部分仅反映了这一点 texImage2D
和 compressedTexImage2D
方法。
您可以使用高度为1的纹理。
正如Jens Nolte所说,WebGL不支持它,因为它基于OpenGL ES。您可以使用单位宽度或高度的2D纹理。
例如(256宽和1高):
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0,
GL_RGBA, GL_UNSIGNED_BYTE, ColorMap.optimalIB);
然后在采样器中,您可以使用任何高度值对纹理进行采样(因为它无关紧要)。