DOCTYPE html>
<html>
<head>
<title>Vertex WebGL Tutorialtitle>
<style>
canvas {
display: block;
margin: 0 auto;
}
style>
head>
<body>
<canvas id="canvas">canvas>
<script>
// 获取canvas元素
const canvas = document.getElementById('canvas');
// 获取WebGL上下文
const gl = canvas.getContext('webgl');
// 顶点着色器代码
const vertexShaderSource = `
attribute vec3 aPosition;
varying vec3 vPosition;
void main() {
gl_Position = vec4(aPosition, 1.0);
vPosition = aPosition;
}
`;
// 片元着色器代码
const fragmentShaderSource = `
precision mediump float;
varying vec3 vPosition;
void main() {
vec3 color = vec3(0.5, 0.5, 1.0) + 0.5 * vPosition;
gl_FragColor = vec4(color, 1.0);
}
`;
// 创建顶点着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);
// 创建片元着色器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);
// 创建程序
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
// 创建顶点数据
const vertices = new Float32Array([
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0
]);
// 创建缓冲区
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
// 获取顶点属性位置
const aPosition = gl.getAttribLocation(program, 'aPosition');
gl.enableVertexAttribArray(aPosition);
gl.vertexAttribPointer(aPosition, , gl.FLOAT, false, , );
// 渲染函数
function render() {
gl.clearColor(0.2, 0.2, 0.2, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, , );
}
// 调用渲染函数
render();
script>
body>
html>
let angle = 0.0;
// 监听鼠标移动事件
canvas.addEventListener('mousemove', (event) => {
// 计算鼠标移动的距离
const deltaX = event.clientX - canvas.width / ;
const deltaY = event.clientY - canvas.height / ;
// 更新角度
angle = Math.atan2(deltaY, deltaX);
});
// 更新旋转矩阵
const rotationMatrix = mat4.create();
mat4.rotateZ(rotationMatrix, rotationMatrix, angle);
// 在顶点着色器中应用旋转矩阵
const uMatrix = gl.getUniformLocation(program, 'uMatrix');
gl.uniformMatrix4fv(uMatrix, false, rotationMatrix);
<input type="color" id="colorPicker">
// 获取颜色选择器元素
const colorPicker = document.getElementById('colorPicker');
// 监听颜色变化事件
colorPicker.addEventListener('input', (event) => {
// 获取颜色值
const color = event.target.value;
// 将颜色值转换为RGB格式
const r = parseInt(color.slice(, ), ) / 255.0;
const g = parseInt(color.slice(, ), ) / 255.0;
const b = parseInt(color.slice(, ), ) / 255.0;
// 更新片元着色器中的颜色值
const uColor = gl.getUniformLocation(program, 'uColor');
gl.uniform3f(uColor, r, g, b);
});
🔧 免费降低英文 AIGC 的网站操作指南:移动端适配工具推荐 英文 AIGC 内容虽然高效,但往往带着明显的 AI 痕迹,比如用词生硬、句式单一,在移动端阅读时还可能遇到排版混乱、适配性差的问题。
在公众号运营中,万次阅读单价是衡量收益的重要指标,而不同粉丝来源渠道对这一指标的影响不容小觑。接下来,我们将从多个方面深入分析这些影响,并提供实用的优化策略。 🌟 自然增长粉丝:高粘性带来高单价 自
做内容的都想写出爆文,可选题这关就难住不少人。到底怎么看一个选题能不能火?试试 “用户需求矩阵”,挺好用的。这东西不是凭空来的,是结合了上百个爆文案例总结出来的,从用户需求的几个核心维度去拆解,能帮你
📊 朱雀 AI 分析报告的核心构成模块第一次打开朱雀 AI 分析报告的人,多半会被密密麻麻的数据图表吓一跳。其实拆开来看,整个报告就分三个核心模块:基础检测数据、风险等级评估、优化建议清单。这三个模
现在打开搜索引擎,输入 “免费 AI 检测”,能跳出几十上百个平台。这些平台打着 “零成本检测 AI 生成内容” 的旗号,吸引了不少自媒体人、学生和职场人士。但你有没有想过,当你把辛辛苦苦写的文章、设
对于博士研究生来说,完成一篇合格的博士论文是毕业的关键。而论文查重,作为衡量论文原创性的重要手段,一直备受关注。其中,大家最常问的就是,博士论文查重率到底包不包括引用部分呢?📌 博士论文查重率是否
秘塔 AI 与笔灵 AI 都是当下热门的学术写作辅助工具,两者在功能设计、适用场景和用户体验上各有千秋。接下来就从核心功能、操作体验、内容质量、价格策略等方面展开深度对比,帮你找到最适合的学术写作搭档
? Namecheap 域名注册安全可靠性深度测评:透明价格与 WHOIS 隐私保护揭秘 在数字时代,域名注册是建立在线存在的第一步。Namecheap 作为全球知名的域名注册商,其安全可靠性和服务质