如何使用 texelFetch 在着色器上不带过滤的 1D 纹理



我想将一堆浮点传递给片段着色器,并按索引访问它们。

基本上这个答案中提到的 1D 纹理方法:将值列表传递给片段着色器

我试试这个:

javascript code

gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
const data = new Uint8Array([
255, 64, 192,
0, 192, 0
]);
let texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D,
0,
gl.R8,
3,
2,
0,
gl.RED,
gl.UNSIGNED_BYTE,
data);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);

我在碎片着色器中访问这套制服:

uniform sampler2D u_texture;
void main() {    
vec2 trans = texelFetch(u_texture, ivec2(0, 0), 0);
}

我使用glTexImage2D因为我看到了一个例子, 这部分有效,但有两个问题:

我想摆脱所有过滤选项gl.texParameteri因为我不需要它们。但是如果我删除这些,我就得不到数据。

texelFetch方法返回 [1, 0] 范围内的值(例如:1 表示 255(。为什么会这样?

基本上我需要上述方法的示例。

我想

摆脱所有的过滤选项gl.texParameteri,因为我不需要它们。但是如果我删除这些,我就得不到数据。

纹理参数存储在纹理对象中。参数TEXTURE_MIN_FILTER的初始值为NEAREST_MIPMAP_LINEAR,对于TEXTURE_MAG_FILTER,它分别LINEAR,对于TEXTURE_WRAP_STEXTURE_WRAP_T它是REPEAT
如果需要不同的参数值,则必须显式设置它们(针对每个纹理对象(。没有办法。

在您的情况下,问题是参数TEXTURE_MIN_FILTER的初始值(如上所述,它是NEAREST_MIPMAP_LINEAR(。
如果缩小滤镜需要 mipmap(不是NEAREST也不是LINEAR(,但纹理没有 mipmap,那么纹理就不是"mipmap complete"。
请注意,如果纹理不完整,则纹素提取的结果为 (0, 0, 0, 1(。请参阅 WebGL 2.0 - 5.12 Texel 获取。


此 texelFetch 方法返回 [1, 0] 范围内的值(例如:1 表示 255(。为什么会这样?

这是由用于指定像素数据的像素格式引起的 (gl.texImage2D(。

格式(类型组合gl.REDgl.UNSIGNED_BYTE指定规范化整数格式。整型数据类型的完整范围映射到无符号规范化整数(如UNSIGNED_BYTEUNSIGNED_SHORTUNSIGNED_INT(的浮点范围 [0, 1],以及有符号归一化整数的范围 [-1, 1](如BYTESHORTINT(。


在WebGL 2.0(分别是OpenGL ES 3.0(中,可以通过组合gl.RED_INTEGERgl.UNSIGNED_BYTE来指定图像格式,它指定一个整体像素格式并对应于内部图像格式R8UI(参见WebGl 2.0 - 3.7.6纹理对象(:

gl.texImage2D(gl.TEXTURE_2D,
0,
gl.R8UI,
3,
2,
0,
gl.RED_INTEGER,
gl.UNSIGNED_BYTE,
data);

最新更新