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

shader 案例学习笔记之绘制圆

环境搭建:参考glsl vscode环境搭建

先上代码
#ifdef GL_ES
precision mediump float;
#endifuniform vec2 u_resolution;void main(){vec2 st = gl_FragCoord.xy/u_resolution.xy;st -= 0.5;st.x *= u_resolution.x/u_resolution.y;float r = length(st);float d = step(0.2, r);//  float  d = smoothstep(1.0, 0.1, r);gl_FragColor = vec4(d, d, d, 1.0); 
}
逐行解释:
  • #ifdef GL_ES
    • 预处理指令,用于检查是否为OpenGL ES 环境;
  • precision mediump float;
    • 如果是OpenGL ES 环境,声明浮点数精度为"mediump"(中等精度)单词为medium  precision缩写。
      • 还有高精度  highp
  • uniform vec2 u_resolution;
    • 定义一个二维向量类型的统一变量"u_resolution",这个变量通常是用来存储屏幕或者渲染区域的分辨率;
  • void mian
    • 片元着色器的入口函数,每个片元都要执行这个函数且所有的着色器代码都要在这个函数中去执行
  • vec2 st gl_FragCoord.xy / u_resolution.xy;
    • gl_FragCoord是片元着色器的内置变量,存储了当前片元的屏幕坐标(以像素为单位)。将其除以u_resolution 得到一个范围在[0,1]之间的二维向量,代表当前片元在屏幕上的相对位置。可以称之为坐标归一化
    • 将main函数代码改成如下,颜色分布和上面分析结果一样
    • void mian(){vec2 st = gl_FragCoord.xy/u_resolution.xy;gl_FragColor = vec4(st.x, st.y, 0, 1.0);}

  • st -= 0.5
    • 将二维向量每个分量都减去0.5,将坐标中心移动到屏幕中心。
    • 黑色为执行st -= 0.5之前的坐标系,橙色为执行之后的坐标系,从新的坐标系看,原点(0,0)就移动到了渲染区域的中点
  • st.x *= u_resolution.x/u_resolution.y; 
    • 将调整后的横坐标 st.x 乘以屏幕的宽高比(u_resolution.x/u_resolution.y),以确保在不同宽高比的屏幕上图形显示效果一致。
  • float r = length(st);
    • length函数是glsl内置函数。计算向量st的长度并赋值给r。这个向量的长度通常用来表示片元(某个像素点)到中心点的距离。
  •  float c = step(0.2, r);
    • step函数glsl内置函数。如果r的值大于0.2,返回1.0,否则返回0.0。这里的0.2,其实就是我们圆的半径。当改变0.2这位置的参数的大小,就很容易理解,当数值越大时,绘制的圆就越大。
    • 所有的片元(像素)都要执行这个函数,当st到原点(0,0)的距离大于0.2时,就是白色,当小于0.2的时候,就返回黑色,所以最终如下图所示。
  • gl_FragColor = vec4(c, c, c, 1.0);
    • 设置当前片元的颜色
  • 注释掉的方法: float  c = smoothstep(0.3, 0.2, r);
    • glsl内置函数,float smoothstep(float edge0, float edge1, float x);
      •  当edge1 < edge0时,当x < edg1时,返回1,当x > edg0时,返回0,当edg0<=xedg1时,返回x。
      •  当edge0 = edge1 ,smoothstep退化成step
      •  但当edge0=edge1=0,smoothstep(edge0,edge1,x);无论x是什么都返回0
补充:
#ifdef GL_ES
precision mediump float;
#endifuniform vec2 u_resolution;void main(){vec2 st = gl_FragCoord.xy/u_resolution.xy;st -= 0.5;st.x *= u_resolution.x/u_resolution.y;float r = length(st);float color = 0.0;if(r>0.2){color = 1.0;}else{color = 0.0;}gl_FragColor = vec4(color, color, color, 1.0); 
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • springboot属性加载优先级和常见命令行属性
  • 一个Java中有用的JacksonUtil类
  • 【重点】(非常全) Node.js的生态有哪些包
  • C语言代码练习(第十九天)
  • StarRocks Lakehouse 快速入门——Apache Iceberg
  • Conmi的正确答案——MySQL的层级递归查询(递归公共表表达式,CTE)
  • 2. 下载rknn-toolkit2项目
  • PhpStudy下载安装使用学习
  • 【亲测能用!OpenVPN实验教程】Win11主机连CentOS7服务器(用户名密码模式)
  • 类的生命周期
  • 【ORACLE】独有的函数
  • Azure OpenAI models being unable to correctly identify model
  • 新办建筑智能化专项乙级设计资质,郑州企业需要达到哪些要求?
  • 枚举专题.
  • 有效寻找潜在客户的五个方法
  • 07.Android之多媒体问题
  • Angular Elements 及其运作原理
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Hibernate【inverse和cascade属性】知识要点
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • java第三方包学习之lombok
  • jquery ajax学习笔记
  • JWT究竟是什么呢?
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 服务器从安装到部署全过程(二)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 浅谈Golang中select的用法
  • 巧用 TypeScript (一)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • ionic异常记录
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​数据链路层——流量控制可靠传输机制 ​
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • ###C语言程序设计-----C语言学习(3)#
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (14)Hive调优——合并小文件
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (算法)硬币问题
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (正则)提取页面里的img标签
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net mvc总结
  • .netcore 获取appsettings
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • //TODO 注释的作用
  • @Pointcut 使用