OpenGL Metal Shader 编程:ShaderToy 内置全局变量

news2024/11/18 7:50:18

OpenGL & Metal Shader 编程:ShaderToy 内置全局变量

前面发了一些关于 Shader 编程的文章,有读者反馈太碎片化了,希望这里能整理出来一个系列,方便系统的学习一下 Shader 编程。

由于主流的 Shader 编程网站,如 ShaderToy, gl-transitions 都是基于 GLSL 开发 Shader ,加上 MSL 和 GLSL 语法上差别不大,后面系列文章将以 GLSL 为主来介绍 Shader 编程。

后面 Shader 编程将使用 VSCode + ShaderToy 插件作为编程环境,步骤如下:

  1. 下载安装 VSCode https://code.visualstudio.com/download;

  2. 安装 ShaderToy 插件;
    shaderToy.png

  3. 新建以 .frag 为后缀名的文件,复制粘贴本文的代码;

  4. 当前代码,点击鼠标右键,选择 ShaderToy:Show GLSL Preview , 然后就可以愉快地调试特效了。

ShaderToy 常用的内置全局变量

内置全局变量.png

在 ShaderToy 中,有一些内置的全局变量可以在着色器代码中使用。这些变量包括:

  1. vec2 iResolution:屏幕分辨率(宽度和高度)的像素值,与视口尺寸相关。
  2. float iTime:当前时间(以秒为单位),从着色器加载后开始计时,比较常用。
  3. float iTimeDelta:自上一帧到当前帧的时间间隔(以秒为单位)。
  4. int iFrame:当前帧的帧数。
  5. float iChannelTime[4]:各个纹理通道的时间(以秒为单位)。通道0对应sampler2D iChannel0,通道1对应sampler2D iChannel1,以此类推。
  6. vec3 iChannelResolution[4]:各个纹理通道的分辨率(宽度、高度和深度)。通道0对应sampler2D iChannel0,通道1对应sampler2D iChannel1,以此类推。
  7. samplerXX iChannel0samplerXX iChannel1samplerXX iChannel2samplerXX iChannel3:纹理通道,其中XX表示纹理的类型(如sampler2D表示二维纹理)。
  8. iMouse:用于获取鼠标的位置和状态信息。它是一个包含四个分量的vec4类型变量,分别表示鼠标的坐标(x 和 y 分量)以及左右键的按下状态(z 和 w 分量)。

这些内置全局变量可以在 ShaderToy 的着色器代码中使用,以控制着色器的行为和效果。

你可以使用它们来创建基于时间的动画、响应屏幕分辨率的效果等等。请注意,纹理通道(iChannel0iChannel3)需要通过输入纹理数据进行初始化。

一些内置全局变量的用法

iTime 当前时间(以秒为单位),从着色器加载后开始计时。
ITime.gif

使用 iTime 变量实现一个移动的正弦曲线(plot 函数原理后面文章会讲,目前暂不展开)。

float plot(vec2 st, float pct) {
    return smoothstep(pct-0.01, pct, st.y) - smoothstep(pct, pct + 0.01, st.y);
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;

    float y = sin((uv.x + iTime)*5.0) * 0.5 + 0.5;
    float val = plot(uv, y);
    
    vec4 color = vec4(val, 0.0, 0.0, 1.0);

    // Output to screen
    fragColor = color;
}

iChannelX 纹理通道的使用,texture2D 函数对纹理进行采样。
纹理通道.png

这里我们直接给一个图片的链接。

#iChannel0 "https://img-baofun.zhhainiao.com/pcwallpaper_ugc_mobile/static/2ddf8479959f1f3d9f52d0d561d281fe.jpg"

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;

    fragColor = texture2D(iChannel0, uv);
}

iMouse 使用

在 ShaderToy 中,iMouse是一个内置的全局变量,它提供了鼠标的当前位置信息。

iMouse是一个vec4类型的变量,包含了以下四个分量:

iMouse.x:鼠标当前位置的x坐标(以像素为单位)。
iMouse.y:鼠标当前位置的y坐标(以像素为单位)。
iMouse.z:鼠标按下的按钮(左键:1.0,右键:2.0,中键:3.0)。
iMouse.w:鼠标的点击状态(按下:1.0,释放:0.0)。

你可以在 ShaderToy 的片段着色器中使用 iMouse 来根据鼠标位置或点击状态进行交互操作。以下是一个简单的示例:

//使用鼠标位置来改变颜色
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    // 获取鼠标在屏幕上的归一化坐标
    vec2 mousePos = iMouse.xy / iResolution.xy;
    
    // 使用鼠标位置来改变颜色
    vec3 color = vec3(mousePos.x, mousePos.y, 0.5);
    
    // 将颜色输出到片元
    fragColor = vec4(color, 1.0);
}
//鼠标点击变换颜色 
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    vec2 mousePos = iMouse.xy;
    float mouseClick = iMouse.w;
    
    // 在鼠标位置附近绘制一个圆形
    float dist = length(fragCoord - mousePos);
    float radius = 50.0;
    vec3 color = vec3(0.0);
    
    if (dist < radius)
    {
        // 如果鼠标按下,则绘制红色圆形
        if (mouseClick > 0.0)
            color = vec3(1.0, 0.0, 0.0);
        else
            color = vec3(0.0, 1.0, 0.0); // 否则绘制绿色圆形
    }
    
    fragColor = vec4(color, 1.0);
}

iMouseiChannel0 结合使用制作一个简单的"手电筒"特效。

iMouse.gif

(length 为内置函数用于计算向量的长度或标量的绝对值,后面会细讲)。

#iChannel0 "https://img-baofun.zhhainiao.com/pcwallpaper_ugc_mobile/static/2ddf8479959f1f3d9f52d0d561d281fe.jpg"

void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    vec2 uv = fragCoord / iResolution.xy;
    vec2 mousePos = iMouse.xy;
    float mouseClick = iMouse.w;
    
    // 在鼠标位置附近绘制一个圆形
    float dist = length(fragCoord - mousePos);
    float radius = iResolution.x / 2.0;
    vec3 color = vec3(0.0);
    
    if (dist < radius)
    {
        // 如果鼠标按下,则绘制黄色圆形
        if (mouseClick > 0.0)
            color = vec3(1.0, 1.0, 0.0);
        else
        // 否则绘制白色圆形
            color = vec3(1.0, 1.0, 1.0); 
    }
    
    //只显示圆形区域内的纹理
    fragColor = texture2D(iChannel0, uv) * vec4(color, 1.0);
}

后续安排

后面 OpenGL & Metal Shader 编程系列文章大致安排:

  1. ShaderToy 内置全局变量
  2. 重要的内置函数
  3. 基本图形
  4. 距离场
  5. 噪声函数
  6. 基础特效…
  7. 转场特效…
  8. 高阶特效…

技术交流

技术交流/获取视频教程可以添加我的微信:Byte-Flow

联系我

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

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

相关文章

Dart - 语法糖(持续更新)

文章目录 前言开发环境中间表示语法糖1. 操作符/运算符&#xff08;?./??/??/../?../.../...?&#xff09;2. 循环&#xff08;for-in&#xff09;3. 函数/方法&#xff08;>&#xff09;4. 关键字&#xff08;await for&#xff09; 最后 前言 通过将dill文件序列化…

【时间序列预测 2023 ICLR】TimesNet

【时间序列预测 2023 ICLR】TimesNet 论文题目&#xff1a;TIMESNET: TEMPORAL 2D-VARIATION MODELING FOR GENERAL TIME SERIES ANALYSIS 中文题目&#xff1a;TimesNet:用于一般时间序列分析的时态二维变异建模 论文链接&#xff1a;https://arxiv.org/abs/2210.02186 论文代…

大专同事一个人7天完成CRM系统开发,怪不得月薪3w

在当今的快节奏商业环境中&#xff0c;成功的关键是敏捷和高效。这使得开发自己的客户关系管理系统&#xff08;CRM&#xff09;成为许多企业的迫切需求。CRM有助于跟踪和优化销售线索&#xff0c;管理客户交互&#xff0c;并提高业务效率。但是&#xff0c;对于许多企业来说&a…

大学毕业后,我就去当了2个月外卖骑手,哭了一整晚

先简单介绍一下自己&#xff0c;我来自长沙&#xff0c;大学学的的物流管理专业&#xff0c;现在就职于一家互联网公司&#xff0c;从事软件测试工作。 我来自长沙县的一个偏远农村&#xff0c;家里兄弟姐妹多&#xff0c;父母无力负担我的学费&#xff0c;很多时候学费都是靠姐…

智慧工厂4G+蓝牙+UWB+RTK人员定位系统解决方案

人员定位在智慧工厂的应用正逐渐受到重视&#xff0c;通过使用现代化的技术和智能终端设备&#xff0c;工厂管理者能够实时定位和跟踪员工的位置&#xff0c;方便进行人员调度管理和监督人员的工作情况&#xff1b;人员遇到紧急情况&#xff0c;可通过定位设备一键报警求救&…

智慧消防:如何基于视频与智能分析技术搭建可视化风险预警平台?

一、背景分析 消防安全是一个重要的话题&#xff0c;涉及到每个人的生活和安全。每年都会发生大量的火灾&#xff0c;给人们带来极大的危害&#xff0c;摧毁了大量的财产&#xff0c;甚至造成了可怕的人员伤亡。而消防安全监督管理部门人员有限&#xff0c;消防安全监管缺乏有…

2.2 模型与材质基础

一、渲染管线与模型基础 1. 渲染管线 可编程阶段&#xff08;蓝色区域&#xff09;&#xff1a; 1顶点着色器 2几何着色器 3片元着色器 2. 模型的实现原理 UV&#xff1a;在建模软件中&#xff0c;进行UV展开&#xff0c;UV会放在一个横向为U纵向为V&#xff0c;范围&#xff0…

TEE GP(Global Platform)功能认证实验室

TEE之GP(Global Platform)认证汇总 GP认证实验室主要面向功能认证、SE安全认证、TEE安全认证&#xff0c;对于TEE来说&#xff0c;则分为TEE功能认证和TEE安全认证。本文对功能认证相关实验室机构进行总结和介绍。 一、国内3家 二、国外3家 参考&#xff1a; GlobalPlatform …

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLA…

安全杂记 - js中的this关键字

javascript里什么是this this是js中的一个关键字&#xff0c;它是函数在运行时生成的一个内部对象&#xff0c;是属性和方法。 this就是属性或方法“当前”所在的对象&#xff0c;也就是调用函数的那个对象 this的使用场合 1.函数调用 <script>var a100;function test…

jenkins部署vue项目

文章目录 1 先安装node.js上传到linux并解压 jenkins 创建任务执行脚本 build Stepsvue jenkins shell 脚本 (jenkins-web.sh)启动 如何在linux上安装jenkins可以看上一篇 linux安装jenkins(详细步骤) 1 先安装node.js 建议最好跟你本地安装版本一致,减少没有必要的麻烦:node.…

UCloud上线可商用LLaMA2镜像,助力AGI应用发展

随着人工智能技术的快速发展&#xff0c;大模型应用在自然语言处理、图像识别、智能交互等领域展现出了巨大的潜力&#xff0c;为企业带来了更多创新和商机。众多企业纷纷将大模型应用于产品开发和业务优化中&#xff0c;希望通过提升智能化水平和用户体验来赢得竞争优势。近日…

【黑马头条之文章详情-静态文件生成】

本笔记内容为黑马头条项目的文章详情-静态文件生成部分 目录 一、思路分析 二、实现步骤 基础知识可参考下面两篇文章 【黑马头条之对象存储服务MinIO】_蛋饼吧的博客-CSDN博客 【黑马头条之freemarker入门】_蛋饼吧的博客-CSDN博客 一、思路分析 文章端创建app相关文章时…

如何获得SOLIDWORKS全认证资格证书!

SolidWorks认证考试 完成SolidWorks认证考试并获得专业SolidWorks认证是一项伟大的成就。它不仅在你的简历上自豪地闪耀&#xff0c;而且还向雇主、决策者和同事展示了你对软件的技能和知识水平。公司通常会将某些策略和标准设定为一项业务&#xff0c;以帮助保持在竞争中的领头…

桃子叶片病害数据集

1.分为三类 健康的桃子叶片 &#xff0c;251张 桃疮痂病一般&#xff0c;857张 桃疮痂病严重&#xff0c;770 张 数据集链接 import os import jsonimport torch from PIL import Image from torchvision import transforms import tkinter as tk from tkinter import file…

MySQL 日志管理

目录 一、四种日志介绍 1.1 错误日志 1.2 通用查询日志 1.3 二进制日志 1.4 慢查询日志 三、查询日志是否已开启 四、分割二进制日志 MySQL的日志默认保存在数据库文件的存储目录&#xff08;一般为/usr/local/mysql/data/&#xff09;。也可以修改配置文件&#xff0c;…

低代码可视化开发,是时候去学一学了!

低代码一词&#xff0c;有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;也有人认为它是企业管理模式的变革……有很多声音&#xff0c;社区讨论很热烈。 即使这样&#xff0c;至今也有不少人还不知道这项技术&#xff0c;今天笼统的介绍一下低代…

认识需求不得不思考的5大因素

需求对项目非常重要&#xff0c;如果对需求认识不清晰不明确&#xff0c;往往会导致需求不完整&#xff0c;需求重复等问题&#xff0c;引起很多不必要的风险&#xff0c;因此如何认识需求&#xff0c;需要思考哪些因素&#xff0c;就显得尤为重要。以下5大因素&#xff0c;是我…

Spring 6【Lombok、基于注解方式的IoC】(六)-全面详解(学习总结---从入门到深化)

目录 十一、Lombok 十二、基于注解方式的IoC 十一、Lombok 在上面的课程讲解过程中&#xff0c;每次修改类的属性&#xff0c;都需要重新生成Getter/Setter方法及toString()方法。我 们可以借助Lombok来简化代码。 1 环境准备 下载Lombok插件 IDEA 2022.3.2 默认集成Lomb…

ICASSP 2023 | MCROOD: MULTI-CLASS RADAR OUT-OF-DISTRIBUTION DETECTION

原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg4MjgxMjgyMg&mid2247486484&idx1&snd43f92ca0230753e77f54557054653d6&chksmcf51beedf82637fb27d4cbb9279f273298779dabe25f7775cb93469787bcc12c1b6b2caec979#rd ICASSP 2023 | MCROOD: MULTI-CLASS…