当前位置: 首页 > news >正文

Shadertoy 详解

工欲善其事,必先利其器。

学习渲染的小伙伴,不论是用图形API【OpenGL,Vulkan,Metal,DirectX....】,还是成熟的商业引擎【Unreal Engine,Unity,Ogre....】,当涉及到渲染效果的时候,就一定会涉及到使用shader写效果。

shader可能在其他api,或者渲染引擎中学到的有好多着色器,shadertoy是没有这么完备的功能了,只可以弄好了片元着色器给大家调效果。

相信大家可以想到,如果把比如顶点着色器跟几何着色器弄进来,怕是这个小小的网页支持不起来哈,所以只有片元着色器。

shadertoy这个网站,该网站语法跟GLES3.0的shader语法一致,在测试调试好效果可以很方便的迁移到OGL工程中直接使用。

这里给新入门的小伙伴们安利一下。

www.shadertoy.com

本文主要介绍Shadertoy的基本使用

1、功能面板辨识

52e84fd91607c2c66debb5e33f7fd296.png

2、hello,world

官方示例代码如下,添加标注。

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // 归一化纹理坐标到[0-1]范围
    vec2 uv = fragCoord/iResolution.xy;
    // 根据时间变量iTime与纹理坐标组合作为入参计算像素颜色
    vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
    // 输出颜色到fragColor,只需要给该变量赋值就可以展示在最终渲染效果上
    fragColor = vec4(col,1.0);
}

说明:

  1. 类似于C语言的main函数,shadertoy给大家预留的片元着色器代码入口函数是:

void mainImage( out vec4 fragColor, in vec2 fragCoord ).

函数参数列表定义的第一个变量可以看到fragColor是out vec4,意思为输出的四维向量,四维向量同大家理解的颜色向量一样,rgba四元素;out意思为该变量对应的颜色会最终输出映射到最终你期望的帧缓存区上去。

入口函数第二个变量定义为in vec2,in意思为从外部输入进来的,vec2 意思为二维向量,合并在一起意思为从外部输入的二维向量,实际代表的意思为外部输入进来的纹理坐标【跟gles一般操作有差异的是此处的fragCoord为实际坐标,而不是归一化(0,1)的坐标】。

  1. 第一行解释:因为前面提到了入参fragCoord不是归一化的数据,而我们渲染中使用texture采样纹理的时候坐标却需要是归一化坐标,所以这里对坐标进行了转换,实际坐标/iResolution.xy 即可映射纹理坐标到[0,1]范围内。

  2. 第二行解释:根据时间与纹理坐标,cos函数计算一个颜色

cos(iTime+uv.xyx+vec3(0,2,4));

可以拆分为两部分cos(uv.xyx);生成渐变的初始效果,然后在加上默认颜色vec3(0,2,4),颜色加深。

然后再在cos函数中加入iTime【程序启动后运行的时长,单位s】,效果变为渐变颜色逐渐移动变化,类似于在cos函数中选定一个不长,一直沿着x轴移动后cos函数对应值的变化情况

效果

shadertoy示例效果

dc9e9da67475f5feea17618a974cd477.png

作者:阿凯  来源:https://zhuanlan.zhihu.com/p/448215305

c8588ad50db35463184a0ec2c400e049.png

技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

031e1296858b8bedd4815b3a547f6ac3.png

私信领取相关资料

推荐阅读:

音视频开发工作经验分享 || 视频版

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

Android NDK 免费视频在线学习!!!

你想要的音视频开发资料库来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

fcc22679415a0d39ce58385c7921c717.gif

相关文章:

  • Shadertoy 进阶 01
  • 拍乐云首发音视频「分组讨论」开放能力,开启线上群聊互动新玩法
  • 浅入浅出WebGPU
  • Vulkan 在 FFmpeg 中的支持
  • 音视频中的语音信号处理技术
  • 声网3D空间音频技术解析:3D空间音效+空气衰减模拟+人声模糊
  • 音视频春节假期内卷指南(实操)
  • HDR技术趋势浅析
  • 干货收藏 || Vulkan Game Engine 视频教程
  • 详解低延时高音质:丢包、抖动与 last mile 优化那些事儿
  • FFmpeg 音视频倍速控制
  • vertex shader中怎么获取临近顶点的属性值?
  • Seek 策略以及在有 B 帧情况下的处理
  • FFmpeg 中的多线程解码
  • 视频图像色彩增强的主要方法与落地实践
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2019.2.20 c++ 知识梳理
  • Akka系列(七):Actor持久化之Akka persistence
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • JS 面试题总结
  • MobX
  • Web标准制定过程
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 大数据与云计算学习:数据分析(二)
  • 简析gRPC client 连接管理
  • 前端性能优化--懒加载和预加载
  • 问题之ssh中Host key verification failed的解决
  • 你对linux中grep命令知道多少?
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (003)SlickEdit Unity的补全
  • (2022 CVPR) Unbiased Teacher v2
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十三)Maven插件解析运行机制
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • *Django中的Ajax 纯js的书写样式1
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .a文件和.so文件
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .Net Web项目创建比较不错的参考文章
  • .NET 服务 ServiceController
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net6使用WebSocket与前端进行通信
  • .NetCore 如何动态路由
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境