<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
普通繪製圓形形狀時可以看到圖形邊緣會有明顯鋸齒現象並不像真實圓形形狀一樣圓潤邊緣平滑。在glsl
中這種情況是常見情況,這裡是可以藉助glsl
內建函數來消除鋸齒現象。
vec3 sdfCircle(vec2 uv,float r,vec3 value){ float d = length(uv) - r; return d > 0. ? vec3(0.3294, 0.3294, 0.9333) : value; // 大於0超出畫圓範圍,小於0在畫圓範圍內 } void main() { vec2 uv = gl_FragCoord.xy / iResolution.xy; uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5> uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5> vec3 circle = sdfCircle(uv,0.4,vec3(1.)); circle = mix(circle,sdfCircle(uv,0.3,vec3(1.)),0.5); circle = mix(circle,sdfCircle(uv,0.2,vec3(1.)),0.7); gl_FragColor = vec4(circle,.9); }
smoothstep(a, b, x)
函數結果範圍:
返回值 | 條件 |
---|---|
0 | x<a<b 或 x>a>b |
1 | x<b<a 或 x>b>a |
某個值 | 根據x在[a,b]或[b,a]區間範圍內,返回一個在[0,1]之間的值 |
內建函數smoothstep
就能實現繪製圓形圖形的抗鋸齒效果。可能之前有使用過內建函數step
同樣都是步進式
功能函數,不同於step
函數可以理解為if-else
而smoothstep
函數是平滑過渡的。
使用smoothstep
實現抗鋸齒功能需要修改一下原先的畫圓公式。原來只需要使用到length(uv) - r
來判斷是否選擇繪製圓的顏色,而現在需要修改成通過smoothstep(m-0.002,m+0.002,length(uv) - 0.2)
計算值作為mix
函數混合係數值來實現平滑過渡到畫圓色值,這樣就能實現抗鋸齒了。
vec2 uv = gl_FragCoord.xy / iResolution.xy; uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5> uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5> float m = 0.2; m = smoothstep(m-0.002,m+0.002,length(uv) - 0.2); vec3 pixel = mix(vec3(1.),vec3(0.3294, 0.3294, 0.9333),m); gl_FragColor = vec4(pixel,1.0);
如果把指令碼其中m-0.002,m+0.002
把0.002
範圍進行修改。例如修改成0.02
,執行結果可以發現圓形變模糊了。這就是區間過大導致平滑區間漸變範圍在肉眼可見範圍了,因此設定一個適當過渡區間才能實現較好的抗鋸齒效果。
清楚實現抗鋸齒原理之後,可以根據需要自行實現一個平滑過渡函數來實現抗鋸齒功能。類似像以下兩個自制平滑過渡函數最終實現效果幾乎看不出太大區別。
float smootherstep(float edge0, float edge1, float x) { float t = (x - edge0)/(edge1 - edge0); float t1 = t*t*t*(t*(t*6. - 15.) + 10.); return clamp(t1, 0.0, 1.0); } void main() { vec2 uv = gl_FragCoord.xy / iResolution.xy; uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5> uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5> float m = 0.2; m = smootherstep(m-0.002,m+0.002,length(uv) - 0.2); vec3 pixel = mix(vec3(1.),vec3(0.3294, 0.3294, 0.9333),m); gl_FragColor = vec4(pixel,1.0); }
float linearstep(float edge0, float edge1, float x) { float t = (x - edge0)/(edge1 - edge0); return clamp(t, 0.0, 1.0); } void main(){ vec2 uv = gl_FragCoord.xy / iResolution.xy; uv -= 0.5; // x: <-0.5, 0.5>, y: <-0.5, 0.5> uv.x *= iResolution.x/iResolution.y; // x: <-0.5, 0.5> * aspect ratio, y: <-0.5, 0.5> float m = 0.2; m = linearstep(m-0.002,m+0.002,length(uv) - 0.2); vec3 pixel = mix(vec3(1.),vec3(0.3294, 0.3294, 0.9333),m); gl_FragColor = vec4(pixel,1.0); }
smoothstep
linearstep
以上就是詳解OpenGL Shader抗鋸齒的實現的詳細內容,更多關於OpenGL Shader抗鋸齒的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45