WebGL中是否支持一维纹理?

时间:2014-05-08 11:00:09

标签: glsl webgl shader fragment-shader glsles

我一直试图找到一个明确的答案,但似乎没有人明确提出这个问题。

我可以在WebGL Chrome,Firefox,Safari,IE等中使用1D采样器和1D纹理吗?

修改

可以理解,1确实是2的幂(2 ^ 0 = 1),这意味着您可以有效地使用2D采样器和纹理,使用高度为1,宽度为256或512等来复制一维纹理。

1D纹理没有实际意义,它们的存在是因为它们不仅有目的,而且旨在转化为GPU本身的优化(而不是2D纹理)。请记住,每个参数都需要时间加载到调用堆栈,几乎所有GPU编程都是优化每个可能操作的技术。

计算着色器经常需要单个浮动列表而没有额外的维度,使用1D纹理和采样器提供相同的清晰度强类型提供。即,在1D结构中表示1D数据,并且在2D结构中表示2D数据。它还删除了索引到行/列转换所需的额外操作。

如果有充分的理由,这些问题并非如此,而是支持它们。

基于 OpenGL ES 2.0 WebGL 1.0 ,自 09 / MAY / 2014

  • 目前没有1D纹理或采样器支持。

3 个答案:

答案 0 :(得分:8)

为什么需要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));
  ...

Here's a sample using 1D textures。它使用典型光照计算的点积来从1d斜坡纹理中查找值以遮蔽对象。

直接回答你的问题。 WebGL中没有1D纹理,因为WebGL基于OpenGL ES 2.0,而OpenGL ES 2.0不支持1D纹理。 OpenGL ES 3.0和3.1都没有。如果他们在合并OpenGL和OpenGL ES时没有完全删除1D纹理,我会感到惊讶

答案 1 :(得分:5)

WebGL 1.0基于OpenGL ES 2.0,不支持1D纹理。 WebGL规范中的Texture Objects部分仅通过texImage2DcompressedTexImage2D方法来反映这一点。

您可以使用高度为1的纹理。

答案 2 :(得分:0)

正如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);

然后在采样器中,您可以使用任何高度值对纹理进行采样(因为它无关紧要)。