无论我放入其中的数据如何,纹理都是黑色的

Textures have a black color regardless of the data I put in them

我尝试将数据放入片段着色器以通过纹理为 2 个三角形着色,但给出的颜色是黑色(可能是默认值?),而不是预期的绿色或红色。

我尝试这样做的来源是 https://webglfundamentals.org/webgl/lessons/webgl-shaders-and-glsl.html#textures-in-fragment-shaders。我把那里的所有东西都放在我的源代码中,我想如果我在我的纹理中放一个绿色像素和一个红色像素,那么它需要有一个不同于黑色的颜色,但它是黑色的。

那是片段着色器:

precision mediump float;

uniform sampler2D u_texture;

void main() {
   vec2 texcoord = vec2(0.5, 0.5)  // get a value from the middle of the texture
   gl_FragColor = texture2D(u_texture, texcoord);
}

我创建了纹理并将数据放入其中。

var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
var level = 0;
var width = 2;
var height = 1;
var data = new Uint8Array([
   255, 0, 0, 255,   // a red pixel
   0, 255, 0, 255,   // a green pixel
]);
gl.texImage2D(gl.TEXTURE_2D, level, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);

我试着用不同的颜色将不同的数据放入纹理中,但结果是一样的。

您必须将纹理缩小功能设置为 "non mipmap" 过滤器,否则纹理不 mipmap 完整。例如:

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);

默认情况下,缩小参数为 NEAREST_MIPMAP_LINEAR。此参数值需要纹理的 mipmap 才能完整。

另一个选项是通过以下方式生成 mipmap:

gl.generateMipmap(gl.TEXTURE_2D)

但是为此,纹理的宽度和高度必须是二的幂(对于 WebGL 1.0)。参见 WebGL specification - 5.13.8 Texture objects

注意,如果纹理不是完整的 mipmap,则纹理元素获取的 return 值为 (0, 0, 0, 1),这会导致 "black" 颜色。