当前位置: 首页 > news >正文

WebGL 绘制圆点

前言

这篇文章不说WebGL相关概念了,初学者先到网上看看WebGL相关概念。这里着重写一下在vue3前端框架下,如何通过webGL绘制圆点。

着色器代码(画点)

画点相关的着色器代码有顶点着色器和片元着色器,代码如下:

顶点着色器:

const vertexShaderSrc = `void main() {gl_Position = vec4(0, 0, 0, 1.0);gl_PointSize = 20.0;}
`;

片元着色器:

const fragmentShaderSrc = `void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}
`;

初始化着色器

在网上找的一个通用的初始化着色器代码,如下所示:

function loadShader(gl, type, source) {//根据着色类型,建立着色器对象const shader = gl.createShader(type);//将着色器源文件传入着色器对象中gl.shaderSource(shader, source);//编译着色器对象gl.compileShader(shader);//返回着色器对象return shader;
}
export function initShaders(gl, vsSource, fsSource) {//创建程序对象const program = gl.createProgram();//建立着色对象const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource);const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);//把顶点着色对象装进程序对象中gl.attachShader(program, vertexShader);//把片元着色对象装进程序对象中gl.attachShader(program, fragmentShader);//连接webgl上下文对象和程序对象gl.linkProgram(program);//启动程序对象gl.useProgram(program);//将程序对象挂到上下文对象上gl.program = program;
}

代码中注释蛮详细的。

vue3框架使用webGL画点

这里直接贴上全部代码了,如下所示:

<template><div class="point-wrapper"><div style="margin-bottom: 20px">绘制点</div><canvas id="point" width="100" height="100"></canvas></div>
</template><script>
export default {name: "point",
};
</script><script setup>
import { onMounted } from "vue";
import { initShaders } from "@/utils/myGL.js";const vertexShaderSrc = `
void main() {gl_Position = vec4(0, 0, 0, 1.0);gl_PointSize = 20.0;
}
`;const fragmentShaderSrc = `
void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;const fragmentShaderSrcCircle = `
precision mediump float;
void main() {float d = distance(gl_PointCoord, vec2(0.5, 0.5));if(d < 0.5) {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);} else { discard; }
}
`;onMounted(() => {const canvas = document.getElementById("point");// webgl画笔const gl = canvas.getContext("webgl");// 初始化着色器initShaders(gl, vertexShaderSrc, fragmentShaderSrc);// 指定将要用来清理绘图区的颜色gl.clearColor(0.0, 0.0, 0.0, 1.0);// 清理绘图区gl.clear(gl.COLOR_BUFFER_BIT);// 绘制顶点gl.drawArrays(gl.POINTS, 0, 1);setTimeout(() => {initShaders(gl, vertexShaderSrc, fragmentShaderSrcCircle);// 指定将要用来清理绘图区的颜色gl.clearColor(0.0, 0.0, 0.0, 1.0);// 清理绘图区gl.clear(gl.COLOR_BUFFER_BIT);// 绘制顶点gl.drawArrays(gl.POINTS, 0, 1);}, 5000);
});
</script><style lang="scss" scoped>
.point-wrapper {width: 200px;height: 200px;background-color: gray;
}
</style>

myGL.js中放的是初始化着色器initShaders 接口。

大家可以拷贝代码运行一下,刚开始出现一个正方形点,5秒后变成圆点

http://www.lryc.cn/news/144315.html

相关文章:

  • 迅为RK3588开发板Android12 设置系统默认不锁屏
  • 香港服务器速度快的原因
  • 过滤器,监听器与拦截器的区别
  • clickhouse ssb-dbgen数据构造 及 clickhouse-benchmark简单压测
  • 【数据分析】统计量
  • 【通用消息通知服务】0x4 - 目前进展 阶段复盘
  • vue若依导出word文件,简单的实现
  • 【LeetCode75】第四十题 最大层内元素和
  • 脱离束缚:数字化工厂中ARM控制器的革命性应用!
  • queue ide is not exists in YARN
  • 【C++】UDP通信:客户端向服务端发送消息并接收服务端回应的消息
  • RabbitMq深度学习
  • EasyExcel自定义字段对象转换器支持转换实体和集合实体
  • Linux重置ROOT密码(CentOS)
  • 【Spring】一文带你彻底搞懂IOC、AOP
  • 国际旅游网络的大数据分析(数学建模练习题)
  • 音视频技术开发周刊 | 308
  • 多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验3
  • Redis之Sentinel(哨兵)机制
  • 加密的PDF文件,如何解密?
  • 【java】获取当前年份
  • 前端面试话术集锦第一篇
  • NeRFMeshing - 精确提取NeRF中的3D网格
  • 后端面试话术集锦第五篇:rabbitmq面试话术
  • Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【一】
  • vue3之reactive和ref学习篇
  • 【推荐】Spring与Mybatis集成整合
  • listdir, makedirs, shuffle, exists, webdriver.Chrome, roll方法快速查阅
  • java.nio.ByteBuffer 学习笔记
  • 自动化实时在线静电监控系统的构成