Vue与WebGL结合

12 篇文章 1 订阅

本文将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的基本配置。代码如下:

class Tools {
  static initShaders(gl, vshader, fshader) {
    var program = Tools.createProgram(gl, vshader, fshader);
    if (!program) {
      console.log('创建program失败');
      return false;
    }
    gl.useProgram(program);
    gl.program = program;
​
    return true;
  }
  static createProgram(gl, vshader, fshader) {
    // 创造着色器对象
    let vertexShader = Tools.loadShader(gl, gl.VERTEX_SHADER, vshader);
    let fragmentShader = Tools.loadShader(gl, gl.FRAGMENT_SHADER, fshader);
    if (!vertexShader || !fragmentShader) {
      return null;
    }
​
    // 创造 program 对象
    let program = gl.createProgram();
    if (!program) {
      return null;
    }
​
    // 绑定着色器与program
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
​
    //连接program
    gl.linkProgram(program);
​
    // 检查连接结果
    let linked = gl.getProgramParameter(program, gl.LINK_STATUS);
    if (!linked) {
      let error = gl.getProgramInfoLog(program);
      console.log('连接 program失败: ' + error);
      gl.deleteProgram(program);
      gl.deleteShader(fragmentShader);
      gl.deleteShader(vertexShader);
      return null;
    }
    return program;
  }
​
  /**
   * 创建着色器
   * @param gl
   * @param type
   * @param source
   * @returns {*}
   */
  static loadShader(gl, type, source) {
    // 创建着色器
    let shader = gl.createShader(type);
    if (shader == null) {
      console.log('创建着色器失败');
      return null;
    }
​
    // Set the shader program
    gl.shaderSource(shader, source);
​
    // 编译着色器
    gl.compileShader(shader);
​
    // 检查编译结果
    let compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
    if (!compiled) {
      let error = gl.getShaderInfoLog(shader);
      console.error('编译着色器失败: ' + error);
      gl.deleteShader(shader);
      return null;
    }
​
    return shader;
  }
​
}
​
export default Tools

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

<template>
  <div>
    <canvas id="glcanvas" width="640" height="480"></canvas>
  </div>
</template>
​
<script>
import Tool from "../lib/tools";
export default {
  data() {
    return {};
  },
  mounted() {
    //顶点着色器
    let VSHADER_SOURCE =
      "void main() {\n" +
      "  gl_Position = vec4(0.5, 0.5, 0.0, 1.0);\n" + // 设置点的位置
      "  gl_PointSize = 10.0;\n" + // 设置点的大小
      "}\n";
​
    // 片元着色器
    let FSHADER_SOURCE =
      "void main() {\n" +
      "  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + // 设置点的颜色
      "}\n";
​
    //获取上下文对象
    const canvas = document.querySelector("#glcanvas");
    const gl = canvas.getContext("webgl");
    //检测WebGL支持
    if (!gl) {
      console.error("浏览器不支持WebGL");
      return;
    }
    if (!Tool.initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
      console.error("初始化着色器失败");
      return;
    }
    //设置背景色
    gl.clearColor(0.0, 0.0, 0.0, 1);
    //设置缓冲区颜色
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.POINTS, 0, 1);
  }
};
</script>
​
<style scoped>
</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组件添加进去

import Vue from 'vue'
import Router from 'vue-router'
import Test from '@/components/Test'
​
Vue.use(Router)
​
export default new Router({
  routes: [
    {
      path: '/',
      component: Test
    }
  ]
})

5、运行结果:

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

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

<template>
  <div id="app">
    <!-- <img src="./assets/logo.png"> -->
    <router-view/>
  </div>
</template>

然后再编译运行

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

 

Vue-Unity-WebGL 是一个具有极高可扩展性和灵活性的 Unity3D web 端开发框架,它将 Vue.js 与 Unity Web Player 和 WebGL 等技术相结合,为开发者提供了最佳的解决方案。 Vue-Unity-WebGL 框架具有很高的兼容性和易用性,开发者可以更加灵活地应用该框架来定制自己的项目。由于该框架具备了许多优秀的特性,如自适应布局、多平台支持等,使得开发者可以轻松地实现用户体验和开发效率的提升。此外,Vue-Unity-WebGL 框架不仅提供了可视化开发工具,还提供了完整的运行环境,为开发者提供了优秀的开发体验。 Vue-Unity-WebGL 框架的另一个重要特点是其大量的插件与扩展功能,这些插件和扩展可以为项目的开发和管理提供坚强的技术支持。比如,通过 vue-router 可以控制路由,Vue-Unity-WebGL 可以协作处理组件数据和 Unity3D 渲染等复杂的操作,而 Vuex 则可以使开发者方便地处理应用数据流和组件状态的管理。这些插件和扩展功能极大地提高了 Vue-Unity-WebGL 框架的可扩展性和灵活性,使得开发者可以更加容易地进行定制。 综上所述,Vue-Unity-WebGL 框架是一个快速、可靠且强大的解决方案,这使得开发者能够轻松地编写出高质量的 Unity3D web 应用程序。该框架具有大量的功能,实现可扩展性、灵活性、易用性和可维护性,比其他框架更具有竞争力。在未来的发展中,Vue-Unity-WebGL 框架将会被更多的开发者喜爱和应用,并在技术社区中拥有更广泛的影响力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值