shader入坑:一、渲染一个太阳

96 阅读1分钟

什么是太阳

太阳是位于太阳系中心的恒星,其能量通过核聚变反应产生,为地球及太阳系其他行星提供光和热。 宇宙中约85%的质量为暗物质,不参与电磁相互作用,无法反射或发光,所以背景是黑色的。

渲染太阳

I是坐标轴输入,输入范围是[0,1]。首先将坐标偏移到[-1, 1],调整Y轴拉伸效果,不受分辨率影响。

vec2 I = (v_TexCoord - 0.5 ) * 2.0; 
I.y *= u_Resolution.y / u_Resolution.x;

基础颜色选用为橙色: 题解19.PNG 越靠近太阳中心位置,亮度越高,即坐标(0,0)温度最高,越靠近边缘亮度越低。

O=vec(1,.5,.2,1)/dot(I,I)

微信图片_20250503174532.jpg

颜色处理

可以看到上一步处理得到的图片会有颜色跳变,是因为每个通道颜色分别运算导致的,比如从(400, 200,80) -> (300, 150, 60), r通道颜色并未改变,双曲正切函数表达式如下,他的主要作用是将值域[-∞,+∞]映射到[-1,1],让颜色在高亮度区域不会超出shader的颜色范围: image.png 最终得到图片 微信图片_20250503174611.jpg

参考: [1]www.shadertoy.com/view/ms3BD7