Javascript 对象上没有纹理的webGL环境光

Javascript 对象上没有纹理的webGL环境光,javascript,webgl,shader,lighting,Javascript,Webgl,Shader,Lighting,我一直在关注哪些是好的,但我似乎不知道如何照亮一个没有纹理的物体。我的意思是教程中给出的着色器不允许绘制的对象没有纹理。我很难解释这一点,但如果有人知道webGL照明是如何工作的,我不认为在这里转储大量代码会有所帮助 你能举一个在简单的金字塔物体上使用它的例子吗 多边形中的所有三角形都有法线,所以这不是问题所在。最简单的方法就是在不想使用纹理时使用1x1像素的白色纹理 tex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tex); gl

我一直在关注哪些是好的,但我似乎不知道如何照亮一个没有纹理的物体。我的意思是教程中给出的着色器不允许绘制的对象没有纹理。我很难解释这一点,但如果有人知道webGL照明是如何工作的,我不认为在这里转储大量代码会有所帮助

你能举一个在简单的金字塔物体上使用它的例子吗


多边形中的所有三角形都有法线,所以这不是问题所在。

最简单的方法就是在不想使用纹理时使用1x1像素的白色纹理

tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE,
              new Uint8Array([255, 255, 255, 255]));
否则,您需要一个不同的着色器,一个不需要纹理的着色器。这意味着您的代码在管理代码中的不同路径时变得更加复杂。如果你想走这条路,在着色器中查找texture2D并用颜色替换它。例如,如果代码是

gl_FragCoord = texture2D(u_samplers, v_texcoord);
换成

gl_FragCoord = vec4(1,0,0,1);  // just use red
或者如果你想设置它,那么

uniform vec4 u_color;

gl_FragCoord = u_color;  // get color from uniform
现在可以使用设置该颜色

// at init time
colorLocation = gl.getUniformLocation(program, "u_color");

// at draw time
gl.uniform4fv(colorLocation, [1, 0, 0, 1]);  // set color to red

您可能只需要知道sampler2D在GLSL中定义了一个纹理,而texture2D和类似的函数可以从这样的纹理中获得一个特定的像素。因此,找到该类型的变量,并用纯色替换函数调用。