3d рендер на WebGL без фреймворков и библиотек
— это графическое API, которое позволяет отправлять команды на видеокарту из JavaScript
— геометрия, состоящая из треугольников и материалов
const vertices = new Float32Array([
// vertex 1
-0.5, -0.5, 0.0, // position
1.0, 0.0, 0.0, // normal
0.5, 0.5, // texCoord
...
// vertex n
1.0, 0.5, 0.0, // position
0.0, 1.0, 0.0, // normal
1.0, 0.5, // texCoord
]);
// attribute means it comes from the geometry array we created
attribute vec3 a_position;
attribute vec3 a_normal;
// uniforms - constants
uniform mat4 u_worldTransform;
uniform mat4 u_viewProjection;
// output to fragment shader
varying vec3 v_normal;
void main() {
vec4 worldPos = u_worldTransform * vec4(a_position, 1.0);
vec4 viewPos = u_viewProjection * worldPos;
v_normal = mat3(u_worldTransform) * a_normal;
gl_Position = viewPos;
}
// uniforms
uniform vec3 u_lightDir;
uniform vec3 u_lightColor;
//input from vertex shader
varying vec3 v_normal;
void main() {
float NoL = max(dot(v_normal, -u_lightDir), 0.0);
gl_FragColor = vec4(NoL * u_lightColor, 1.0);
}
// компилируем вершинный шейдер
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderCode);
gl.compileShader(vertexShader);
// компилируем фрагментный шейдер
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderCode);
gl.compileShader(fragmentShader);
// линкуем их вместе
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
// функция noise возвращает случайное число
float noise (in vec2 st) {
return fract(sin(dot(st.xy,
vec2(12.9898,78.233))) * 43758.5453123);
}
elevation[y][x] = noise(nx, ny);
elevation[y][x] = 1 * noise(1 * nx, 1 * ny);
+ 0.5 * noise(2 * nx, 2 * ny);
+ 0.25 * noise(4 * nx, 2 * ny);
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
blendResult = shaderOutput.rgb * shaderOutput.a + // облака
frameBuffer.rgb * (1 - shaderOutput.a); // планета