ODOShader

ODOS丨自己写个Grapher

by ERIN.Z, 2022-02-19


自从开始上班,odos直接变成oweekos....佩奇给推荐了pdcxs的系列教程,本自主摸索选手去系统性补了补课。来补充一点之前不太了解的内容———— Snipaste_2022-02-20_00-07-01.png

关于fwidth

fwidth(v) = abs( ddx(v) )+ abs(ddy(v)) ddx(v) = 该像素点右边的v值 - 该像素点的v值 ddy(v) = 该像素点下面的v值 - 该像素点的v值

整个grapher

核心代码其实就是这样的两个函数: float func(in float x) { return 函数本体; } float AAfunc(vec2 coord){ float c = 0.; for(float m =0.;m<AA;m++){ for(float n=0.;n<AA;n++){ vec2 o = getuv(coord + (vec2(m,n)-.5AA) / AA2.);//offset c += S(o.y,func(o.x)); } } c = abs(c/(AAAA)-0.5)2.;//remap to 0-1:more closed to 0 more closed to the funcline return S1(c,0.5); }

这里的AA算法相当于对函数图像进行了一个简化版的边缘检测:

  • 若像素在曲线上方则为1,下方则为0
  • 对上下左右AA个像素求和,和为AA×AA则偏移后的像素都在曲线上方,和为0则偏移后的像素都在曲线下方
  • 求和越接近0.5×AA×*AA,则越接近函数曲线

function AA 它的问题在于只能绘制....一一映射?完了,高中数学都还回去了.....的函数,所以画不出fract(x)这种含竖直部分的图像。 同样的原因,因为它的算法是基于y值比较,动态变化中可以明显地看到AA情况并不理想。

by ERIN.Z

2024 © typecho & elise