網(wǎng)站首頁 編程語言 正文
繪制圓形鋸齒問題
普通繪制圓形形狀時(shí)可以看到圖形邊緣會有明顯鋸齒現(xiàn)象并不像真實(shí)圓形形狀一樣圓潤邊緣平滑。在glsl
中這種情況是常見情況,這里是可以借助glsl
內(nèi)置函數(shù)來消除鋸齒現(xiàn)象。
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在畫圓范圍內(nèi) } 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函數(shù)介紹
smoothstep(a, b, x)
函數(shù)結(jié)果范圍:
返回值 | 條件 |
---|---|
0 | x<a<b 或 x>a>b |
1 | x<b<a 或 x>b>a |
某個(gè)值 | 根據(jù)x在[a,b]或[b,a]區(qū)間范圍內(nèi),返回一個(gè)在[0,1]之間的值 |
內(nèi)置函數(shù)smoothstep
就能實(shí)現(xiàn)繪制圓形圖形的抗鋸齒效果??赡苤坝惺褂眠^內(nèi)置函數(shù)step
同樣都是步進(jìn)式
功能函數(shù),不同于step
函數(shù)可以理解為if-else
而smoothstep
函數(shù)是平滑過渡的。
抗鋸齒實(shí)現(xiàn)
使用smoothstep
實(shí)現(xiàn)抗鋸齒功能需要修改一下原先的畫圓公式。原來只需要使用到length(uv) - r
來判斷是否選擇繪制圓的顏色,而現(xiàn)在需要修改成通過smoothstep(m-0.002,m+0.002,length(uv) - 0.2)
計(jì)算值作為mix
函數(shù)混合系數(shù)值來實(shí)現(xiàn)平滑過渡到畫圓色值,這樣就能實(shí)現(xiàn)抗鋸齒了。
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
范圍進(jìn)行修改。例如修改成0.02
,運(yùn)行結(jié)果可以發(fā)現(xiàn)圓形變模糊了。這就是區(qū)間過大導(dǎo)致平滑區(qū)間漸變范圍在肉眼可見范圍了,因此設(shè)置一個(gè)適當(dāng)過渡區(qū)間才能實(shí)現(xiàn)較好的抗鋸齒效果。
擴(kuò)展
清楚實(shí)現(xiàn)抗鋸齒原理之后,可以根據(jù)需要自行實(shí)現(xiàn)一個(gè)平滑過渡函數(shù)來實(shí)現(xiàn)抗鋸齒功能。類似像以下兩個(gè)自制平滑過渡函數(shù)最終實(shí)現(xiàn)效果幾乎看不出太大區(qū)別。
自制smoothstep函數(shù)抗鋸齒
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); }
自制linearstep函數(shù)抗鋸齒
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
原文鏈接:https://juejin.cn/post/7060050476238110750
相關(guān)推薦
- 2022-09-21 Flutter自定義底部導(dǎo)航欄的方法_Android
- 2022-12-08 React競態(tài)條件Race?Condition實(shí)例詳解_React
- 2022-05-19 C++inline函數(shù)的特性你了解嗎_C 語言
- 2022-09-29 數(shù)據(jù)設(shè)計(jì)之權(quán)限的實(shí)現(xiàn)_數(shù)據(jù)庫其它
- 2022-06-08 Element-UI中selet下拉框無法回顯問題
- 2023-06-16 Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流的實(shí)現(xiàn)_Golang
- 2022-07-27 python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件_python
- 2022-04-05 C++繼承和動態(tài)內(nèi)存分配_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支