WebGL系列教程四(绘制彩色三角形)

news2024/11/15 11:21:24

目录

  • 1 前言
  • 2 varying变量介绍
  • 3 开始绘制
    • 3.1 声明顶点着色器
    • 3.2 声明片元着色器
    • 3.3 创建顶点和颜色的缓冲区
    • 3.4 指定变量从缓冲区获取值
    • 3.5 效果
    • 3.6 varying的内涵
    • 3.7 完整代码
  • 4 总结

1 前言

  上一篇中我们介绍了如何使用缓冲区来绘制三角形,这一篇我们来讲讲如何给三角形着色,绘制一个彩色的三角形。

2 varying变量介绍

  WebGL中的varying变量负责将值从顶点着色器传递到片元着色器中。假设我们有个三角形,没错,还是前两篇使用的那个三角形,它的颜色如下图所示:
在这里插入图片描述
  现在我们要给这个三角形着色,我们只需要把这个顶点的颜色从顶点着色器中传递到片元着色器中,WebGL就会自动帮我们把三角形中间的颜色给插值出来。

3 开始绘制

  通过前几篇我们已经熟悉了WebGL基本的使用方式,只需要将上一篇中的代码稍加改动,就可以达成我们这篇的要求了。现在还是让我们来回顾一下上一篇中WebGL中的绘制流程并稍作改动,增加第8步给三角形着色:

  1. 创建着色器对象
  2. 获取着色器对象的源代码
  3. 绑定着色器的源
  4. 编译着色器
  5. 创建并关联项目
  6. 创建并绑定缓冲区
  7. 读取缓冲区数据并绘制三角形
  8. 三角形着色

3.1 声明顶点着色器

  前面的6步我们已经很熟悉了,我们先来看顶点着色器的声明,新增了一个aColor和一个vColoraColor用来存储我们指定的颜色,vColor用来存储要从顶点着色器传递到片元着色器的颜色。

<script id="vertex-shader" type="x-shader/x-vertex">
    attribute vec2 aPos;//顶点坐标
    attribute vec4 aColor;//颜色
    varying vec4 vColor;//要向片元着色器传递的颜色
    void main(){
        gl_Position = vec4(aPos,0.0,1.0);//补齐坐标为4维向量
        vColor = aColor;//把我们的颜色直接赋值给要向片元着色器传递的颜色
    }
</script>

3.2 声明片元着色器

  片元着色中也声明了一个vColor注意: 一定要和顶点着色器中的声明方式一模一样,这样才能自动接收从顶点着色器传递到片元着色器的颜色。

<script id="fragment-shader" type="x-shader/x-fragment">
   precision highp float;
   varying vec4 vColor;
   void main(){
       gl_FragColor = vColor;
   }
</script>

3.3 创建顶点和颜色的缓冲区

  先回顾上一篇中我们是怎么声明顶点的坐标的,我们用了一个数组来存储顶点的坐标

const vertices = new Float32Array([
     0.0,1.0,    
     -0.5,0.0,
     0.5,0.0,
 ]);

  那么现在我们只需要在顶点坐标的后面加上对应的颜色,RGBA形式的表示即可。如:

const vertices = new Float32Array([
    -0.5,0.0,   1.0,0.0,0.0,1.0,//第一个点坐标 红色
    0.0,1.0,    0.0,1.0,0.0,1.0,//第二个点坐标 绿色
    0.5,0.0,    0.0,0.0,1.0,1.0//第三个点坐标 蓝色
]);

  绑定还是老样子:

const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);

3.4 指定变量从缓冲区获取值

  因为我们在顶点着色器中声明了两个变量,aPosaColor,那么我们获取的时候,也要获取两次

let aPos = gl.getAttribLocation(program,"aPos");
let aColor = gl.getAttribLocation(program,"aColor");

  然后分别指定取值的方式

let length = Float32Array.BYTES_PER_ELEMENT;//数组中单个元素的字节长度
//指定aPos如何读取缓冲区   前 2 个值表示坐标,float类型,不使用归一化,6个值表示一个点的信息,从偏移0倍字节开始读
gl.vertexAttribPointer(aPos,2,gl.FLOAT,false,6*length,0);
gl.enableVertexAttribArray(aPos);
//指定aColor如何读取缓冲区  后 4 个值表示颜色,float类型,不使用归一化,6个值表示一个点的信息,从偏移2倍字节开始读
gl.vertexAttribPointer(aColor,4,gl.FLOAT,false,6*length,2*length);
gl.enableVertexAttribArray(aColor);
//绘制三角形,从零号索引开始,绘制三个点
gl.drawArrays(gl.TRIANGLES,0,3);

3.5 效果

在这里插入图片描述

3.6 varying的内涵

  如上图所示,三角形的三个顶点就是我们指定的颜色,中间的颜色是WebGL自动帮我们插值出来的。还记得片元着色器中的颜色值是怎么声明的吗?没错varying vec4 vColor;,varying翻译过来的意思是可变化的,所以这个量就叫做可变量。而它真正表示的意思是:这个片元着色器/片段着色器,它本质上是逐像素绘制的,而每一个像素的颜色都是可变化的,不是固定值,虽然从顶点传递时,传了一个固定值,但实际使用时,用的是WebGL帮我们自动插值出来的值,是一个变化了的值,所以叫它做可变量。

3.7 完整代码

const vertices = new Float32Array([
    -0.5,0.0,1.0,0.0,0.0,1.0,//第一个点坐标 颜色
    0.0,1.0,0.0,1.0,0.0,1.0,//第二个点坐标 颜色
    0.5,0.0,0.0,0.0,1.0,1.0//第三个点坐标 颜色
]);
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
let aPos = gl.getAttribLocation(program,"aPos");
let aColor = gl.getAttribLocation(program,"aColor");
//绑定坐标
//指定aPos如何读取缓冲区   前 2 个值表示坐标,float类型,不使用归一化,6个值表示一个点的信息,从偏移0倍字节开始读
gl.vertexAttribPointer(aPos,2,gl.FLOAT,false,6*Float32Array.BYTES_PER_ELEMENT,0);
gl.enableVertexAttribArray(aPos);
//绑定颜色
//指定aColor如何读取缓冲区  后 4 个值表示颜色,float类型,不使用归一化,6个值表示一个点的信息,从偏移2倍字节开始读
gl.vertexAttribPointer(aColor,4,gl.FLOAT,false,6*Float32Array.BYTES_PER_ELEMENT,2*Float32Array.BYTES_PER_ELEMENT);
gl.enableVertexAttribArray(aColor);
//绘制三角形,从零开始,绘制三个点
gl.drawArrays(gl.TRIANGLES,0,3);

4 总结

  本篇我们通过指定三角形的三个顶点的颜色,绘制出了一个彩色的三角形,并梳理了整个程序的流程,了解了varying变量的内涵,这对我们理解后续的知识很重要,希望读者仔细揣摩,下期见。

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

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

相关文章

《PneumoLLM:利用大型语言模型的力量进行尘肺病诊断》|文献速递--基于深度学习的医学影像病灶分割

Title 题目 PneumoLLM: Harnessing the power of large language model for pneumoconiosis diagnosis 《PneumoLLM&#xff1a;利用大型语言模型的力量进行尘肺病诊断》 01 文献速递介绍 在计算机辅助诊断领域&#xff0c;对医学数据的处理和分析能力至关重要。这不仅有助…

【教师节视频制作】飞机降落飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

教师节祝福视频制作教程飞机降落飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【教师节视频制作】飞机降落飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件 把AE模板导入AE软件 …

紫色UI趣味测试小程序源码,包含多种评测

紫色UI趣味测试小程序源码&#xff0c;包含多种评测。 该源码里面包含了多种评测,每一种评测都包含大多小细节。 代码下载

springboot网上租房系统---附源码79833

摘 要 如今&#xff0c;房屋作为人类生活的重要场所&#xff0c;在城市中扮演着至关重要的角色。随着城市化进程的加速和流动人口的增多&#xff0c;房屋租赁产业迎来了巨大的发展机遇。然而&#xff0c;在房屋租赁过程中存在着许多繁琐的手续和信息搜索的问题&#xff0c;需要…

抖音电商商品采集接口api 店铺商品列表sku返回值

如今&#xff0c;抖音已经成为国民最受欢迎的APP。因为抖音的存在&#xff0c;我们的生活开始变得更加有趣&#xff0c;同时&#xff0c;抖音带货&#xff0c;抖音duan等等呼之欲出&#xff0c;越来越多的人开始加入到抖音大战中去。在抖音进行带货或者进行短视频创作&#xff…

骨传导耳机哪个牌子值得买?推荐五款表现出色的骨传导耳机!

随着骨传导耳机技术的不断发展&#xff0c;市场呈现出多元化的趋势&#xff0c;但这也使得消费者在挑选时面临更多挑战&#xff0c;特别是如何避免因选择不当而引发的听力问题。目前市场上&#xff0c;部分由非专业厂商或网红快速推出的产品&#xff0c;因技术积累不足、材料选…

巅峰对决:南卡、韶音、墨觉旗舰级骨传导耳机深度评测与全面对比!

在如今的骨传导耳机市场&#xff0c;有许多新手小白想入手骨传导耳机&#xff0c;但是又非常怕自己踩雷。所以就疯狂在网上查攻略等等&#xff0c;也有很多小伙伴来询问我&#xff0c;在现在骨传导耳机市场上热门的南卡、韶音、墨觉哪款比较值得入手啊&#xff1f;那么今天&…

Unity Apple Vision Pro 开发(六):MR 物体交互

XR 开发者社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程分为上、中、下三个部分&#xff0c;上为公开部分&#xff0c;中和下仅社区可见&#xff0c;需要通过文章开头的链接加入社区。 【上】&#xff08;理…

聚鼎科技:现在做装饰画是靠谱的吗

在生活的各个角落&#xff0c;艺术以多种形式存在着&#xff0c;而装饰画作为其中的一种&#xff0c;一直以其独特的魅力填充着我们的世界。但在这个快速变化的时代&#xff0c;许多人会问&#xff1a;现在做装饰画还是一个靠谱的选择吗? 装饰画的市场依旧充满生机。随着人们对…

docker 复制容器

在 Docker 中复制容器本身并不是直接支持的操作&#xff0c;但你可以通过以下方法来实现类似的效果&#xff1a; 1.将已有的容器提交为镜像 2.以该镜像创建容器 3.开启容器&#xff0c;进入容器内部 一. 使用 Docker 镜像复制容器 首先&#xff0c;你可以将容器的状态保存…

dropdown源码分析 -- ant-design-vue系列

组件结构 dropdown 组件对参数做了一些处理&#xff0c;然后直接调用了vc-trigger组件来进行渲染&#xff0c;先看一下整体的组件调用结构。 极简实现 这个组件需要满足以下几个基本的功能&#xff1a; 可以传入两个插槽 default 和 popup&#xff0c;default 是默认展示的节…

react js 处理表单( form )的2个例子

起因&#xff0c; 目的: 表单其实&#xff0c;有点复杂&#xff0c;因为涉及事件&#xff0c;event. 不熟悉的代码&#xff0c;还是尽量手写&#xff0c;不然的话&#xff0c;AI 生成的东西&#xff0c;自己看不懂。 例1 普通&#xff0c; 直接的方法 一个输入框&#xff0c…

微信小程序中数值计算的精度丢失问题

在微信小程序中&#xff0c;当你遇到数值计算的精度丢失问题时&#xff0c;主要是因为 JavaScript 在处理浮点数时存在固有的精度问题。这是因为计算机内部使用二进制形式存储数字&#xff0c;而某些十进制小数在二进制中无法精确表示&#xff0c;从而导致了精度误差。解决这个…

FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑

在FastAPI框架中&#xff0c;Depends是一个关键的功能&#xff0c;它允许开发者通过依赖注入来管理和重用代码。这在处理API的分页和过滤逻辑时尤其有用&#xff0c;因为它可以将这些逻辑抽象化&#xff0c;从而减少冗余代码并提高效率。 通过Depends&#xff0c;我们可以定义…

优质设计素材网站推荐,助力创意设计

在设计工作中&#xff0c;优质的设计素材能够极大提升作品的质量和效率。无论是图标、插画、字体&#xff0c;还是配色方案&#xff0c;一个强大的素材库可以为设计师的创作提供无限的可能性。然而&#xff0c;面对互联网中海量的设计资源&#xff0c;找到适合自己需求的网站并…

Vue+SpringBoot+数据库整体开发流程 1

本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查&#xff0c;以及响应给前端的url&#xff0c;让前端获得数据。 目录 一、简单搭建一个Vue项目 检查node.js版本 使用vue-cli创建空项目 Vue-cli工程中每个文件夹和文件的用处 二、Mysql数据库 创建数…

全网最全的软件测试面试题(含文档)

1、你以前工作时的测试流程是什么&#xff1f; 参考答案&#xff1a;&#xff08;灵活回答&#xff09; 公司对测试流程没有规定如何做&#xff0c;但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正&#xff08;自己总结&#xff0c;吸取同行的方法&#xff09;…

7.测试用例设计方法 + Bug

一、正交实验法 1.使用场景 因果关系比较庞大的情况下&#xff0c;不太适合用因果图判定表&#xff0c;在这种情况下&#xff0c;一般会采用正交实验法。 2.例子&#xff1a; 字符属性设置&#xff08;4个条件&#xff09; 字体很多 字符样式很多 …

高颜值官网(2):12个小家电网站UI,这是火辣辣的美呀。

小家电网站的设计应该注重简洁、清晰和易用。以下是一些设计建议&#xff1a; 1. 清晰的导航&#xff1a;网站应该有清晰的导航菜单&#xff0c;让用户能够轻松找到他们需要的产品或信息。 2. 产品展示&#xff1a;网站应该有清晰的产品展示页面&#xff0c;包括高质量的产品…

Spring Boot 框架下的房屋租赁业务创新

第2章 技术介绍 2.1 相关技术 房屋租赁系统是在JSP MySQL开发环境的基础上开发的。JSP是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的JSP驱动的互联网站点使用JSP。MySQL是一个数据库管理系统&#xff0c;因为它的体积小但…