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
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纹理,我会感到惊讶