initial
This commit is contained in:
commit
a28e995202
11 changed files with 1224 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
13
index.js
Normal file
13
index.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
const express = require('express')
|
||||||
|
const app = express()
|
||||||
|
const port = 8080
|
||||||
|
|
||||||
|
app.use(express.static('public'))
|
||||||
|
|
||||||
|
app.get('/', (req, res) => {
|
||||||
|
res.sendFile('index.html')
|
||||||
|
})
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`App listening on port http://127.0.0.1:${port}`)
|
||||||
|
})
|
1018
package-lock.json
generated
Normal file
1018
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
14
package.json
Normal file
14
package.json
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "webgl",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node index.js"
|
||||||
|
},
|
||||||
|
"author": "Tyler Murphy",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2"
|
||||||
|
}
|
||||||
|
}
|
16
public/index.html
Normal file
16
public/index.html
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>welgl</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<canvas id="canvas">
|
||||||
|
Your browser does not support NTML5
|
||||||
|
</canvas>
|
||||||
|
<script src="js/file.js"></script>
|
||||||
|
<script src="js/shader.js"></script>
|
||||||
|
<script src="js/buffer.js"></script>
|
||||||
|
<script src="js/gl.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
44
public/js/buffer.js
Normal file
44
public/js/buffer.js
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
const Buffer = {}
|
||||||
|
|
||||||
|
let vaos = []
|
||||||
|
let vbos = []
|
||||||
|
|
||||||
|
class Mesh {
|
||||||
|
|
||||||
|
static #vaos = []
|
||||||
|
static #vbos = []
|
||||||
|
|
||||||
|
#count = 0
|
||||||
|
|
||||||
|
constructor(vertexCount) {
|
||||||
|
this.id = gl.createVertexArray()
|
||||||
|
gl.bindVertexArray(this.id)
|
||||||
|
Mesh.#vaos.push(this.id)
|
||||||
|
this.vertexCount = vertexCount
|
||||||
|
}
|
||||||
|
|
||||||
|
store(data, dim) {
|
||||||
|
let id = gl.createBuffer()
|
||||||
|
Mesh.#vbos.push(id)
|
||||||
|
gl.bindBuffer(gl.ARRAY_BUFFER, id)
|
||||||
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW)
|
||||||
|
gl.vertexAttribPointer(this.#count, dim, gl.FLOAT, false, Float32Array.BYTES_PER_ELEMENT * dim, 0)
|
||||||
|
gl.enableVertexAttribArray(this.#count)
|
||||||
|
this.#count++;
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
finish() {
|
||||||
|
this.unbind()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
bind() {
|
||||||
|
gl.bindVertexArray(this.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
unbind() {
|
||||||
|
gl.bindVertexArray(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
12
public/js/file.js
Normal file
12
public/js/file.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
const File = {}
|
||||||
|
|
||||||
|
File.read = async (path) => {
|
||||||
|
try {
|
||||||
|
let data = await fetch(path)
|
||||||
|
let text = await data.text()
|
||||||
|
return text
|
||||||
|
} catch (err) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
38
public/js/gl.js
Normal file
38
public/js/gl.js
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
var gl;
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const canvas = document.getElementById("canvas")
|
||||||
|
gl = canvas.getContext('webgl')
|
||||||
|
|
||||||
|
if(!gl) {
|
||||||
|
console.log("Your browser does not support webgl")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var ext = gl.getExtension('OES_vertex_array_object');
|
||||||
|
if(!ext) {
|
||||||
|
console.log("Your browser does not support webgl 2")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
gl['createVertexArray'] = function() { return ext['createVertexArrayOES'](); };
|
||||||
|
gl['deleteVertexArray'] = function(vao) { ext['deleteVertexArrayOES'](vao); };
|
||||||
|
gl['bindVertexArray'] = function(vao) { ext['bindVertexArrayOES'](vao); };
|
||||||
|
gl['isVertexArray'] = function(vao) { return ext['isVertexArrayOES'](vao); };
|
||||||
|
|
||||||
|
var shader = await Shader.load("shader/simple.vert","shader/simple.frag")
|
||||||
|
|
||||||
|
var triangle = new Mesh(3)
|
||||||
|
.store([0.0, 0.5, -0.5, -0.5, 0.5, -0.5], 2)
|
||||||
|
.store([1.0, 1.0, 0.0, 0.7, 0.0, 1.0, 0.1, 1.0, 0.6], 3)
|
||||||
|
.finish()
|
||||||
|
|
||||||
|
gl.useProgram(shader)
|
||||||
|
triangle.bind()
|
||||||
|
gl.drawArrays(gl.TRIANGLES, 0, triangle.vertexCount)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
50
public/js/shader.js
Normal file
50
public/js/shader.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
const Shader = {}
|
||||||
|
|
||||||
|
Shader.load = async (vertexPath, fragmentPath) => {
|
||||||
|
let vertexCode = await File.read(vertexPath)
|
||||||
|
if(!vertexCode) {
|
||||||
|
console.log("Invalid shader path:", vertexPath)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let fragmentCode = await File.read(fragmentPath)
|
||||||
|
if(!fragmentCode) {
|
||||||
|
console.log("Invalid shader path:", fragmentPath)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var vertexShader = gl.createShader(gl.VERTEX_SHADER)
|
||||||
|
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
|
||||||
|
|
||||||
|
gl.shaderSource(vertexShader, vertexCode)
|
||||||
|
gl.shaderSource(fragmentShader, fragmentCode)
|
||||||
|
|
||||||
|
gl.compileShader(vertexShader)
|
||||||
|
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
|
||||||
|
console.error('Failed to compile ' + vertexPath + '!', gl.getShaderInfoLog(vertexShader))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
gl.compileShader(fragmentShader)
|
||||||
|
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
|
||||||
|
console.error('Failed to compile ' + fragmentPath + '!', gl.getShaderInfoLog(fragmentShader))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var program = gl.createProgram()
|
||||||
|
gl.attachShader(program, vertexShader)
|
||||||
|
gl.attachShader(program, fragmentShader)
|
||||||
|
gl.linkProgram(program)
|
||||||
|
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
||||||
|
console.error("Failed to link shader program!", gl.getProgramInfoLog(program));
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
gl.validateProgram(program);
|
||||||
|
if (!gl.getProgramParameter(program, gl.VALIDATE_STATUS)) {
|
||||||
|
console.error("Failed to validate shader program!", gl.getProgramInfoLog(program));
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return program
|
||||||
|
}
|
7
public/shader/simple.frag
Normal file
7
public/shader/simple.frag
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
varying vec3 color_pass;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_FragColor = vec4(color_pass, 1.0);
|
||||||
|
}
|
11
public/shader/simple.vert
Normal file
11
public/shader/simple.vert
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
attribute vec2 position;
|
||||||
|
attribute vec3 color;
|
||||||
|
|
||||||
|
varying vec3 color_pass;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
color_pass = color;
|
||||||
|
gl_Position = vec4(position, 0.0, 1.0);
|
||||||
|
}
|
Loading…
Reference in a new issue