介绍

对于那些阅读这篇文章的人
让我们在推特上发布 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也可以根据情况接受)

三角波

つぶやきGLSL テクニック集
你可以用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 方法绘制体素

つぶやきGLSL テクニック集

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) 等获取轮廓

つぶやきGLSL テクニック集

つぶやきGLSL テクニック集

原因是宽度用于abs(dFdx(p))+abs(dFdy(p))
我不太明白,但我认为它类似于在使用光线行进法线时使用渐变

固定长度的光线行进

つぶやきGLSL テクニック集

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

相关文章:

  • 2022-12-23
  • 2021-12-16
  • 2021-11-22
  • 2021-05-26
  • 2021-06-22
  • 2021-09-15
  • 2021-12-28
  • 2021-11-16
猜你喜欢
  • 2021-12-02
  • 2021-07-30
  • 2021-08-21
  • 2022-12-23
  • 2021-04-04
  • 2022-12-23
  • 2021-11-22
相关资源
相似解决方案