首页 / 资讯中心 / 文章详情

The Book of Shaders 术语解析:GLSL pow() 幂函数——声明、参数与塑造函数实战

The Book of Shaders 术语解析:GLSL pow() 幂函数——声明、参数与塑造函数实战 ★ FEATURED ARTICLE
【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载本文围绕 The Book of Shaders 术语表Glossary中的 pow 条目 展开系统讲解 GLSL 内置幂函数pow()的函数签名、参数语义、交互式可视化机制并结合仓库第 05 章塑造函数及多个.frag示例源码说明如何用pow()把线性曲线塑形为曲线、缓动与脉冲帮助读者把这一底层数学函数真正用在片段着色器创作中。一、pow() 是什么GLSL 内置的幂运算函数根据 glossary/pow/README-vi.md 的定义pow()是 GLSL 内置的幂函数它返回第一个参数x底数的第二个参数y指数次幂即数学上的x^yLũy thừa 即越南语幂。与其他自定义函数不同pow()属于 GLSL 语言内置的数学函数通常在 GPU 硬件层面做了加速。第 05 章 README.md 中专门提醒这类函数如果以正确的方式、有节制地使用会让你的着色器更快原文Most of them are accelerated at the level of the hardware, which means if they are used in the right way and with discretion they will make your code faster.。因此掌握pow()不只是数学问题也关系到着色器性能。二、函数签名四种重载形式条目中给出了pow()的完整声明Declaration / Các phiên bảnfloat pow(float x, float y) vec2 pow(vec2 x, vec2 y) vec3 pow(vec3 x, vec3 y) vec4 pow(vec4 x, vec4 y)可以看到pow()支持标量float以及vec2、vec3、vec4四种向量重载。向量版本执行的是逐分量运算component-wise即pow(vec2(x1,x2), vec2(y1,y2))等价于vec2(pow(x1,y1), pow(x2,y2))。这在需要对多个通道或坐标同时做幂运算时非常方便例如同时调整 RGB 三个颜色通道的响应曲线。三、参数与返回值语义条目将参数明确拆分为x底数cơ số即要参与幂运算的值y指数số mũ即对x施加的幂次。返回值即x的y次幂x^y。需要留意的边界行为依据 GLSL 规范约定仓库文档未展开但实践中需注意当x 0.0时pow(x, y)的结果未定义undefined当x 0.0且y 0.0时同样属于未定义情形当x 0.0且y 0.0时结果为0.0。因此在 shader 里对负数底数做pow()前通常应先通过abs()、clamp()或max()归一化输入这也是后面源码示例中常见的处理模式。四、交互式可视化术语表中的可运行公式pow条目正文中包含一行特殊标记div classsimpleFunction datay pow(x,3.0); /div这是 The Book of Shaders 站点的交互式公式组件。在 src/main.js 中可以看到它的渲染机制脚本遍历页面上所有.simpleFunction元素读取data属性中的 GLSL 表达式再用GlslEditor生成一个 800×250 的实时画布canvas_width: 800, canvas_height: 250把用户写的表达式作为函数体注入执行var sfList document.querySelectorAll(.simpleFunction); for(var i 0; i sfList.length; i){ if (sfList[i].hasAttribute(data)){ var srcFile sfList[i].getAttribute(data); glslGraphs.push(new GlslEditor(sfList[i], { canvas_width: 800, canvas_height: 250, frag_header: preFunction, frag_footer: postFunction, ... }).open(srcFile)); } }也就是说y pow(x,3.0);会直接在浏览器里绘制出一条 x 的立方曲线读者可以随手把指数改成0.5、1.0、2.0、5.0等值直观观察曲线形态随指数的变化——这正是理解指数控制曲线弯曲程度的最佳实验方式。同样的机制在 05/README.md 的一些额外有用的函数小节中也被大量使用。五、实战用 pow() 塑造曲线Shaping Functionspow()在 The Book of Shaders 中最核心的应用是第 05 章塑造函数Shaping Functions。05/README.md 指出把归一化坐标st.x范围 0.01.0直接赋给y得到的是线性直线而把 x 提升到 5 次方就能得到一条弯曲的线。仓库中 05/expo.frag 就是最直白的演示void main() { vec2 st gl_FragCoord.xy / u_resolution; float y pow(st.x, 5.0); // 把线性值塑造成幂曲线 vec3 color vec3(y); float pct plot(st, y); // 用 smoothstep 绘制绿色曲线 color (1.0-pct)*color pct*vec3(0.0,1.0,0.0); gl_FragColor vec4(color,1.0); }该示例配套的绿色plot()曲线正是pow(st.x, 5.0)的形态。第 05 章 README 还专门布置了实验分别尝试指数 20.0、2.0、1.0、0.0、0.2、0.02观察指数大于 1 时曲线下沉缓升、小于 1 时曲线陡升趋平的差异从而建立指数 ⇔ 曲线弯曲程度的直觉。同章还提醒pow()之外还有exp()、log()、sqrt()等硬件加速函数配合PI宏#define PI 3.14159265359使用会更有趣——这些函数构成了完整的塑造函数工具箱。5.1 用 pow() 构造缓动函数05/easing.frag 是 Robert Penner 经典缓动函数的 GLSL 移植其中大量使用pow()float exponentialIn(float t) { return t 0.0 ? t : pow(2.0, 10.0 * (t - 1.0)); } float qinticIn(float t) { return pow(t, 5.0); } float qinticInOut(float t) { return t 0.5 ? 16.0 * pow(t, 5.0) : -0.5 * pow(2.0 * t - 2.0, 5.0) 1.0; } float cubicInOut(float t) { return t 0.5 ? 4.0 * t * t * t : 0.5 * pow(2.0 * t - 2.0, 3.0) 1.0; }注意exponentialIn中的写法底数固定为 2指数是10*(t-1)——这与pow(x, y)的底数-指数两参数模型完全对应通过控制指数即可获得从慢到快的加速曲线而qinticIn/cubicInOut则是固定指数、变化底数的另一种用法。pow(t, 5.0)也被用于 07/tmp/warp-shape.frag 中做形状混合权重pow(fract(sides), 20.)指数越大过渡越锐利。5.2 组合 pow()抛物线、指数步进与 pcurve第 05 章末尾引用了 Iñigo Quiles 的函数合集仓库中的实现展示了pow()更高级的组合用法05/parabola.fragfloat parabola(float x, float k){ return pow( 4.0*x*(1.0-x), k ); }——先构造对称的4x(1-x)抛物线再用指数k控制峰值的尖锐程度05/expstep.fragfloat expStep(float x, float k, float n){ return exp( -k*pow(x,n) ); }——pow(x,n)作为exp()的内部输入两个内置函数嵌套出 S 形过渡05/pcurve.fragfloat k pow(ab,ab) / (pow(a,a)*pow(b,b)); return k * pow(x,a) * pow(1.0-x,b);——用三次pow()组合出可调左右不对称的钟形曲线其中pow(ab,ab)这一写法底数与指数相同即(ab)^(ab)。5.3 在几何/距离场中的间接应用pow()并非只服务于一维曲线。07/line.frag 用它控制线段宽度衰减if(pr1 0.0 pr2 0.0) { return pow(1.0 / abs(proj * _width), _spread); }_spread作为指数决定了线段边缘的羽化/锐利程度。此外 09/nuts.frag、12/2d-voronoise.frag、12/tissue.frag 等文件中也都出现了pow()的身影可见它在噪声加权、距离场与程序纹理中同样是高频工具。六、相关函数与延伸阅读pow条目末尾列出了两个密切相关的内置函数inversesqrt()1/sqrt(x)即平方根的倒数常用于向量归一化见 glossary/inversesqrt/README.mdsqrt()平方根即x^0.5可视为pow()的指数固定为 0.5特例见 glossary/sqrt/README.md。从幂运算的谱系来看pow()还与exp()自然指数、log()对数互为逆运算关系三者共同构成塑造函数章节的基础数学工具。想深入掌握pow()的实际用法建议通读 第 05 章塑造函数并在该章的expo.frag、parabola.frag、pcurve.frag等示例中反复修改指数参数做实验术语表页面的渲染逻辑可参见 src/main.jsGlossary 各条目的 PHP 加载方式见 glossary/index.php。要点回顾pow(x, y)返回x^y支持 float/vec2/vec3/vec4 四种重载且逐分量运算底数x与指数y共同决定曲线形态它是硬件加速的内置函数在 The Book of Shaders 中主要用作塑造函数、缓动函数与距离场权重动手实验交互式y pow(x,3.0)画布 修改指数是掌握它的最佳路径。赞分享【免费下载链接】thebookofshadersStep-by-step guide through the abstract and complex universe of Fragment Shaders.项目地址https://gitcode.com/gh_mirrors/th/thebookofshaders点击查看免费下载相关推荐如何搭配aria2c让BBDown下载B站视频快人一步多线程加速实战指南如何搭配aria2c让BBDown下载B站视频快人一步多线程加速实战指南 BBDown 是一款免费、高效的命令行式哔哩哔哩下载器而通过搭配 aria2c 下GLSL sin() 函数详解The Book of Shaders 中的正弦函数声明、参数与着色器实战GLSL sin 函数详解The Book of Shaders 中的正弦函数声明、参数与着色器实战 本篇基于 The Book of Shaders 官方术libpag 开源贡献指南Issue 提报、分支管理、PR 提交流程与 C 代码规范全解析libpag 开源贡献指南Issue 提报、分支管理、PR 提交流程与 C 代码规范全解析 libpagPortable Animated Graphi上一篇Isaac Lab Newton 物理管理器isaaclab_newton.physicsAPI 全解析求解器配置、碰撞管线与管理器派发机制下一篇揭秘gh_mirrors/aw/aws核心原理如何用BashAWS CLI打造企业级云自动化工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站