亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenGL?Shader抗鋸齒如何實現

發布時間:2022-02-14 09:47:05 來源:億速云 閱讀:342 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“OpenGL Shader抗鋸齒如何實現”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“OpenGL Shader抗鋸齒如何實現”這篇文章吧。

繪制圓形鋸齒問題

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

OpenGL?Shader抗鋸齒如何實現

smoothstep函數介紹

smoothstep(a, b, x)函數結果范圍:

返回值條件
0x<a<b 或 x>a>b
1x<b<a 或 x>b>a
某個值根據x在[a,b]或[b,a]區間范圍內,返回一個在[0,1]之間的值

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

抗鋸齒實現

使用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);

OpenGL?Shader抗鋸齒如何實現

如果把腳本其中m-0.002,m+0.0020.002范圍進行修改。例如修改成0.02,運行結果可以發現圓形變模糊了。這就是區間過大導致平滑區間漸變范圍在肉眼可見范圍了,因此設置一個適當過渡區間才能實現較好的抗鋸齒效果。

OpenGL?Shader抗鋸齒如何實現

擴展

清楚實現抗鋸齒原理之后,可以根據需要自行實現一個平滑過渡函數來實現抗鋸齒功能。類似像以下兩個自制平滑過渡函數最終實現效果幾乎看不出太大區別。

自制smoothstep函數抗鋸齒

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函數抗鋸齒

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

OpenGL?Shader抗鋸齒如何實現

linearstep

OpenGL?Shader抗鋸齒如何實現

以上是“OpenGL Shader抗鋸齒如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淄博市| 兰坪| 太原市| 伽师县| 丁青县| 南部县| 清新县| 博兴县| 南投市| 龙口市| 威宁| 晋江市| 潮安县| 离岛区| 将乐县| 平顶山市| 南木林县| 神池县| 全椒县| 虎林市| 饶河县| 黎城县| 克拉玛依市| 邵阳市| 新余市| 阜城县| 栾城县| 渭南市| 镇江市| 玉溪市| 平潭县| 榆林市| 永修县| 绥阳县| 和平区| 彭州市| 兴海县| 临朐县| 襄汾县| 崇义县| 南岸区|