当前位置: 首页 > 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); 
}

http://www.lryc.cn/news/434542.html

相关文章:

  • c++的模板编程技术及其发展历程
  • Unity 一个比较适合学习的FSM状态机(汉化和功能简述)
  • 25、Wpf之App资源应用
  • 【深度好文】反模式:10种滥用设计模式案例分析
  • OkHttp Interceptor日志上报
  • 高性能反向代理--HAProxy
  • 数据结构应用实例(四)——最小生成树
  • 为OneAPI配置MySQL数据库及设置开机启动
  • 完整的k8s搭建服务器流程
  • 【Petri网导论学习笔记】Petri网导论入门学习(一)
  • Zabbix监控自动化
  • pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi ​定制SVI目标和培训循环,变更推理
  • Openeuler22 部署 RackTables0.22.0
  • 从传统到智能:高标准农田灌区信息化助力农业现代化
  • 堆排序-建堆,增删替换
  • 使用AI写WebSocket知识是一种怎么样的体验?
  • 若依系统(Security)增加微信小程序登录(自定义登录)
  • 道可云人工智能元宇宙每日资讯|2024互联网岳麓峰会在长沙召开
  • MySQL JDBC URL各参数详解
  • celery control.shutdown
  • 数据库设计与软件工程阶段的对应关系
  • 基于ASP+ACCESS的教师信息管理系统
  • 【智能体】浅谈大模型之AI Agent
  • 大疆 嵌入式 笔记 面试题目汇总大全[嵌入式找工作必看] 比较有难度适合进阶收藏学习
  • 线程池以及详解使用@Async注解异步处理方法
  • css鼠标移动过去变成手的图标
  • uniapp 懒加载、预加载、缓存机制深度解析
  • 《OpenCV计算机视觉》—— 图像形态学(腐蚀、膨胀等)
  • 【Rust光年纪】海洋学研究的利器:Rust语言海洋学计算库详解
  • Word文档的读入【2】