WebGl学习使用attribute变量绘制一个水平移动的点

news2024/12/29 10:41:29

在WebGL编程中,attribute变量是一种特殊类型的变量,用于从客户端传递数据到顶点着色器。这些数据通常包括顶点的位置、颜色、纹理坐标等,它们是与每个顶点直接相关的信息。attribute变量在顶点着色器中声明,并且对于每个顶点来说都是独立的。

一、创建和使用attribute变量流程

  1. 在顶点着色器中声明attribute变量:attribute vec4 aPosition;

        // 顶点着色器源码
        const vertexShaderSource = `
        // attribute使用位置,只传递顶点着色器,不能在片元着色器中使用
        attribute vec4 aPosition;
    
        void main() {
            gl_Position = aPosition; 
            gl_PointSize = 30.0;
        }`
  2. 获取attribute变量的存储地址:gl.getAttribLocation(program, 'aPosition');

    const program = initShader(gl, vertexShaderSource, fragmentShaderSource)
    
    // 获取attribute变量,必须在initShader之后使用,因为会用到program这个程序对象
    // gl.getAttribLocation(program, name); 
    // 1.program:程序对象 
    // 2.name:指定想要获取存储地址的attribute变量的名称
    // 返回变量的存储地址
    
    const aPosition = gl.getAttribLocation(program, 'aPosition');
  3. 设置顶点属性的值:gl.vertexAttrib4f(location, v1, v2, v3,v4)  

    // gl.vertexAttrib4f(location, v1, v2, v3,v4)  
    // v1, v2, v3,v4 分别代表 X, y, Z, W
    // location:变量
    // v1:第一个分量的值
    // v2:第二个分量的值
    // v3:第三个分量的值
    // v4:第四个分量的值
    
    gl.vertexAttrib4f(aPosition, 0.5, 0.5, 0.0, 1.0)
    // gl.vertexAttrib3f(aPosition, 0.5, 0.5, 0.0)
    // gl.vertexAttrib2f(aPosition, 0.5, 0.5)
    // gl.vertexAttrib1f(aPosition, 0.5)
  4. 绘制一个水平移动的点

    // 绘制一个水平移动的点
    let x = 0;
    setInterval(() => {
        x += 0.1
        if (x > 1.0) {
            x = 0;
        }
        // 设置顶点的值
        gl.vertexAttrib1f(aPosition, x)
        // 绘制点
        gl.drawArrays(gl.POINTS, 0, 1);
    }, 200)

二、完整代码 

 1. html页面代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
    <title>webgl三维坐标系</title>
</head>

<body>
    <canvas id="canvas" width="400" height="400">
        此浏览器不支持canvas
    </canvas>

    <script src="./js/index.js"></script>
    <script>
        const ctx = document.getElementById('canvas')
        const gl = ctx.getContext('webgl')

        // 顶点着色器源码
        const vertexShaderSource = `
            // attribute使用位置,只传递顶点着色器,不能在片元着色器中使用
            attribute vec4 aPosition;

            void main() {
                gl_Position = aPosition; 
                gl_PointSize = 30.0;
            }`

        // 片源着色器源码
        const fragmentShaderSource = `
            void main() {
                gl_FragColor = vec4(0.0,0.0,0.0,1.0); // r, g, b, a
            }`

        // 设置着色器封装后,直接使用
        const program = initShader(gl, vertexShaderSource, fragmentShaderSource)
        const aPosition = gl.getAttribLocation(program, 'aPosition');

        // 绘制一个水平移动的点
        let x = 0;
        setInterval(() => {
            x += 0.1
            if (x > 1.0) {
                x = 0;
            }
            gl.vertexAttrib1f(aPosition, x)
            // 绘制点
            gl.drawArrays(gl.POINTS, 0, 1);
        }, 200)

    </script>
</body>

</html>

2. index.js文件中的initShader方法代码如下:

function initShader() {
    const vertexShader = gl.createShader(gl.VERTEX_SHADER);// 创建顶点着色器对象
    const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);// 创建片段着色器对象

    gl.shaderSource(vertexShader, vertexShaderSource);// 设置顶点着色器源代码
    gl.shaderSource(fragmentShader, fragmentShaderSource);// 设置片段着色器源代码

    gl.compileShader(vertexShader);// 编译顶点着色器
    gl.compileShader(fragmentShader);// 编译片段着色器

    // 创建一个程序对象
    const program = gl.createProgram();
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    gl.linkProgram(program);
    gl.useProgram(program);

    return program;
}

3. 效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构-5.4.二叉树的性质

一.二叉树的常考性质&#xff1a; 常见考点1&#xff1a;结点个数的性质 设非空二叉树(度最大为2,最小为0)当中度为0的结点个数为a&#xff0c;度为1的结点个数为b&#xff0c;度为2的结点个数为c&#xff0c;那么abc&#xff1a; 推导过程&#xff1a;设该非空二叉树共有n个…

Go基础知识:切片

数组 Go 数组的大小是固定的&#xff0c;其长度是其类型的一部分&#xff08;[4]int并且[5]int是不同的、不兼容的类型&#xff09; var a [10]intb : [2]string{"Penn", "Teller"} b : [...]string{"Penn", "Teller"}package maini…

计算机专业大一课程:线性代数探秘

计算机专业大一课程&#xff1a;线性代数探秘 对于计算机专业的大一新生来说&#xff0c;线性代数是一门基础且重要的课程。它不仅是数学的一个分支&#xff0c;更是计算机科学中不可或缺的工具。那么&#xff0c;线性代数究竟包含哪些内容&#xff0c;对我们的计算机学习有何…

操作系统(1) (进程属性/内存映像/进程状态/PCB/上下文切换)

目录 1. 进程及其实现 2. 没有进程概念之前的系统 3. 进程的属性 4. 进程的内存映像 5. 进程状态及其转换 6. 进程描述与操作控制结构 操作控制结构&#xff1a; 操作系统使用数据结构来记录进程和系统资源的状态&#xff1a; 进程控制块&#xff08;PCB&#xff09;&a…

libmodbus编程应用(超详细源码讲解)

目录 前言 libmodbus开发库 1.功能概要 2.源码获取 3.libmodbus与应用程序的关系 libmodbus源代码解析 1.核心函数 2.框架分析与数据结构 3.情景分析 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;主设备发送请求 &#xff08;3&#xff09;主/从设备…

【Adobe PR】Adobe Premiere Pro 快捷键介绍

Adobe Premiere Pro (简称PR) 是一款广泛使用的视频编辑软件&#xff0c;熟练掌握其快捷键可以显著提高编辑效率。下面是整理的一些常用的Adobe Premiere Pro快捷键&#xff0c;适用于Windows和Mac操作系统。对于Mac用户&#xff0c;除非特别指出&#xff0c;通常可以将Ctrl键替…

视频画面变糊是平台在做手脚吗?

人气视频博主“影视飓风”一条新发布的视频被全网下架&#xff0c;这两日更是引起轩然大波&#xff0c;不仅频上热门&#xff0c;甚至还有不少数码与视频同行为其抱不平。那么影视飓风到底发布了一条什么视频&#xff1f;又为何会惨被全网下架呢&#xff1f; 10月8日&#xff0…

Android Studio Ladybug使用经典主题UI

背景 Android Studio Ladybug | 2024.2.1 默认使用new ui&#xff0c;但是已经找不到之前经典主题了。 通过插件方式设置经典主题 打开设置。Plugins。 在Marketplace中搜索&#xff1a;Classic UI 下面的截图是我已经安装完成的。 插件安装完成了&#xff0c;重启as即可。…

闭着眼学机器学习——K近邻分类

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 1. 算法介绍 K近邻(K-Nearest Neighbors, KNN…

ScriptableObject基本使用

使用方法 自定义类继承ScriptableObject 可以在类内部增加数据或者数据类&#xff0c;一般用于配置 注意事项 给继承ScriptableObject的类增加CreateAssetMenu特性。 CreateAssetMenu一般默认三个参数 第一个参数是父目录 第二个参数是父目录的子选项 第三个参数是可以…

虚幻闪烁灯光材质

创建一个材质 材质域改成光照函数 , Time让材质动起来 参数B用来控制速度 , Sine 让灯光闪烁 , Frac 增加了闪烁细节 把材质放到灯光材质上 效果还是挺不错的! 可以用于一些恐怖游戏~

FileZilla的简单使用

FileZilla的下载与安装以及简单使用&#xff08;有图解超简单&#xff09;-CSDN博客 参考这篇文章。 我在Window下安装了客户端&#xff0c;在虚拟机下启动Ubuntu&#xff0c;启用了Ubuntu的FTP服务。 按照该文章的流程进行下去&#xff0c;成功的把客户端上的文件上传到了F…

STM32学习--6-1 定时器定时中断

定时器电路图 第一步&#xff1a;RCC开启时钟&#xff0c;基本上每个代码都是第一步 第二步&#xff1a;选择时基单元的时钟源&#xff08;内部时钟&#xff09; 第三步&#xff1a;配置时基单元&#xff0c;包括预分频器、自动重装器、计数模式等&#xff0c;通过结构体配置…

Dockerfile(Jenkins)

1.创建⼀个jenkins的Dockerfile mkdir tomcat cd tomcat 2、上传需要的安装包 apache-tomcat-8.5.47.tar.gz jdk-8u211-linux-x64.tar.gz jenkins.war 3、编写Dockerfile vim Dockerfile # This my first jenkins Dockerfile # Version 1.0 FROM centos:7 MAINTAINER l…

Echarts+vue3+高德渲染地图

Echartsvue3高德渲染地图 一&#xff1a;安装 npm install echarts二&#xff1a;渲染地图 1. html <template><div class"content"><div ref"myChartsRef" id"map" style"width: 100%;height: 560px;" ></d…

JAVA自动化测试TestNG框架

1.TestNG简介 JAVA自动化测试最重要的基石。官网&#xff1a;https://testng.org 使用注解来管理我们的测试用例。 发现测试用例 执行测试用例 判断测试用例 生成测试报告 2.创建Maven工程 2.1创建一个maven工程 2.2设置maven信息 2.3设置JDK信息 2.4引入testng依赖 <dep…

Linux下Docker方式Jenkins安装和配置

一、下载&安装 Jenkins官方Docker仓库地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到&#xff0c;当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的&#xff0c;后面依赖下不来 所以&#xff0c;我们这里&#xff0c;执行doc…

达梦数据库性能优化

1、SQL执行计划 拿到一条SQL的时候&#xff0c;首先要下达梦手册中提出的有效SQL规范&#xff0c;及是否命中了特殊OR子句的不规范&#xff0c;是否用了复杂的正则表达式&#xff0c;避免重复很高的索引&#xff0c;UINON ALL 是否可以替换UNION操作等,某些场景INSTR函数导致的…

FunASR离线文件转写服务开发指南-debian-10.13

FunASR离线文件转写服务开发指南-debian-10.13 服务器环境 debian10.13 64位 第一步 配置静态网卡 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4/etc/init.d/networking restart第…

C++面试速通宝典——25

473. HTTP如何减少重定向请求 重定向请求&#xff1a; ‌‌‌‌  服务器上的一个资源可能由于迁移、维护等原因从url1移至url2后&#xff0c;而客户端不知情&#xff0c;他还是继续请求url1&#xff0c;这时服务器不能粗暴地返回错误&#xff0c;而是通过302响应码和Locati…