精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

著色器入門:符號距離函數!

開發 后端
在本文中,我將介紹我用來學習編寫簡單著色器的步驟,并努力讓你們相信著色器并不難入門!

[[441677]]

大家好!不久前我學會了如何使用著色器制作有趣的閃亮旋轉八面體:

我的著色器能力仍然非常基礎,但事實證明制作這個有趣的旋轉八面體比我想象中要容易得多(從其他人那里復制了很多代碼片段!)。

我在做這件事時, 從一個非常有趣的叫做 符號距離函數教程:盒子和氣球 的教程中學到了“符號距離函數”的重要思路。

在本文中,我將介紹我用來學習編寫簡單著色器的步驟,并努力讓你們相信著色器并不難入門!

更高級著色器的示例

如果你還沒有看過用著色器做的真正有趣的事情,這里有幾個例子:

  1. 這個非常復雜的著色器就像一條河流的真實視頻:https://www.shadertoy.com/view/Xl2XRW
  2. 一個更抽象(更短!)有趣的著色器,它有很多發光的圓圈:https://www.shadertoy.com/view/lstSzj

步驟一:我的第一個著色器

我知道你可以在 shadertoy 上制作著色器,所以我去了 https://www.shadertoy.com/new。它們提供了一個默認著色器,

代碼如下:

  1. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  2. {
  3. // 規范像素坐標 (從 0 到 1)
  4. vec2 uv = fragCoord / iResolution.xy;
  5.  
  6. // 隨時間改變像素顏色
  7. vec3 col = 0.5 + 0.5 * cos(iTime + uv.xyx + vec3(0, 2, 4));
  8.  
  9. // 輸出到屏幕
  10. fragColor = vec4(col, 1.0);
  11. }

雖然還沒有做什么令人興奮的事情,但它已經教會了我著色器程序的基本結構!

思路:將一對坐標(和時間)映射到一個顏色

這里的思路是獲得一對坐標作為輸入(fragCoord),你需要輸出一個 RGBA 向量作為此坐標的顏色。該函數也可以使用當前時間(iTime),圖像從而可以隨時間變化。

這種編程模型(將一對坐標和時間映射到其中)的巧妙之處在于,它非常容易并行化。我對 GPU 了解不多,但我的理解是,這種任務(一次執行 10000 個微不足道的可并行計算)正是 GPU 擅長的事情。

步驟二:使用 shadertoy-render 加快開發迭代

玩了一段時間的 shadertoy 之后,我厭倦了每次保存我的著色器時都必須在 shadertoy 網站上單擊“重新編譯”。

我找到了一個名為 shadertoy-render 命令行工具,它會在每次保存時實時查看文件并更新動畫。現在我可以運行:

  1. shadertoy-render.py circle.glsl

并更快地開發迭代!

步驟三:畫一個圓圈

接下來我想 —— 我擅長數學!我可以用一些基本的三角學來畫一個會彈跳的彩虹圈!

我知道圓的方程為(x^2 + y^2 = 任意正數!),所以我寫了一些代碼來實現它:

代碼如下:(你也可以 在 shadertoy 上查看

  1. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  2. {
  3. // 規范像素坐標 (從 0 到 1)
  4. vec2 uv = fragCoord / iResolution.xy;
  5. // 繪制一個中心位置依賴于時間的圓
  6. vec2 shifted = uv - vec2((sin(iGlobalTime) + 1) / 2, (1 + cos(iGlobalTime)) / 2);
  7. if (dot(shifted, shifted) < 0.03) {
  8. // 改變像素顏色
  9. vec3 col = 0.5 + 0.5 * cos(iGlobalTime + uv.xyx + vec3(0, 2, 4));
  10. fragColor = vec4(col, 1.0);
  11. } else {
  12. // 使圓之外的其他像素都是黑色
  13. fragColor = vec4(0,0, 0, 1.0);
  14. }
  15. }

代碼將坐標向量 fragCoord 與自身點積,這與計算 x^2 + y^2 相同。我還在這個圓圈的中心玩了一點花活 – 圓心為 vec2((sin(iGlobalTime) + 1)/ 2,(1 + cos(faster)) / 2,這意味著圓心也隨著時間沿另一個圓移動。

著色器是一種學習數學的有趣方式!

我覺得有意思的(即使我們沒有做任何超級高級的事情!)是這些著色器為我們提供了一種有趣的可視化方式學習數學 - 我用 sin 和 cos 來使某些東西沿著圓移動,如果你想更直觀地了解三角函數的工作方式, 也許編寫著色器會是一種有趣的方法!

我喜歡的是,可以獲得有關數學代碼的即時視覺反饋 - 如果你把一些東西乘以 2,圖像里的東西會變得更大!或更小!或更快!或更慢!或更紅!

但是我們如何做一些真正有趣的事情呢?

這個會彈跳的圓圈很好,但它與我見過的其他人使用著色器所做的非常奇特的事情相去甚遠。那么下一步要做什么呢?

思路:不要使用 if 語句,而是使用符號距離函數!

在我上面的圓圈代碼中,我基本上是這樣寫的:

  1. if (dot(uv, uv) < 0.03) {
  2. // 圓里的代碼
  3. } else {
  4. // 圓外的代碼
  5. }

但問題(也是我感到卡住的原因)是不清楚如何將它推廣到更復雜的形狀!編寫大量的 if 語句似乎不太好用。那人們要如何渲染這些 3d 形狀呢?

所以!符號距離函數Signed distance function 是定義形狀的另一種方式。不是使用硬編碼的 if 語句,而是定義一個 函數,該函數告訴你,對于世界上的任何一個點,該點與你的形狀有多遠。比如,下面是球體的符號距離函數。

  1. float sdSphere( vec3 p, float center )
  2. {
  3. return length(p) - center;
  4. }

符號距離函數非常棒,因為它們:

  • 易于定義!
  • 易于組合!如果你想要一個被切去一塊的球體, 你可以用一些簡單的數學來計算并集/交集/差集。
  • 易于旋轉/拉伸/彎曲!

制作旋轉陀螺的步驟

當我開始時,我不明白需要編寫什么代碼來制作一個閃亮的旋轉東西。結果表明如下是基本步驟:

  1. 為想要的形狀創建一個符號距離函數(在我的例子里是八面體)
  2. 光線追蹤符號距離函數,以便可以在 2D 圖片中顯示它(或沿光線行進?我使用的教程稱之為光線追蹤,我還不明白光線追蹤和光線行進之間的區別)
  3. 編寫代碼處理形狀的表面紋理并使其發光

我不打算在本文中詳細解釋符號距離函數或光線追蹤,因為我發現這個 關于符號距離函數的神奇教程 非常友好,老實說,它比我做的更好,它解釋了如何執行上述 3 個步驟,并且代碼有大量的注釋,非常棒。

步驟四:復制教程代碼并開始更改內容

我在這里使用了久負盛名的編程實踐,即“復制代碼并以混亂的方式更改內容,直到得到我想要的結果”。

最后一堆閃亮的旋轉八面體著色器在這里:https://www.shadertoy.com/view/wdlcR4

為了做到這一點,我基本上只是復制了關于符號距離函數的教程,該函數根據符號距離函數呈現形狀,并且:

  • 將 sdfBalloon 更改為 sdfOctahedron,并使八面體旋轉而不是在我的符號距離函數中靜止不動
  • 修改 doBalloonColor 著色功能,使其有光澤
  • 有很多八面體而不是一個

使八面體旋轉!

下面是我用來使八面體旋轉的代碼!事實證明這真的很簡單:首先從 這個頁面 復制一個八面體符號距離函數,然后添加一個 rotate 使其根據時間旋轉,然后它就可以旋轉了!

  1. vec2 sdfOctahedron( vec3 currentRayPosition, vec3 offset ){
  2. vec3 p = rotate((currentRayPosition), offset.xy, iTime * 3.0) - offset;
  3. float s = 0.1; // s 是啥?
  4. p = abs(p);
  5. float distance = (p.x + p.y + p.z - s) * 0.57735027;
  6. float id = 1.0;
  7. return vec2( distance, id );
  8. }

用一些噪音讓它發光

我想做的另一件事是讓我的形狀看起來閃閃發光/有光澤。我使用了在 這個 GitHub gist 中找到的噪聲函數使表面看起來有紋理。

以下是我如何使用噪聲函數的代碼。基本上,我只是隨機地將參數更改為噪聲函數(乘以 2?3?1800?隨你!),直到得到喜歡的效果。

  1. float x = noise(rotate(positionOfHit, vec2(0, 0), iGlobalTime * 3.0).xy * 1800.0);
  2. float x2 = noise(lightDirection.xy * 400.0);
  3. float y = min(max(x, 0.0), 1.0);
  4. float y2 = min(max(x2, 0.0), 1.0);
  5. vec3 balloonColor = vec3(y, y + y2, y + y2);

編寫著色器很有趣!

上面就是全部的步驟了!讓這個八面體旋轉并閃閃發光使我很開心。如果你也想用著色器制作有趣的動畫,希望本文能幫助你制作出很酷的東西!

通常對于不太了解的主題,我可能在文章中說了至少一件關于著色器的錯誤事情,請讓我知道錯誤是什么!

再說一遍,如下是我用到的兩個資源:

  1. “符號距離函數教程:盒子和氣球”:https://www.shadertoy.com/view/Xl2XWt(修改和玩起來真的很有趣)
  2. 可以將大量符號距離函數復制并粘貼到你的代碼中:http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm

   

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2017-01-11 19:15:55

Android著色器Tint

2013-01-30 15:37:19

CSS著色器HTML5

2021-03-18 08:03:58

SteamMesa緩存

2023-04-12 07:46:24

JavaScriptWebGL

2023-10-16 15:58:54

開源Blender

2017-05-08 11:41:37

WebGLThree.js

2013-04-15 14:23:21

2022-09-26 12:28:16

OpenGLAPI使用移動應用

2023-11-15 14:15:03

開源Blender

2023-03-16 14:33:23

WebGL初始化繪制

2023-05-06 07:23:57

2022-10-10 09:01:21

JavaQuarkus

2025-01-08 10:17:11

2009-12-29 16:21:46

silverlight

2025-06-03 14:14:59

智能技術AI

2019-07-10 16:45:49

LinuxLinux游戲游戲性能

2024-02-26 00:00:00

前端工具Space.js

2023-09-04 06:52:28

AMD銳龍GPU

2012-05-22 01:20:14

SyntaxHighlJavaScriptJava

2024-11-15 09:00:00

云計算云平臺
點贊
收藏

51CTO技術棧公眾號

亚洲午夜久久久久久久久电影网| 亚洲激情网站| 欧美精品乱码久久久久久| 伊甸园精品99久久久久久| www五月婷婷| 亚洲影音一区| 久久国产精品久久精品| 成人无码www在线看免费| www成人在线视频| 亚洲精品亚洲人成人网| 麻豆精品传媒视频| 国产偷拍一区二区| 国产日韩欧美一区| xxxx性欧美| 色呦呦一区二区| 国产欧美日韩视频一区二区三区| 欧美 日韩 国产 成人 在线观看 | 国产精品一区二区av交换| 欧美日韩在线免费视频| 成熟丰满熟妇高潮xxxxx视频| 91欧美在线视频| bt欧美亚洲午夜电影天堂| 国产欧美日韩亚洲精品| 日韩欧美中文字幕一区二区| 色综合天天爱| 亚洲人成人99网站| 白嫩情侣偷拍呻吟刺激| 24小时成人在线视频| 日韩欧美成人精品| 拔插拔插海外华人免费| 女女色综合影院| 国产日韩精品久久久| 狠狠色综合色区| 精品国产无码AV| 久久99久久99小草精品免视看| 26uuu另类亚洲欧美日本一| 欧美人妻精品一区二区免费看| 欧美熟乱15p| 亚洲欧美制服中文字幕| 鲁大师私人影院在线观看| 北条麻妃在线一区二区免费播放| 91麻豆精品国产自产在线观看一区 | 中文字幕日韩精品无码内射| 成人在线观看黄色| 久久久美女艺术照精彩视频福利播放| 成人有码在线播放| 亚洲视频一区在线播放| 日韩和欧美一区二区三区| 青青久久av北条麻妃黑人| 日韩av无码中文字幕| 激情综合自拍| 在线电影一区| 国产精品国产三级国产| 欧美综合激情| 亚洲欧美日韩不卡| 国产伦精品一区二区三区88av| 精品av综合导航| 亚洲丝袜在线观看| 精品国产一区二区三区2021| 欧美人动与zoxxxx乱| 久热精品在线播放| 欧美黑粗硬大| 欧美精品1区2区3区| 中文字幕日韩综合| 国产美女精品视频免费播放软件| 91精品国产欧美日韩| 黄色片免费网址| 久久精品九色| 精品99久久久久久| 添女人荫蒂视频| 免费一区二区| 最近2019年日本中文免费字幕| 日日碰狠狠添天天爽| 天天综合网91| 欧美激情精品久久久久久变态| 久久综合激情网| 亚洲精品精选| 国产高清在线不卡| 国产又黄又大又爽| 国产·精品毛片| 免费电影一区| 免费在线观看黄| 亚洲一区二区三区三| 日韩国产欧美亚洲| 中文字幕色婷婷在线视频| 欧美三区免费完整视频在线观看| 亚洲精品mv在线观看| 涩爱av色老久久精品偷偷鲁| 日韩毛片在线看| 亚洲天堂岛国片| 欧美黄色精品| 欧美亚洲另类激情另类| 亚洲天堂777| 成人妖精视频yjsp地址| 日本视频一区在线观看| 粗大黑人巨茎大战欧美成人| 亚洲成a人在线观看| 激情内射人妻1区2区3区 | 91国偷自产一区二区三区的观看方式| 麻豆成人免费视频| 国产精品一区二区不卡| 欧美成ee人免费视频| sm国产在线调教视频| 污片在线观看一区二区| 亚洲天堂av一区二区| 欧美尿孔扩张虐视频| 久久精品国产v日韩v亚洲| 日本少妇激情舌吻| 久久66热re国产| 欧美xxxx黑人又粗又长密月| 最爽无遮挡行房视频在线| 日韩欧美精品网址| 成人做爰69片免费| 99久久综合| 欧美一区亚洲一区| 精品人妻伦一区二区三区久久| 日本一区二区免费在线观看视频 | 青青草国产精品97视觉盛宴| 国产二区一区| 免费不卡视频| 欧美在线观看视频在线| 性久久久久久久久久久| 中文字幕免费精品| 国产精品视频一| 九一国产在线| 欧美日韩国产激情| 女性生殖扒开酷刑vk| 亚洲精品国产首次亮相| 国产精品一区二区久久国产| 欧洲亚洲精品视频| 天天综合色天天综合| 少妇极品熟妇人妻无码| 性xxxx欧美老肥妇牲乱| 国产精品视频一区二区高潮| 成人午夜电影在线观看| 一本大道综合伊人精品热热 | 国产精品久久久久久69| 国产精品全国免费观看高清| 人妻丰满熟妇av无码区app| 欧美福利在线播放网址导航| 久久久久久久色| 欧美另类极品videosbest最新版本| 91视频在线网站| 妖精视频成人观看www| 成人动漫视频在线观看完整版| a视频在线观看免费| 欧美日韩成人高清| www成人啪啪18软件| 日本美女一区二区三区视频| 神马影院一区二区| 国产第一精品| 中文字幕欧美国内| 一级黄色大毛片| 成人免费小视频| 亚洲在线观看网站| 中文字幕日韩一区二区不卡| 5566av亚洲| 欧美家庭影院| 亚洲福利精品在线| 午夜毛片在线观看| 久久精品视频网| 天天影视综合色| 日韩综合在线观看| 日韩综合一区二区| 一区二区三区四区国产| 亚洲欧洲二区| 欧美精品在线视频观看| 亚洲国产成人在线观看| 婷婷综合久久一区二区三区| 国产精品三级在线观看无码| 噜噜噜在线观看免费视频日韩| 欧洲亚洲一区二区三区四区五区| 97人人做人人爽香蕉精品| 日韩视频亚洲视频| 好男人www在线视频| 欧美日韩人人澡狠狠躁视频| 国产精品美女高潮无套| 激情文学综合插| 丁香花在线影院观看在线播放| 神马日本精品| 国产在线观看不卡| 波多野结衣在线高清| 亚洲欧洲免费视频| 国产三级小视频| 欧美日韩亚洲精品内裤| 中文字幕91视频| 成人免费观看视频| 国产男女激情视频| 中文字幕乱码亚洲无线精品一区| 精品乱码一区二区三区| 欧美成人aaa| 久久免费观看视频| 国内在线精品| 日韩欧美国产电影| 日韩黄色一级视频| 亚洲码国产岛国毛片在线| 艳妇乳肉亭妇荡乳av| 老司机一区二区| 日韩一级性生活片| 欧美伦理影院| 国产一区二区三区av在线| 日韩成人亚洲| 性欧美长视频免费观看不卡 | 久久亚洲国产成人| 四虎影视在线播放| 91精品欧美福利在线观看| 亚洲永久精品在线观看| 亚洲你懂的在线视频| 精品无人区无码乱码毛片国产| 国产精品一色哟哟哟| 日本www高清视频| 国产精品第十页| 一级二级三级欧美| 欧美精美视频| 精品国产免费久久久久久尖叫| 97久久精品一区二区三区的观看方式| 欧美综合第一页| 亚洲人成网站在线观看播放| 国产亚洲人成a在线v网站| 97成人精品区在线播放| 天天色天天射天天综合网| 国产亚洲精品va在线观看| 蜜桃91麻豆精品一二三区| 8x福利精品第一导航| 中文字幕精品一区二| 日韩欧美国产骚| 免费看日韩毛片| 亚洲一区二区三区三| 深夜福利影院在线观看| 亚洲欧洲另类国产综合| 日本污视频网站| 久久久精品人体av艺术| 野外性满足hd| 91麻豆国产香蕉久久精品| 风韵丰满熟妇啪啪区老熟熟女| 国产尤物一区二区在线| www.国产福利| 国内成+人亚洲+欧美+综合在线| www.激情小说.com| 日韩福利视频导航| 色婷婷狠狠18| 麻豆视频观看网址久久| 91人人澡人人爽人人精品| 日韩精品电影在线观看| 国产主播中文字幕| 日韩av电影免费观看高清完整版| 无码aⅴ精品一区二区三区浪潮| 亚洲人www| 亚欧无线一线二线三线区别| 一本久久综合| 超碰网在线观看| 日韩激情视频在线观看| 中文字幕第36页| 麻豆精品在线视频| 国产美女视频免费看| 国产精一区二区三区| 久草免费资源站| 91香蕉国产在线观看软件| 亚洲精品成人无码熟妇在线| 久久精品亚洲乱码伦伦中文| 日本不卡一区视频| 中文字幕亚洲欧美在线不卡| 日本天堂中文字幕| 亚洲大型综合色站| 亚洲欧美综合另类| 欧美日韩久久一区二区| 国产精品一级视频| 精品噜噜噜噜久久久久久久久试看| 免费看黄色一级视频| 亚洲精品在线91| 99免在线观看免费视频高清| 久久视频精品在线| av剧情在线观看| 国产97在线播放| 四虎精品在线观看| 国产成人精品免费视频大全最热 | 亚洲国产天堂网精品网站| 午夜影院免费视频| 中文字幕国产精品| 亚洲区欧洲区| 青草成人免费视频| 在线日韩三级| 国产日韩亚洲精品| 欧美久久综合网| 日韩a级黄色片| 久久夜色精品| 潘金莲一级淫片aaaaa| 久久久久国产精品麻豆ai换脸| 少妇高潮在线观看| 午夜精品福利在线| 亚洲综合五月天婷婷丁香| 精品免费国产一区二区三区四区| 免费黄色片在线观看| 美女av一区二区| 女生影院久久| 91蜜桃网站免费观看| 九九久久婷婷| 黄网站色视频免费观看| 秋霞午夜鲁丝一区二区老狼| 欧美激情一区二区三区p站| 国产欧美日韩综合精品一区二区| 久久精品www| 欧美日本视频在线| 日本天堂影院在线视频| 久久99青青精品免费观看| 浪潮色综合久久天堂| 成人影片在线播放| 午夜影院欧美| 少妇性l交大片| 99久久综合狠狠综合久久| √天堂中文官网8在线| 婷婷久久综合九色综合伊人色| 图片区小说区区亚洲五月| 最近国产精品视频| 青青青在线观看视频| 美腿丝袜在线亚洲一区| 亚洲av成人片色在线观看高潮| 亚洲人成亚洲人成在线观看图片 | 欧美美女网站色| 国产在线中文字幕| 91精品国产亚洲| 成人激情自拍| 成人区一区二区| 国产自产视频一区二区三区| 国产三级黄色片| 欧美性生活大片视频| 国产一区精品| 秋霞成人午夜鲁丝一区二区三区| 国产伦理久久久久久妇女 | 丁香花在线观看完整版电影| 91精品啪在线观看麻豆免费| 精品国产精品国产偷麻豆| 日本日本19xxxⅹhd乱影响| eeuss鲁片一区二区三区在线观看 eeuss影院一区二区三区 | 亚洲精品专区| 色黄视频免费看| 17c精品麻豆一区二区免费| 69亚洲精品久久久蜜桃小说| 亚洲精品在线三区| 岛国毛片av在线| 国产在线一区二| 亚洲美女色禁图| 精品国产一区在线| 同产精品九九九| 青青国产在线| 欧美一区二区大胆人体摄影专业网站| 美女视频亚洲色图| 免费无码av片在线观看| 久久老女人爱爱| 中文字幕在线日本| 一区二区在线视频| 九九热这里有精品| dy888午夜| 福利一区二区在线| 日韩手机在线观看| 亚洲精品中文字幕有码专区| 二吊插入一穴一区二区| 亚洲亚洲精品三区日韩精品在线视频| 欧美aaaaaa午夜精品| 日本美女黄色一级片| 日韩一区和二区| av在线加勒比| 蜜桃臀一区二区三区| 免费看黄色91| 欧美性猛交xxxxx少妇| 亚洲国产精品美女| 亚洲最大网站| 一个色的综合| 成人小视频免费在线观看| 国产又爽又黄的视频| 在线成人一区二区| 日本综合精品一区| 亚洲美免无码中文字幕在线| 久久精品亚洲乱码伦伦中文| 一级特黄色大片| 久久久综合av| 成人3d动漫在线观看| 中文字幕人妻无码系列第三区| 亚瑟在线精品视频| h视频在线免费| 亚洲最大的网站| 久久久水蜜桃av免费网站| www.av免费| 日韩av在线一区| 日本电影久久久| 精品少妇人妻av免费久久洗澡| 久久久久久久综合狠狠综合| 国产精品丝袜黑色高跟鞋| 精品综合久久久久久97| 免费看日本一区二区| 1314成人网| 在线看国产日韩| 色综合999| 亚洲国产精品一区在线观看不卡| 成人妖精视频yjsp地址| 中文在线免费观看| 国产+人+亚洲| 围产精品久久久久久久| 大黑人交xxx极品hd| 日韩午夜在线观看|