欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解OpenGL Shader抗鋸齒的實現(xiàn)

 更新時間:2022年02月11日 16:04:27   作者:JulyYu  
普通繪制圓形形狀時可以看到圖形邊緣會有明顯鋸齒現(xiàn)象并不像真實圓形形狀一樣圓潤邊緣平滑。本文將介紹如何通過自制函數(shù)實現(xiàn)抗鋸齒,需要的可以參考一下

繪制圓形鋸齒問題

普通繪制圓形形狀時可以看到圖形邊緣會有明顯鋸齒現(xiàn)象并不像真實圓形形狀一樣圓潤邊緣平滑。在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é)果范圍:

返回值條件
0x<a<b 或 x>a>b
1x<b<a 或 x>b>a
某個值根據(jù)x在[a,b]或[b,a]區(qū)間范圍內(nèi),返回一個在[0,1]之間的值

內(nèi)置函數(shù)smoothstep就能實現(xiàn)繪制圓形圖形的抗鋸齒效果。可能之前有使用過內(nèi)置函數(shù)step同樣都是步進式功能函數(shù),不同于step函數(shù)可以理解為if-elsesmoothstep函數(shù)是平滑過渡的。

抗鋸齒實現(xiàn)

使用smoothstep實現(xiàn)抗鋸齒功能需要修改一下原先的畫圓公式。原來只需要使用到length(uv) - r來判斷是否選擇繪制圓的顏色,而現(xiàn)在需要修改成通過smoothstep(m-0.002,m+0.002,length(uv) - 0.2)計算值作為mix函數(shù)混合系數(shù)值來實現(xiàn)平滑過渡到畫圓色值,這樣就能實現(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.0020.002范圍進行修改。例如修改成0.02,運行結(jié)果可以發(fā)現(xiàn)圓形變模糊了。這就是區(qū)間過大導(dǎo)致平滑區(qū)間漸變范圍在肉眼可見范圍了,因此設(shè)置一個適當(dāng)過渡區(qū)間才能實現(xiàn)較好的抗鋸齒效果。

擴展

清楚實現(xiàn)抗鋸齒原理之后,可以根據(jù)需要自行實現(xiàn)一個平滑過渡函數(shù)來實現(xiàn)抗鋸齒功能。類似像以下兩個自制平滑過渡函數(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

以上就是詳解OpenGL Shader抗鋸齒的實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于OpenGL Shader抗鋸齒的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Android如何設(shè)計一個全局可調(diào)用的ViewModel對象

    詳解Android如何設(shè)計一個全局可調(diào)用的ViewModel對象

    很多時候我們需要維護一個全局可用的ViewModel,因為這樣可以維護全局同一份數(shù)據(jù)源,且方便使用協(xié)程綁定App的生命周期,那如何設(shè)計全局可用的ViewModel對象,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 如何使用Flutter開發(fā)一款電影APP詳解

    如何使用Flutter開發(fā)一款電影APP詳解

    這篇文章主要給大家介紹了關(guān)于如何使用Flutter開發(fā)一款電影APP的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Android點擊EditText文本框之外任何地方隱藏鍵盤的解決辦法

    Android點擊EditText文本框之外任何地方隱藏鍵盤的解決辦法

    這篇文章主要介紹了Android點擊EditText文本框之外任何地方隱藏鍵盤的解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • 用原生VideoView進行全屏播放時的問題

    用原生VideoView進行全屏播放時的問題

    本篇文章主要介紹了用原生VideoView進行全屏播放時的問題,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Android Studio查看Android 5.x源碼的步驟詳解

    Android Studio查看Android 5.x源碼的步驟詳解

    Google為Android開發(fā)者帶來Android Studio,用來取代Eclipse。從Android Studio出現(xiàn)起,整機開發(fā)和Android源碼閱讀和編輯一定能用上它。這篇文章小編就帶大家學(xué)習(xí)下如何使用Android Studio查看Android 5.x源碼,有需要的可以參考借鑒。
    2016-09-09
  • 詳談Matrix中preTranslate()和postTranslate()的理解

    詳談Matrix中preTranslate()和postTranslate()的理解

    這篇文章主要為大家詳細(xì)介紹了Matrix中preTranslate()和postTranslate()的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 掌握Android Handler消息機制核心代碼

    掌握Android Handler消息機制核心代碼

    該文主要是分析Handler消息機制的關(guān)鍵源碼,文章會從對handler有一些基本的認(rèn)識開始介紹,內(nèi)容詳細(xì),感興趣的小伙伴可以參考下
    2021-09-09
  • 基于Flutter實現(xiàn)按位置大小比例布局的控件

    基于Flutter實現(xiàn)按位置大小比例布局的控件

    做視頻監(jiān)控項目時需要需要展示多分屏,比如2x2、3x3、414等等,所以本文為大家介紹了如何基于Flutter實現(xiàn)按位置大小比例布局的控件,需要的可以參考一下
    2023-08-08
  • Android多種方式實現(xiàn)相機圓形預(yù)覽的示例代碼

    Android多種方式實現(xiàn)相機圓形預(yù)覽的示例代碼

    這篇文章主要介紹了Android多種方式實現(xiàn)相機圓形預(yù)覽的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Android添加水印的正確方法 只要三步!

    Android添加水印的正確方法 只要三步!

    這篇文章主要介紹了Android添加水印的正確方法,僅僅三步輕松實現(xiàn)為圖片添加水印功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論