介绍
对于那些阅读这篇文章的人
让我们在推特上发布 GLSL!
对于那些已经这样做的人
给我一个技巧合集!
我真的希望...
技术
推特 GLSL 技术代码缩短什么时候除此之外我将其分为(不时更新)
此外,所有技术都假定 Twigl 的极客 (300es)
代码缩短
浮点数的简写
float a=0.1;
↓
float a=.1;
这是一个字母的缩写
从 int 转换
vec3 a=vec3(1.,2.,3.);
↓
vec3 a=vec3(1,2,3);
每个 int 缩短 1 个字符
消除不必要的分配
vec3 a,b,c;
a=vec3(1);
b=floor(a);
c=mod(b,2.)-1.;
↓
vec3 c=mod(floor(vec3(1)),2.)-1.;
自然,它是自然的,但它很强大,因为它可以在一个链条中消失。
转换为 vec 类型
float s=1.;
o=vec4(s);
↓
float s=1.;
o+=s;
我经常使用它
缩写为声明
vec3 a=vec3(1,2,3),b,c;
for(float i=0.;i<99.;i++)
{
b+=a*i;
c=b-vec3(1);
}
↓
vec3 a=vec3(1,2,3),b,c;
for(float i;i++<99.;)b+=a*i,c=b-vec3(1);
(for语句内容不变)
- float的初始值为0.0,所以不需要初始化
- 在评估 i 的同时执行 i++ 的缩写
- ,使表达式变成一个句子并删除花括号
我在做
距离平方
vec3 P;
float a=dot(P,P);
由获得
地板的替代品
有时可以用 ceil 做一些事情
使用赋值的返回值
float a=5.,b,c;
b=sin(a);
c=b;
↓
float a=5.,b,c;
c=b=sin(a);
申报时计算
vec3 a=vec3(1,2,3),b=vec3(4,3,2);
↓
vec3 a=vec3(1,2,3),b=a.zyx+1.;
可以偶尔使用
奇怪的使用定义
#define F(P) dot(vec3(1,2,3),P)
vec3 P=vec3(3,2,1);
float a=F(P.xxx),b=F(P.yyy),c=F(P.zzz);
↓
#define F(S) dot(vec3(1,2,3),P.S)
vec3 P=vec3(3,2,1);
float a=F(xxx),b=F(yyy),c=F(zzz);
很少用
定义非常灵活,例如使用其他算术运算符作为参数
反转乘法和除法
例如 a*10.0 可以是 a/.1
使用预定义变量
o 可以用作 vec4(0) 和 s 用作 0.0
此外,如果您需要一个浮点变量但不想定义它,您可以使用 o.a 等作为变量
↓示例
for(;o.a++<99.;)何かの処理;
如果你用得太多,可能声明float会更短,所以它不是万能的
增加维度时使用 cast
float s;
vec2 a=vec2(s)
↓
float s;
vec2 a=o.aa+s;
我有时忘记使用这个
射线定义
vec3 R=vec3((FC.xy*2.-r)/r.y,1);
由于未标准化,因此伪影将按原样出现
为了避免这种情况,有一种方法将 SDF 乘以 0.5 等。
这是一种使用即使 SDF 不准确,如果它是下界也可以进行光线行进的属性的方法
除此之外
坐标变换
(P 作为雷的提示)
- 重复
mod(P,n)-n/2. - 包裹
abs(P.x) - 扭曲
P.xy*=rotate2D(P.y)
价值离散化
如果要离散化,使用floor(p*N)/N(ceil也可以根据情况接受)
三角波
你可以用asin(sin(t))
光线行进
vec3 R=vec3((FC.xy*2.-r)/r.y,1),O=vec3(0,0,0),P;
float i,l,d=1.;
for(;i++<99.&&d>.01;)
{
P=R*l+O;
d=length(P)-.5;
l+=.5*d;
}
o+=12./i;
这是我的模板在缩短之前的样子
射线行进的解释被省略
通过 DDX 方法绘制体素
vec3 Y=vec3((FC.xy*2.-r)/r.y,.5),I=sign(Y),O=vec3(0,0,f/4.),D=I/Y,M=ceil(O),S=(I*(M-O+.5)+.5)*D,T,K;
for(;O.r++<99.&&O.b>0.;)
{
K=vec3(lessThanEqual(S,min(S.yzx,S.zxy)));
S+=K*D;
M+=K*I;
O.b=length(mod(M,20.)-10.)-7.;
}
o+=12./O.r;
这是缩短之前的代码
关于 DDX 算法这里看
使用 fwidth 进行伪法线和轮廓检测
如果射线的尖端是 P 并且步数是 i
fwidth(P*20.) 等获取法线,fwidth(i*.1) 等获取轮廓
原因是宽度用于abs(dFdx(p))+abs(dFdy(p))。
我不太明白,但我认为它类似于在使用光线行进法线时使用渐变
固定长度的光线行进
vec3 Y=vec3((FC.xy*2.-r)/r.y,1),G=vec3(5,0,t),P;
float i,d=1.;
for(;i++<1e2&&d>0.;)
{
P=Y*i/10.+G;
d=snoise3D(P)+.5;
}
o+=10./i;
以与体积渲染相同的方式以固定长度推进射线,如果发生碰撞则中止。
您可以比平时缩短代码,但这将是一个平面图片
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308632579.html