文件列表
- index.html
- grid_object.js
- logic.js
index.html
<!doctype html>
<html>
<head>
<style>
canvas {
border: 1px solid #000000;
}
</style>
</head>
<body>
<p>
<b>第一个格子的颜色:</b>
<input id="gridcolor" type="range" min="0" max="1" value="0" step="0.05" oninput="gl_draw()" />
<b id="gridcolorvalue">0</b>
</p>
<canvas id="tri" width="600" height="600" style="width:300px; height:300px">
</canvas>
<script id="vertex_shader" type="myshader">
precision mediump int;
precision mediump float;
uniform mat3 u_all;
attribute vec2 a_PointVertex;
attribute float a_Color;
varying float v_color;
void main() {
vec3 coord = u_all * vec3(a_PointVertex, 1.0);
gl_Position = vec4(coord.x, coord.y, 0.0, 1.0);
v_color = a_Color;
}
</script>
<script id="fragment_shader" type="myshader">
precision mediump int;
precision mediump float;
varying float v_color;
void main() {
gl_FragColor = vec4(v_color, v_color, v_color, 1.0);
}
</script>
<script type="text/javascript" src="grid_object.js"></script>
<script type="text/javascript" src="logic.js"></script>
</body>
</html>
grid_object.js
class GridObject {
constructor(width, height, posx, posy, color) {
this.width = width;
this.height = height;
this.posx = posx;
this.posy = posy;
this.color = color;
this.modelUpdated = false;
this.glbuffer = null;
this.a_PointVertex = null;
this.a_Color = null;
}
genData(gl) {
this.data = [
this.posx, this.posy, this.color,
this.posx + this.width, this.posy, this.color,
this.posx + this.width, this.posy + this.height, this.color,
this.posx + this.width, this.posy + this.height, 1 - this.color,
this.posx, this.posy + this.height, 1 - this.color,
this.posx, this.posy, 1 - this.color,
];
this.dataArr = new Float32Array(this.data);
this.pointCount = 6;
if (this.glbuffer != null) {
gl.deleteBuffer(this.glbuffer);
this.a_PointVertex = null;
this.a_Color = null;
}
this.glbuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.glbuffer);
gl.bufferData(gl.ARRAY_BUFFER, this.dataArr, gl.STATIC_DRAW);
this.modelUpdated = true;
}
render(gl, program) {
gl.bindBuffer(gl.ARRAY_BUFFER, this.glbuffer);
if (this.modelUpdated) {
this.modelUpdated = false;
if (this.a_PointVertex == null) {
this.a_PointVertex = gl.getAttribLocation(program, 'a_PointVertex');
}
if (this.a_Color == null) {
this.a_Color = gl.getAttribLocation(program, 'a_Color');
}
}
gl.vertexAttribPointer(this.a_PointVertex, 2, gl.FLOAT, false, 12, 0);
gl.vertexAttribPointer(this.a_Color, 1, gl.FLOAT, false, 12, 8);
gl.enableVertexAttribArray(this.a_Color);
gl.enableVertexAttribArray(this.a_PointVertex);
gl.drawArrays(gl.TRIANGLES, 0, this.pointCount);
}
}
logic.js
var pointCanvas = null
var gl = null
var u_all_loc = null
var gridColorDom = null
var gridColorValueDom = null
var gridOne = null
var gridTwo = null
var program = null
// 入口函数
function Main() {
gl_init()
gl_draw()
}
function genMat3ForGL(a, b, alpha, A, B) {
let mat3 = [
a * Math.cos(alpha), a * Math.sin(alpha), 0,
-b * Math.sin(alpha), b * Math.cos(alpha), 0,
A, B, 1,
]
return new Float32Array(mat3)
}
function gl_init() {
pointCanvas = document.getElementById('tri')
gl = pointCanvas.getContext('webgl', { preserveDrawingBuffer: true })
gridOne = new GridObject(0.5, 0.5, 0, 0, 0.3)
gridOne.genData(gl)
gridTwo = new GridObject(0.5, 0.5, -0.5, -0.5, 0.3)
gridTwo.genData(gl)
// data = [-1, -1, 0, 0,
// 1, -1, 1, 0,
// 0, 1, 0.5, 1
// ]
// dataArr = new Float32Array(data)
// pointCount = 3
// buffer_point = gl.createBuffer()
// gl.bindBuffer(gl.ARRAY_BUFFER, buffer_point)
// gl.bufferData(gl.ARRAY_BUFFER, dataArr, gl.STATIC_DRAW)
//
var vertex_shader_code = document.getElementById('vertex_shader').textContent
var vertex_shader = gl.createShader(gl.VERTEX_SHADER)
gl.shaderSource(vertex_shader, vertex_shader_code)
gl.compileShader(vertex_shader)
// 检查shader错误
const v_compiled = gl.getShaderParameter(vertex_shader, gl.COMPILE_STATUS)
if (!v_compiled) {
const v_theError = gl.getShaderInfoLog(vertex_shader)
console.error(v_theError)
gl.deleteShader(vertex_shader)
}
//
var fragment_shader_code = document.getElementById('fragment_shader').textContent
var fragment_shader = gl.createShader(gl.FRAGMENT_SHADER)
gl.shaderSource(fragment_shader, fragment_shader_code)
gl.compileShader(fragment_shader)
// 检查shader错误
const f_compiled = gl.getShaderParameter(fragment_shader, gl.COMPILE_STATUS)
if (!f_compiled) {
const f_theError = gl.getShaderInfoLog(fragment_shader)
console.error(f_theError)
gl.deleteShader(fragment_shader)
}
//
program = gl.createProgram()
gl.attachShader(program, vertex_shader)
gl.attachShader(program, fragment_shader)
gl.linkProgram(program)
gl.useProgram(program)
// attributes
// var a_PointVertex = gl.getAttribLocation(program, 'a_PointVertex')
// gl.vertexAttribPointer(a_PointVertex, 2, gl.FLOAT, false, 16, 0)
// gl.enableVertexAttribArray(a_PointVertex)
// uniforms
u_all_loc = gl.getUniformLocation(program, "u_all")
gridColorDom = document.getElementById("gridcolor")
gridColorValueDom = document.getElementById("gridcolorvalue")
}
// gl更新逻辑
function gl_draw() {
gl.uniformMatrix3fv(u_all_loc, false, genMat3ForGL(1,
1, 0, 0, 0
))
gridColorValueDom.innerText = gridColorDom.value
gl.enable(gl.CULL_FACE)
gl.enable(gl.DEPTH_TEST)
gl.clearColor(0, 0, 0, 0)
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
gridOne.color = gridColorDom.value
gridOne.genData(gl)
gridOne.render(gl, program)
gridTwo.render(gl, program)
}
Main()