我一直在关注这些很好的教程,但我似乎无法弄清楚如何照亮没有纹理的对象。我的意思是教程中给出的着色器不允许对象被吸引到没有纹理。我无法解释这一点,但如果有人知道 webGL 照明如何工作,我认为在这里倾倒大量代码不会有帮助。
你能举一个在一个简单的金字塔对象上使用它的例子吗?
我确实有多边形中所有三角形的法线,所以这不是问题。
我一直在关注这些很好的教程,但我似乎无法弄清楚如何照亮没有纹理的对象。我的意思是教程中给出的着色器不允许对象被吸引到没有纹理。我无法解释这一点,但如果有人知道 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