This commit is contained in:
dylan 2023-04-29 14:34:26 -07:00
parent d7c2d5adb9
commit e85dbb1a33
2 changed files with 76 additions and 113 deletions

View File

@ -1,93 +0,0 @@
import {
DwmWindow,
gl
} from "./deps.ts";
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);
});
export const makeFrameFunc = (swapBuffers: DwmWindow["swapBuffers"]) => {
return () => {
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);
swapBuffers();
}
}

View File

@ -6,10 +6,10 @@ import {
} from "./deps.ts"; } from "./deps.ts";
const window = createWindow({ const window = createWindow({
title: "DenoGL", title: "Faux",
width: 800, width: 1024,
height: 600, height: 1024,
resizable: true, resizable: false,
glVersion: [3, 2], glVersion: [3, 2],
gles: true, gles: true,
}); });
@ -48,15 +48,20 @@ function loadShader(type: number, src: string) {
} }
const vShaderSrc = ` const vShaderSrc = `
attribute vec4 vPosition; attribute vec4 vPosition;
void main() { attribute vec4 vCol;
varying vec4 color;
void main() {
gl_Position = vPosition; gl_Position = vPosition;
} color = vCol;
`; }
`;
const fShaderSrc = ` const fShaderSrc = `
precision mediump float;
varying vec4 color;
void main() { void main() {
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); gl_FragColor = color;
} }
`; `;
@ -68,6 +73,7 @@ gl.AttachShader(program, vShader);
gl.AttachShader(program, fShader); gl.AttachShader(program, fShader);
gl.BindAttribLocation(program, 0, new TextEncoder().encode("vPosition\0")); gl.BindAttribLocation(program, 0, new TextEncoder().encode("vPosition\0"));
gl.BindAttribLocation(program, 1, new TextEncoder().encode("vCol\0"));
gl.LinkProgram(program); gl.LinkProgram(program);
@ -89,18 +95,68 @@ addEventListener("resize", (event) => {
gl.Viewport(0, 0, event.width, event.height); gl.Viewport(0, 0, event.width, event.height);
}); });
const pixelsPerRow = 128;
const top = 1;
const left = -1;
const cell = 2/pixelsPerRow;
const px = (x: number, y: number) => {
// deno-fmt-ignore
return [
left + x*cell, top - y*cell, 0,
left + (x+1)*cell, top - y*cell, 0,
left + x*cell, top - (y+1)*cell, 0,
left + (x+1)*cell, top - y*cell, 0,
left + x*cell, top - (y+1)*cell, 0,
left + (x+1)*cell, top - (y+1)*cell, 0,
];
}
const palette = [
[0, 0, 0, 0],
[0, 0, 0, 1],
[1, 1, 1, 1],
[1, 0, 0, 1],
[1, 1, 0, 1],
[0, 1, 0, 1],
[0, 0, 1, 1],
]
const c = (n: number) => {
return [
...palette[n],
...palette[n],
...palette[n],
...palette[n],
...palette[n],
...palette[n],
];
}
const allPixelTriangles = new Float32Array(
Array(pixelsPerRow*pixelsPerRow).fill(null).flatMap((_, i) => px(i%pixelsPerRow,Math.floor(i/pixelsPerRow)))
)
const choose = <T>(alts: Array<T>): T => {
return alts[Math.floor(Math.random()*alts.length)];
}
const allPixelColors = new Float32Array(
Array(pixelsPerRow*pixelsPerRow).fill(null).flatMap(() => c(choose([1,2,3,4,5,6])))
)
const frame = () => { const frame = () => {
gl.Clear(gl.COLOR_BUFFER_BIT); gl.Clear(gl.COLOR_BUFFER_BIT);
gl.UseProgram(program); gl.UseProgram(program);
// deno-fmt-ignore gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 0, allPixelTriangles);
gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 0, new Float32Array([ gl.VertexAttribPointer(1, 4, gl.FLOAT, gl.FALSE, 0, allPixelColors);
0.0, 0.5, 0.0,
-0.5, 0.0, 0.0,
0.5, 0.0, 0.0,
]));
gl.EnableVertexAttribArray(0); gl.EnableVertexAttribArray(0);
gl.DrawArrays(gl.TRIANGLES, 0, 3); gl.EnableVertexAttribArray(1);
gl.DrawArrays(gl.TRIANGLES, 0, 6*pixelsPerRow*pixelsPerRow);
window.swapBuffers(); window.swapBuffers();
} }
await mainloop(frame); await mainloop(() => {
frame();
});