最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

繪制圓形鋸齒問題

普通繪制圓形形狀時(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é)果范圍:

返回值條件
0x<a<b 或 x>a>b
1x<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-elsesmoothstep函數(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.0020.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

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

相關(guān)文章

  • Android DataBinding單向數(shù)據(jù)綁定深入探究

    Android DataBinding單向數(shù)據(jù)綁定深入探究

    看了谷歌官方文章確實(shí)寫的太簡略了,甚至看完之后有很多地方還不知道怎么回事兒或者怎么用,那么接下來我將通過文章全面介紹一下DataBinding單向數(shù)據(jù)綁定
    2022-11-11
  • Android自定義ViewGroup多行多列效果

    Android自定義ViewGroup多行多列效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup多行多列效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android實(shí)現(xiàn)一個(gè)簡單的單詞本

    Android實(shí)現(xiàn)一個(gè)簡單的單詞本

    大家好,本篇文章主要講的是Android實(shí)現(xiàn)一個(gè)簡單的單詞本,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法

    Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法,涉及Android針對SD卡的讀取及文件遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Android中打電話的數(shù)據(jù)流程分析

    Android中打電話的數(shù)據(jù)流程分析

    所有流程的起點(diǎn)是從撥號后按下?lián)芴栨I開始,接下來將對打電話的數(shù)據(jù)流程進(jìn)行源碼分析,感興趣的朋友可以了解下
    2013-01-01
  • Android  Spinner列表選擇框的應(yīng)用

    Android Spinner列表選擇框的應(yīng)用

    這篇文章主要介紹了Android Spinner列表選擇框的應(yīng)用的相關(guān)資料,這里對spinner的屬性和常用事件和數(shù)據(jù)綁定都做了介紹,需要朋友可以參考下
    2017-07-07
  • Android UI效果之繪圖篇(一)

    Android UI效果之繪圖篇(一)

    這篇文章主要介紹了Android UI效果之繪圖篇,針對Android開發(fā)中的UI效果設(shè)計(jì)模塊進(jìn)行講解,感興趣的小伙伴們可以參考一下
    2016-02-02
  • android使用surfaceview+MediaPlayer播放視頻

    android使用surfaceview+MediaPlayer播放視頻

    這篇文章主要為大家詳細(xì)介紹了android使用surfaceview+MediaPlayer播放視頻,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android實(shí)現(xiàn)歡迎滑動頁面

    Android實(shí)現(xiàn)歡迎滑動頁面

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)歡迎滑動頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android 自定義縮短Toast顯示時(shí)間的實(shí)例代碼

    Android 自定義縮短Toast顯示時(shí)間的實(shí)例代碼

    這篇文章主要介紹了Android 自定義縮短Toast顯示時(shí)間,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評論

监利县| 泰来县| 兴国县| 贺州市| 南宫市| 镇沅| 平和县| 高台县| 宁波市| 东丽区| 分宜县| 陆良县| 遂昌县| 九龙坡区| 营口市| 衡东县| 库车县| 九龙城区| 赤壁市| 湟中县| 平利县| 闽清县| 璧山县| 衡南县| 资兴市| 桃江县| 明溪县| 柳州市| 会泽县| 兴山县| 钟祥市| 汨罗市| 沙湾县| 满洲里市| 清涧县| 界首市| 江源县| 蓬安县| 乐平市| 福鼎市| 杭锦后旗|