我一直试图找到一个明确的答案,但似乎没有人明确提出这个问题。
我可以在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
答案 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部分仅通过texImage2D
和compressedTexImage2D
方法来反映这一点。
您可以使用高度为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);
然后在采样器中,您可以使用任何高度值对纹理进行采样(因为它无关紧要)。