我想将一堆浮点传递给片段着色器,并按索引访问它们。
基本上这个答案中提到的 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_S
,TEXTURE_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.RED
gl.UNSIGNED_BYTE
指定规范化整数格式。整型数据类型的完整范围映射到无符号规范化整数(如UNSIGNED_BYTE
、UNSIGNED_SHORT
、UNSIGNED_INT
(的浮点范围 [0, 1],以及有符号归一化整数的范围 [-1, 1](如BYTE
、SHORT
、INT
(。
在WebGL 2.0(分别是OpenGL ES 3.0(中,可以通过组合gl.RED_INTEGER
gl.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);