当前位置:   article > 正文

Vue与WebGL结合_vue webgl

vue webgl

本文将WebGL与当前前端比较火的Vue框架进行初步结合,以备后续项目开发需要。部分代码源自https://blog.csdn.net/GISuuser/article/details/82224057以及《WebGL编程指南》。

大家可以自己百度搜索vue的安装配置。这里仅介绍本项目的开发过程。

1、创建vue工程

在cmd窗口中输入vue init webpack vueproject,创建名为vueproject的工程。

2、创建webgl工具类

在src文件下新建lib文件夹,然后在lib文件夹里新建tools.js。在tools.js中按照ES6的写法封装webgl的基本配置。代码如下:

  1. class Tools {
  2. static initShaders(gl, vshader, fshader) {
  3. var program = Tools.createProgram(gl, vshader, fshader);
  4. if (!program) {
  5. console.log('创建program失败');
  6. return false;
  7. }
  8. gl.useProgram(program);
  9. gl.program = program;
  10. return true;
  11. }
  12. static createProgram(gl, vshader, fshader) {
  13. // 创造着色器对象
  14. let vertexShader = Tools.loadShader(gl, gl.VERTEX_SHADER, vshader);
  15. let fragmentShader = Tools.loadShader(gl, gl.FRAGMENT_SHADER, fshader);
  16. if (!vertexShader || !fragmentShader) {
  17. return null;
  18. }
  19. // 创造 program 对象
  20. let program = gl.createProgram();
  21. if (!program) {
  22. return null;
  23. }
  24. // 绑定着色器与program
  25. gl.attachShader(program, vertexShader);
  26. gl.attachShader(program, fragmentShader);
  27. //连接program
  28. gl.linkProgram(program);
  29. // 检查连接结果
  30. let linked = gl.getProgramParameter(program, gl.LINK_STATUS);
  31. if (!linked) {
  32. let error = gl.getProgramInfoLog(program);
  33. console.log('连接 program失败: ' + error);
  34. gl.deleteProgram(program);
  35. gl.deleteShader(fragmentShader);
  36. gl.deleteShader(vertexShader);
  37. return null;
  38. }
  39. return program;
  40. }
  41. /**
  42. * 创建着色器
  43. * @param gl
  44. * @param type
  45. * @param source
  46. * @returns {*}
  47. */
  48. static loadShader(gl, type, source) {
  49. // 创建着色器
  50. let shader = gl.createShader(type);
  51. if (shader == null) {
  52. console.log('创建着色器失败');
  53. return null;
  54. }
  55. // Set the shader program
  56. gl.shaderSource(shader, source);
  57. // 编译着色器
  58. gl.compileShader(shader);
  59. // 检查编译结果
  60. let compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  61. if (!compiled) {
  62. let error = gl.getShaderInfoLog(shader);
  63. console.error('编译着色器失败: ' + error);
  64. gl.deleteShader(shader);
  65. return null;
  66. }
  67. return shader;
  68. }
  69. }
  70. export default Tools

3、在components文件夹里新建test.vue文件,代码如下:

  1. <template>
  2. <div>
  3. <canvas id="glcanvas" width="640" height="480"></canvas>
  4. </div>
  5. </template>
  6. <script>
  7. import Tool from "../lib/tools";
  8. export default {
  9. data() {
  10. return {};
  11. },
  12. mounted() {
  13. //顶点着色器
  14. let VSHADER_SOURCE =
  15. "void main() {\n" +
  16. " gl_Position = vec4(0.5, 0.5, 0.0, 1.0);\n" + // 设置点的位置
  17. " gl_PointSize = 10.0;\n" + // 设置点的大小
  18. "}\n";
  19. // 片元着色器
  20. let FSHADER_SOURCE =
  21. "void main() {\n" +
  22. " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + // 设置点的颜色
  23. "}\n";
  24. //获取上下文对象
  25. const canvas = document.querySelector("#glcanvas");
  26. const gl = canvas.getContext("webgl");
  27. //检测WebGL支持
  28. if (!gl) {
  29. console.error("浏览器不支持WebGL");
  30. return;
  31. }
  32. if (!Tool.initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
  33. console.error("初始化着色器失败");
  34. return;
  35. }
  36. //设置背景色
  37. gl.clearColor(0.0, 0.0, 0.0, 1);
  38. //设置缓冲区颜色
  39. gl.clear(gl.COLOR_BUFFER_BIT);
  40. gl.drawArrays(gl.POINTS, 0, 1);
  41. }
  42. };
  43. </script>
  44. <style scoped>
  45. </style>

1-5行在template中创建canvas

8行导入tools.js的工具类,并命名为Tool

13-44行考虑到代码需要获取canvas对象,因此在mounted中创建关于webgl渲染。

(vue知识:created:html加载完成之前,执行。执行顺序:父组件-子组件

mounted:html加载完成后执行。执行顺序:子组件-父组件

methods:事件方法执行

watch:watch是去监听一个值的变化,然后执行相对应的函数。

computed:computed是计算属性,也就是依赖其它的属性计算所得出最后的值)

 

4、添加路由

打开router文件夹下的index.js,将test组件添加进去

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Test from '@/components/Test'
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/',
  9. component: Test
  10. }
  11. ]
  12. })

5、运行结果:

在cmd中定位到当前工程的路径下,输入npm run dev,编译成功后,在浏览器中输入http://localhost:8080,即可看到效果:

这里出现了vue的logo,可以在App.vue中将其去掉。

  1. <template>
  2. <div id="app">
  3. <!-- <img src="./assets/logo.png"> -->
  4. <router-view/>
  5. </div>
  6. </template>

然后再编译运行

6、更多内容请扫码关注我的微信公众号,或者在微信里搜索公众号webgis学习,我会不定期更新自己的webgis方面的学习心得。

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号