glsl着色器学习(九)屏幕像素空间和设置颜色

news2024/12/27 12:57:21

在上一篇文章中,使用的是裁剪空间进行绘制,这篇文章使用屏幕像素空间的坐标进行绘制。

上一篇的顶点着色器大概是这样子的

回归一下顶点着色的主要任务:

  •  通常情况下,顶点着色器会进行一系列的矩阵变换操作,将输入的顶点坐标从模型空间依次经过世界空间,视图空间,最终转换到裁剪空间。

将顶点着色器改成下面这样:

 <script id="vertex-shader-2d" type="x-shader/x-vertex">
      // 获取顶点
      attribute vec2 a_position;
      // 获取画布宽高
      uniform vec2 u_resolution;
      void main() {
        // 把像素坐标转换到0-1
        vec2 zeroToOne = a_position / u_resolution ;
        // 先转换成0-2 再减去1最终变成-1 - 1(裁剪空间)
        vec2 clipSpace = zeroToOne * 2.0 - 1.0;
        // 乘以vec2(1,-1)是将Y轴坐标交换
        gl_Position = vec4(clipSpace * vec2(1,-1),1.0,1.0);
      }
    </script>

 从着色器程序中获取u_resolution的位置

const resolutionUniformLocation = gl.getUniformLocation(program, 'u_resolution');

设置resolution值

gl.uniform2f(resolutionUniformLocation, gl.canvas.width, gl.canvas.height);

再改变一下postions三个顶点的值,因为绘制二维图形,所以只需要3组共6个顶点

  const positions = [200, 200, 250, 350, 350, 250];

运行Study.html。得到如图所示,如果改变颜色下面讲解

改变颜色:

改变颜色需要修改片元着色器

片段着色器主要作用:

  • 核心作用是为每个片元(预备像素)确定颜色。
<script id="fragment-shader-2d" type="x-shader/x-fragment">
      precision mediump float;
      // 定义一个统一变量的u_color,用来接收应用程序传递的四维向量颜色属性
      uniform vec4 u_color;
      void main() {
        gl_FragColor = u_color;
      }
 </script>

找到u_color在着色器程序中的位置

const colorUniformLocation = gl.getUniformLocation(program, 'u_color');

设置颜色值,这里才用随机值产生颜色R/G/B/A四个分量

gl.uniform4f(colorUniformLocation, Math.random(), Math.random(), Math.random(), Math.random());

运行Study.html,不出意外,每次刷新页面,都会出现不同的颜色。

撒花!!!

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

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

相关文章

凯伦股份助力胖东来打造一流商超项目

在当下快节奏的城市生活里头&#xff0c;很多线下零售业务都已经被网购平台所冲击或影响&#xff0c;但偏偏河南许昌市的“胖东来”超市&#xff0c;每天的客流量高达数万人&#xff0c;且供不应求&#xff0c;大众赞誉它为“商超行业的顶尖品牌”、“中国超市的标杆”、“河南…

【数学建模】2024数学建模国赛经验分享

文章目录 一、关于我二、我的数模历程三、经验总结&#xff1a; 一、关于我 我的CSDN主页&#xff1a;https://gxdxyl.blog.csdn.net/ 2020年7月&#xff08;大二结束的暑假&#xff09;开始在CSDN写作&#xff1a; 阿里云博客专家&#xff1a; 接触的领域挺多的&#xff…

【Linux】应用层自定义协议与序列化

一、应用层 我们程序员写的一个一个解决实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。在应用层中的协议也是最多的。 1.1 再次认识协议 协议是一种约定&#xff0c;是通信双方约定的一种数据结构。在之前写的UDP服务器和TCP服务器中&#xff0c;…

C++和Python混合编程——C++调用Python入门

大纲 代码结构初始化 Python 解释器获取 GIL为什么需要 GIL&#xff1f;GIL 的影响 导入 Python 模块并执行代码释放 GIL终止 Python 解释器 完整代码编译执行结果项目地址 在《C和Python混合编程——Python调用C入门》一文中&#xff0c;我们熟悉了Python调用C编译的动态库的方…

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道&#xff0c;一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针&#xff0c;方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …

算法-滑动窗口技巧

文章目录 基础理论介绍长度最小的子数组无重复字符的最长字串解法1 : 哈希表计数逐步缩进解法2 : 哈希表更新下标跳跃缩进 最小覆盖字串替换子串获得平衡字符串K个不同整数的子数组 基础理论介绍 1. 滑动窗口简介 : 滑动窗口其实就是维持了一段区间(l边界与r边界), 并且对于这…

C++:构造函数、析构函数

目录 一、类的默认成员函数 二、构造函数 构造函数的特点 三、析构函数 析构函数的特点 一、类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数&#xff0c;一个类&#xff0c;我们不写的情况下编译器会默认生成…

Unity(2022.3.41LTS) - 动画融合术

目录 一、动画融合的概念 二、动画融合的类型 三、动画融合的实现方法 1.简介 2.创建新的图层 3.创建遮罩 4.遮罩配置 5.预览效果 6.使用代码灵活控制 7.全部代码 四、动画融合的优化和注意事项 一、动画融合的概念 在 Unity 中&#xff0c;动画融合是一种强大的技…

安装 Let‘s Encrypt certbot 生成多个域名免费 https 证书实录(linux pip 方式)

本文记录了我在华为云 EulerOS linux 云主机使用 python pip 方式安装配置 Let’s Encrypt certbot, 并为我的网站的多个域名生成免费 https 证书的整个过程, 包括 python 环境配置, 下载 certbot 及 certbot-nginx, 一次性生成多个域名的证书及注意事项, 以及最后配置 certbot…

5G农业大数据中心顶层设计

1. 政策背景与规划 国家政策大力推动大数据发展和应用&#xff0c;特别是农业农村信息化发展规划&#xff0c;强调数字化在农业现代化中的关键作用。《数字农业农村发展规划&#xff08;2019-2025年&#xff09;》明确了农业农村数字化的重要性。 2. 国际农业大数据现状 美国…

超图iServer 11i在Java中调用REST接口点线面增删改查方法

一、引入iServer的Jar包 需要到iServer安装目录/webapps/iserver/WEB-INF/lib下寻找以下几个jar包&#xff0c;把它引入到项目里&#xff1a; iserver-all-*.jar service-model-*.jar rest-sdk-*.jar然后再引入几个maven依赖包&#xff1a; <dependency><groupId&g…

MyBaits 二级缓存原理

优质博文&#xff1a;IT-BLOG-CN 一级缓存原理 默认关闭&#xff0c;一般不建议使用。为什么不建议使用我们要清楚。 先给不建议使用的原因&#xff1a; MyBatis的二级缓存是和命名空间绑定的&#xff0c;所以通常情况下每一个Mapper映射文件都拥有自己的二级缓存&#xff0c;…

关于谷歌账号的三个“错误的”问题:谷歌有客服吗?登录不了的账号如何注销?登录不了的账号绑定的手机还能注册新账号吗?

这段时间GG账号服务收到很多朋友的反馈&#xff0c;其中有一些具有典型的问题&#xff0c;而且是错误的问题——主要是对谷歌账号或者谷歌账号使用的误解&#xff0c;从而浪费了时间&#xff0c;或者走了弯路&#xff0c;或者反复试错给账号带来了更大的风险。 今天就来给大家…

Spring 框架下 Redis 数据结构的全面解析

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家带来的是如何通过 Spring 来操作 Redis 中的常见数据结构 , 以及如何通过代码执行 Redis 中的原生命令 . 本专栏旨在为初学者提供一个全面的 Redis 学习路径&#xff0c;从基础概念到实际应用&#xff0c;…

【C++题解】1088 - 求两个数M和N的最大公约数

问题四&#xff1a;1088 - 求两个数M和N的最大公约数 类型&#xff1a;需要找规律的循环。 题目描述&#xff1a; 求两个正整整数 M 和 N 的最大公约数(M&#xff0c;N都在长整型范围内&#xff09; 输入&#xff1a; 输入一行&#xff0c;包括两个正整数。 输出&#xff…

Antv a-table 表格行/列合并,在合并后的td中使用插槽slot

【需求】 这次的表格需要实现行列合并&#xff0c;并且要在合并后的 td 中使用子组件或弹出弹窗&#xff0c;难点在于&#xff1a; 1. 根据提供的data&#xff0c;自行判断是否合并项的 getRowspan方法 2. customCell 、scopedSlots 冲突导致的子组件无法展示 &#xff08…

Cesium 实战 - 自定义纹理材质 - 流动线(精灵线)

Cesium 实战 - 自定义纹理材质 - 流动线(精灵线) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种动…

【YOLOv8系列】YOLOv8的GUI界面设计;在电脑本地实现YOLOv8的可视化交互界面设计(对摄像头的实时画面进行分类)

背景: 最近在研究YOLOv8的应用,并且已经在自己的笔记本环境中跑通了YOLOv8的检测和分类算法,训练、验证、预测等功能均已实现;也通过自己的数据集训练出了自己的模型(权重);且之前也做了一个webUI界面,对YOLOv8检测和分类的结果进行展示;但是如果在本地的GUI界面调用摄…

Python pip 更换镜像源

文章目录 1 概述1.1 默认镜像&#xff0c;速度慢&#xff0c;易报错1.2 常用国内镜像源 2 更改镜像源2.1 临时更改2.2 永久更改2.2.1 查看配置源及配置文件2.2.2 编辑 pip.ini2.2.3 配置后的效果 1 概述 1.1 默认镜像&#xff0c;速度慢&#xff0c;易报错 默认镜像&#xff…

导出硬盘所有文件名到txt文本文件——C#学习笔记

下面的示例演示如何使用递归遍历目录树。递归方法很简洁&#xff0c;但如果目录树很大且嵌套很深&#xff0c;则有可能会引起堆栈溢出异常。 对于所处理的特定异常以及在每个文件和文件夹上执行的特定操作&#xff0c;都只是作为示例提供。您应该修改此代码来满足自己特定的需…