107 lines
2.4 KiB
TypeScript
107 lines
2.4 KiB
TypeScript
![]() |
import {
|
||
|
createWindow,
|
||
|
getProcAddress,
|
||
|
mainloop,
|
||
|
gl,
|
||
|
} from "./deps.ts";
|
||
|
|
||
|
const window = createWindow({
|
||
|
title: "DenoGL",
|
||
|
width: 800,
|
||
|
height: 600,
|
||
|
resizable: true,
|
||
|
glVersion: [3, 2],
|
||
|
gles: true,
|
||
|
});
|
||
|
|
||
|
gl.load(getProcAddress);
|
||
|
|
||
|
function loadShader(type: number, src: string) {
|
||
|
const shader = gl.CreateShader(type);
|
||
|
gl.ShaderSource(
|
||
|
shader,
|
||
|
1,
|
||
|
new Uint8Array(
|
||
|
new BigUint64Array([
|
||
|
BigInt(
|
||
|
Deno.UnsafePointer.value(
|
||
|
Deno.UnsafePointer.of(new TextEncoder().encode(src)),
|
||
|
),
|
||
|
),
|
||
|
]).buffer,
|
||
|
),
|
||
|
new Int32Array([src.length]),
|
||
|
);
|
||
|
gl.CompileShader(shader);
|
||
|
const status = new Int32Array(1);
|
||
|
gl.GetShaderiv(shader, gl.COMPILE_STATUS, status);
|
||
|
if (status[0] === gl.FALSE) {
|
||
|
const logLength = new Int32Array(1);
|
||
|
gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, logLength);
|
||
|
const log = new Uint8Array(logLength[0]);
|
||
|
gl.GetShaderInfoLog(shader, logLength[0], logLength, log);
|
||
|
console.log(new TextDecoder().decode(log));
|
||
|
gl.DeleteShader(shader);
|
||
|
return 0;
|
||
|
}
|
||
|
return shader;
|
||
|
}
|
||
|
|
||
|
const vShaderSrc = `
|
||
|
attribute vec4 vPosition;
|
||
|
void main() {
|
||
|
gl_Position = vPosition;
|
||
|
}
|
||
|
`;
|
||
|
|
||
|
const fShaderSrc = `
|
||
|
void main() {
|
||
|
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
|
||
|
}
|
||
|
`;
|
||
|
|
||
|
const vShader = loadShader(gl.VERTEX_SHADER, vShaderSrc);
|
||
|
const fShader = loadShader(gl.FRAGMENT_SHADER, fShaderSrc);
|
||
|
|
||
|
const program = gl.CreateProgram();
|
||
|
gl.AttachShader(program, vShader);
|
||
|
gl.AttachShader(program, fShader);
|
||
|
|
||
|
gl.BindAttribLocation(program, 0, new TextEncoder().encode("vPosition\0"));
|
||
|
|
||
|
gl.LinkProgram(program);
|
||
|
|
||
|
const status = new Int32Array(1);
|
||
|
gl.GetProgramiv(program, gl.LINK_STATUS, status);
|
||
|
if (status[0] === gl.FALSE) {
|
||
|
const logLength = new Int32Array(1);
|
||
|
gl.GetProgramiv(program, gl.INFO_LOG_LENGTH, logLength);
|
||
|
const log = new Uint8Array(logLength[0]);
|
||
|
gl.GetProgramInfoLog(program, logLength[0], logLength, log);
|
||
|
console.log(new TextDecoder().decode(log));
|
||
|
gl.DeleteProgram(program);
|
||
|
Deno.exit(1);
|
||
|
}
|
||
|
|
||
|
gl.ClearColor(0.0, 0.0, 0.0, 1.0);
|
||
|
|
||
|
addEventListener("resize", (event) => {
|
||
|
gl.Viewport(0, 0, event.width, event.height);
|
||
|
});
|
||
|
|
||
|
const frame = () => {
|
||
|
gl.Clear(gl.COLOR_BUFFER_BIT);
|
||
|
gl.UseProgram(program);
|
||
|
// deno-fmt-ignore
|
||
|
gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 0, new Float32Array([
|
||
|
0.0, 0.5, 0.0,
|
||
|
-0.5, 0.0, 0.0,
|
||
|
0.5, 0.0, 0.0,
|
||
|
]));
|
||
|
gl.EnableVertexAttribArray(0);
|
||
|
gl.DrawArrays(gl.TRIANGLES, 0, 3);
|
||
|
window.swapBuffers();
|
||
|
}
|
||
|
|
||
|
await mainloop(frame);
|