文件列表
- index.html
- grid_object.js
- logic.js
index.html
<!doctype html>
<html>
<head>
<style>
canvas {
border: 1px solid #000000;
}
</style>
</head>
<body>
<p>
<b>第一个格子的颜色R:</b>
<input id="gridcolorR" type="range" min="0" max="1" value="0" step="0.01" oninput="gl_draw()" />
<b id="gridcolorRvalue">0</b>
</p>
<p>
<b>第一个格子的颜色G:</b>
<input id="gridcolorG" type="range" min="0" max="1" value="0" step="0.01" oninput="gl_draw()" />
<b id="gridcolorGvalue">0</b>
</p>
<p>
<b>第一个格子的颜色B:</b>
<input id="gridcolorB" type="range" min="0" max="1" value="0" step="0.01" oninput="gl_draw()" />
<b id="gridcolorBvalue">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;
void main() {
vec3 coord = u_all * vec3(a_PointVertex, 1.0);
gl_Position = vec4(coord.x, coord.y, 0.0, 1.0);
}
</script>
<script id="fragment_shader" type="myshader">
precision mediump int;
precision mediump float;
uniform vec3 u_color;
void main() {
gl_FragColor = vec4(u_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) {
this.width = width;
this.height = height;
this.posx = posx;
this.posy = posy;
this.modelUpdated = false;
this.glbuffer = null;
this.a_PointVertex = null;
this.color = { R: 0, G: 0, B: 0 };
}
genData(gl) {
this.data = [
this.posx, this.posy,
this.posx + this.width, this.posy,
this.posx + this.width, this.posy + this.height,
this.posx + this.width, this.posy + this.height,
this.posx, this.posy + this.height,
this.posx, this.posy,
];
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');
}
}
gl.vertexAttribPointer(this.a_PointVertex, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.a_PointVertex);
gl.uniform3f(u_color, this.color.R, this.color.G, this.color.B);
gl.drawArrays(gl.TRIANGLES, 0, this.pointCount);
}
}
logic.js
var pointCanvas = null;
var gl = null;
var u_all_loc = null;
var u_color = null;
var gridColorRDom = null;
var gridColorRValueDom = null;
var gridColorGDom = null;
var gridColorGValueDom = null;
var gridColorBDom = null;
var gridColorBValueDom = 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);
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);
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);
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);
u_all_loc = gl.getUniformLocation(program, "u_all");
u_color = gl.getUniformLocation(program, "u_color");
gridColorRDom = document.getElementById("gridcolorR");
gridColorRValueDom = document.getElementById("gridcolorRvalue");
gridColorGDom = document.getElementById("gridcolorG");
gridColorGValueDom = document.getElementById("gridcolorGvalue");
gridColorBDom = document.getElementById("gridcolorB");
gridColorBValueDom = document.getElementById("gridcolorBvalue");
}
function gl_draw() {
gl.uniformMatrix3fv(u_all_loc, false, genMat3ForGL(1,
1, 0, 0, 0
));
gridColorRValueDom.innerText = gridColorRDom.value;
gridColorGValueDom.innerText = gridColorGDom.value;
gridColorBValueDom.innerText = gridColorBDom.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.R = gridColorRDom.value;
gridOne.color.G = gridColorGDom.value;
gridOne.color.B = gridColorBDom.value;
gridOne.render(gl, program);
gridTwo.render(gl, program);
}
Main();