WebGL中是否支持一维纹理?

Adr*_*ley 11 shader glsl webgl fragment-shader glsles

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

我可以在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纹理或采样器支持.

gma*_*man 10

你为什么需要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);
Run Code Online (Sandbox Code Playgroud)

无论是通用还是设置过滤都不需要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);
Run Code Online (Sandbox Code Playgroud)

0.5for进行取样y

uniform sampler2D u_texture;
varying float v_texcoord;

void main() {
  vec4 color = texture2D(u_texture, vec2(v_texcoord, 0.5));
  ...
Run Code Online (Sandbox Code Playgroud)

这是使用1D纹理的示例.它使用典型照明计算的点积来从1d渐变纹理中查找值以遮蔽对象.

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


Jen*_*lte 5

WebGL 1.0基于OpenGL ES 2.0,不支持1D纹理.WebGL规范中的" 纹理对象"部分仅通过使用texImage2DcompressedTexImage2D方法来反映这一点.

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