index.vue
<template>
<div class="point">
<canvas id="canvas" width="600" height="600" style="border: 1px solid #ff0000;"></canvas>
</div>
</template>
<script setup>
import { onMounted, onUnmounted } from "vue";
import { useStore } from "vuex";
import CuonUtils from "../common/cuon-utils"
import vertexShader from './vertexShader'
import fragmentShader from './fragmentShader'
const store = useStore();
onMounted(() => {
let canvas = document.getElementById('canvas');
let gl = CuonUtils.getWebGLContext(canvas);
CuonUtils.initShaders(gl, vertexShader, fragmentShader);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.POINTS, 0, 1);
});
</script>
<style scoped>
.point {
position: absolute;
width: 100%;
height: 100%;
}
</style>
vertexShader.js
const vertexShader = `
void main (){
gl_Position = vec4(0.5, 0.5, 1.0, 1.0);
gl_PointSize = 10.0;
}
`
export default vertexShader;
fragmentShader.js
const fragmentShader = `
void main (){
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`
export default fragmentShader;
cuon-utils.js
import WebGLUtils from "./webgl-utils"
// cuon-utils.js (c) 2012 kanda and matsuda
/**
* Create a program object and make current
* @param gl GL context
* @param vshader a vertex shader program (string)
* @param fshader a fragment shader program (string)
* @return true, if the program object was created and successfully made current
*/
function initShaders(gl, vshader, fshader) {
var program = createProgram(gl, vshader, fshader);
if (!program) {
console.log("Failed to create program");
return false;
}
gl.useProgram(program);
gl.program = program;
return true;
}
/**
* Create the linked program object
* @param gl GL context
* @param vshader a vertex shader program (string)
* @param fshader a fragment shader program (string)
* @return created program object, or null if the creation has failed
*/
function createProgram(gl, vshader, fshader) {
// Create shader object
var vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);
var fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);
if (!vertexShader || !fragmentShader) {
return null;
}
// Create a program object
var program = gl.createProgram();
if (!program) {
return null;
}
// Attach the shader objects
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
// Link the program object
gl.linkProgram(program);
// Check the result of linking
var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
if (!linked) {
var error = gl.getProgramInfoLog(program);
console.log("Failed to link program: " + error);
gl.deleteProgram(program);
gl.deleteShader(fragmentShader);
gl.deleteShader(vertexShader);
return null;
}
return program;
}
/**
* Create a shader object
* @param gl GL context
* @param type the type of the shader object to be created
* @param source shader program (string)
* @return created shader object, or null if the creation has failed.
*/
function loadShader(gl, type, source) {
// Create shader object
var shader = gl.createShader(type);
if (shader == null) {
console.log("unable to create shader");
return null;
}
// Set the shader program
gl.shaderSource(shader, source);
// Compile the shader
gl.compileShader(shader);
// Check the result of compilation
var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (!compiled) {
var error = gl.getShaderInfoLog(shader);
console.log("Failed to compile shader: " + error);
gl.deleteShader(shader);
return null;
}
return shader;
}
/**
* Initialize and get the rendering for WebGL
* @param canvas <cavnas> element
* @param opt_debug flag to initialize the context for debugging
* @return the rendering context for WebGL
*/
function getWebGLContext(canvas, opt_debug) {
// Get the rendering context for WebGL
var gl = WebGLUtils.setupWebGL(canvas);
if (!gl) return null;
// if opt_debug is explicitly false, create the context for debugging
// if (arguments.length < 2 || opt_debug) {
// gl = WebGLDebugUtils.makeDebugContext(gl);
// }
return gl;
}
export default {initShaders, createProgram, loadShader, getWebGLContext}
webgl-utils.js
参考前面的文章: https://www.jianshu.com/p/880678a0ca0b