ShaderToy學習筆記 02.圓

1. 畫圓

1.1. 圓的方程

圓的方程是:(x^2 + y^2 = r^2),其中(r)是圓的半徑。
我們可以使用 desmos 來驗證一下。
輸入 x^2 + y^2 -1=0,即可得到圓。
類似下圖

1.2. 畫圓的方式

  1. 畫圓:使用圓的方程,判斷每個像素點是否在圓內,在圓內則為白色,否則為黑色。
  2. 畫圓:使用圓的方程,判斷每個像素點到圓心的距離是否小于半徑,小于半徑則為白色,否則為黑色。

目前我們在畫圓時,先設定圓心在屏幕的中心(0,0)。
這樣的好處是 length(uv) 可以直接計算出像素點到圓心的距離。

1.3. 方式1 畫圓

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)//vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xy;vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xx;//    vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);//取x和y的最小值作為比例float c=0.;//默認黑色float r=0.3;//圓的半徑if( length(uv) < r )//矢量長度小于半徑,就為白色c=1.;// Output to screenfragColor = vec4(vec3(c),1.0);
}

注意:

1.4. 方式2 畫圓

如果代碼是如下形式,那么圓會變成橢圓,因為x和y的比例不一樣

vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xy;

1.5. 方式3 畫圓


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xx;//    vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);//取x和y的最小值作為比例float c=0.;//默認黑色float r=0.5;//圓的半徑c=1.-step(0.,length(uv)-r);// Output to screenfragColor = vec4(vec3(c),1.0);
}

注意:

  1. 在fragment shader中,盡量不要用if 語句,因為if語句會降低性能

1.6. 方式4 畫圓(平滑 smoothstep)


可以看到邊緣的30個像素是平滑過渡的

#define PIXW (1./iResolution.y)
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xx;float r=0.3;float c=smoothstep(0.,0.+30.*PIXW,length(uv)-r);// Output to screenfragColor = vec4(vec3(c),1.0);
}

1.7. 極坐標系

極坐標系是一種二維坐標系統,它用以確定平面上點的位置。與常用的笛卡爾坐標系不同,極坐標系使用一個距離和一個角度來描述點的位置。

在極坐標系中,每個點的位置由兩個數值定義:

  1. 徑向坐標(r):也稱為極徑,是從原點(也稱為極點)到該點的直線距離。
  2. 角坐標(θ):也稱為極角或方位角,是指從固定的參考方向(通常是正x軸)到通過原點和該點的線段之間所夾的角度。角坐標通常以弧度或度為單位。

因此,在極坐標系中,一個點的位置表示為 (P(r, \theta))。

極坐標系特別適用于那些具有圓形對稱性的問題,例如物理學中的圓周運動、工程學中的旋轉機械設計、以及數學中的某些類型的方程和圖形等。轉換公式如下:

  • 從極坐標到笛卡爾坐標的轉換:

    • (x = r \cdot \cos(\theta))
    • (y = r \cdot \sin(\theta))
  • 從笛卡爾坐標到極坐標的轉換:

    • (r = \sqrt{x^2 + y^2})
    • (\theta = \arctan2(y, x)),這里(\arctan2)函數用于根據x和y的值正確地確定角度,即使在x或y為零的情況下也能返回正確的象限。

在計算機圖形學、圖像處理以及游戲開發等領域,理解如何在不同坐標系之間轉換是非常有用的,尤其是在需要實現基于角度和距離的計算時,如光線追蹤、物理模擬、用戶界面設計等。

運行效果

#define PIXW (1./iResolution.y)
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{vec2 uv=(fragCoord.xy-.5*iResolution.xy)*PIXW;vec4 O=vec4(smoothstep(0.+10.*PIXW,0.,length(uv)-0.5));uv=vec2(length(uv),atan(-uv.y,-uv.x));//polar systemfragColor=mix(vec4(0),O,uv.y/6.28+.5);}

1.8. 參考資料

  1. shadertoy入門手冊1-掌控畫布

2. 移動圓

2.1. 圓的方程

圓的方程是:((x-offsetX)^2 + (y-offsetY)^2 = r^2),其中(r)是圓的半徑。
我們可以使用 desmos 來驗證一下。
((x-1)^2 + (y-1)^2 -1=0)
類似下圖

2.2. 思路

  1. 將uv坐標轉換成圓心坐標 (x,y) = (uv.x-offsetX,uv.y-offsetY)
  2. 計算 (x,y) 到圓心的距離 d
  3. 如果 d 小于半徑 r,則為白色,否則為黑色。

2.3. 將圓心移動到(0.3,0.3)

#define PIXW (1./iResolution.y)vec3 sdfCircle(vec2 uv, float r,vec2 offset)
{uv=uv-offset;float d=length(uv)-r;return d>0.?vec3(0.):vec3(1.);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);float r=0.3;vec3 c=sdfCircle(uv,r,vec2(0.3,0.3));// Output to screenfragColor = vec4(vec3(c),1.0);
}

2.4. 讓圓動起來

思路:

  1. 讓圓的圓心坐標隨著時間變化
  2. 讓圓的顏色隨著時間變化
#define PIXW (1./iResolution.y)vec3 sdfCircle(vec2 uv, float r,vec2 offset)
{uv=uv-offset;float d=length(uv)-r;return d>0.?vec3(0.):vec3(abs(sin(iTime*0.3)),abs(cos(iTime*0.3)),abs(sin(iTime*0.3)));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);float r=0.3;vec3 c=sdfCircle(uv,r,vec2(0.+sin(iTime)*0.2,0.+cos(iTime)*0.2));// Output to screenfragColor = vec4(vec3(c),1.0);
}

2.5. 畫兩個圓

思路:

  1. 背景為黑色,即vec(0.,0.,0.)
  2. 圓為非黑色
  3. 兩個圓的顏色相加,由于這兩個圓沒有重疊,所以顏色相加后,剛好會顯示出兩個圓

注: 這種方法,只適用于兩個圓沒有重疊且背景色為黑色這種簡單情況。后續會說明更通用的方法。

//顯示兩個圓
#define PIXW (1./iResolution.y)vec3 sdfCircle(vec2 uv, float r,vec2 offset)
{uv=uv-offset;float d=length(uv)-r;return d>0.?vec3(0.):vec3(abs(sin(iTime*0.3)),abs(cos(iTime*0.3)),abs(sin(iTime*0.3)));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);float r=0.3;vec3 c=sdfCircle(uv,r,vec2(0.5,0.5));c=c+sdfCircle(uv,r,vec2(-0.5,0.5));//c=max(c,sdfCircle(uv,r,vec2(-0.5,0.5)));// Output to screenfragColor = vec4(vec3(c),1.0);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77389.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文詳解卷積神經網絡中的卷積層和池化層原理 !!

文章目錄 前言 一、卷積核大小&#xff08;Kernel Size&#xff09; 1. 卷積核大小的作用 2. 常見的卷積核大小 3. 選擇卷積核大小的原則 二、步長&#xff08;Stride&#xff09; 1. Stride的作用 三、填充&#xff08;Padding&#xff09; 1. 填充的作用 四、通道數&#xff…

云+AI雙輪驅動,亞馬遜云科技加速中國企業出海新浪潮

導讀&#xff1a;全球化就是本地化 作者 | 小葳 圖片來源 | 攝圖 近年來&#xff0c;中國企業出海步伐不斷加快&#xff0c;“不出海&#xff0c;就出局”成為很多企業的共識。 據沙利文統計&#xff0c;2024年上半年&#xff0c;超過2000家中國上市企業布局海外市場&#xff…

C語言HashTable基本理解

文章目錄 一、哈希表概念1. 哈希表的基本概念2. 哈希表的核心組件2.1 哈希函數2.2 沖突處理&#xff08;哈希碰撞&#xff09; 3.哈希表的三種結構(1) 數組作為哈希表示例&#xff1a; 2. Set&#xff08;集合&#xff09;示例&#xff1a;查找數組中的重復元素1. Set 基礎概念…

【緩存與數據庫結合最終方案】偽從技術

實現偽從技術&#xff1a;基于Binlog的Following表變更監聽與緩存更新 技術方案概述 要實現一個專門消費者服務作為Following表的偽從&#xff0c;訂閱binlog并在數據變更時更新緩存&#xff0c;可以采用以下技術方案&#xff1a; 主要組件 MySQL Binlog監聽&#xff1a;使…

《100天精通Python——基礎篇 2025 第3天:變量與數據類型全面解析,掌握Python核心語法》

目錄 一、Python變量的定義和使用二、Python整數類型&#xff08;int&#xff09;詳解三、Python小數/浮點數&#xff08;float&#xff09;類型詳解四、Python復數類型(complex)詳解---了解五、Python字符串詳解(包含長字符串和原始字符串)5.1 處理字符串中的引號5.2 字符串的…

【前后端分離項目】Vue+Springboot+MySQL

文章目錄 1.安裝 Node.js2.配置 Node.js 環境3.安裝 Node.js 國內鏡像4.創建 Vue 項目5.運行 Vue 項目6.訪問 Vue 項目7.創建 Spring Boot 項目8.運行 Spring Boot 項目9.訪問 Spring Boot 項目10.實現 Vue 與 Spring Boot 聯動11.安裝 axios12.編寫請求13.調用函數請求接口14.…

線性代數(一些別的應該關注的點)

一、矩陣 矩陣運算&#xff1a;線性變換 縮放、平移、旋轉 無所不能的矩陣 - 三維圖形變換_嗶哩嗶哩_bilibili

01Redis快速入門(nosql、安裝redis、客戶端、命令及類型、java客戶端、序列化)

Redis的常見命令和客戶端使用 1.初識Redis Redis是一種鍵值型的NoSql數據庫&#xff0c;這里有兩個關鍵字&#xff1a; 鍵值型 NoSql 其中鍵值型&#xff0c;是指Redis中存儲的數據都是以key、value對的形式存儲&#xff0c;而value的形式多種多樣&#xff0c;可以是字符串…

AI編程:[體驗]從 0 到 1 開發一個項目的初體驗

一、開發信息 開發時間&#xff1a;1.5-2天工具使用&#xff1a; 不熟練&#xff0c;開發本項目前1天&#xff0c;才簡單使用了Cursor的功能 功能復雜度&#xff1a; 開發的功能相對簡單。頁面&#xff1a;2個&#xff0c;登錄頁面&#xff0c;個人中心頁面功能&#xff1a;5個…

LeetCode-392 判斷子序列

給定字符串 s 和 t &#xff0c;判斷 s 是否為 t 的子序列。 字符串的一個子序列是原始字符串刪除一些&#xff08;也可以不刪除&#xff09;字符而不改變剩余字符相對位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一個子序列&#…

Linux 系統監控大師:Glances 工具詳解助力自動化

看圖猜詩&#xff0c;你有任何想法都可以在評論區留言哦~ 摘要 Glances 是一款基于 Python 開發的跨平臺系統監控工具&#xff0c;集成了 CPU、內存、磁盤、網絡、進程等核心指標的實時監控能力&#xff0c;并支持命令行、Web界面、客戶端-服務器模式等多種使用場景。其輕量級…

Spring Boot 3.4.5 運行環境需求

&#x1f4dd; Spring Boot 3.4.5 運行環境要求 &#x1f33f; 1?? 基本需求 ?? JDK版本&#xff1a;最低 Java 17 &#x1f517; https://www.java.com/ 最高兼容至 Java 24 ?? 依賴框架&#xff1a;需搭配 Spring Framework 6.2.6 &#x1f517; https://docs.sprin…

在KEIL里C51和MDK兼容以及添加ARM compiler5 version編譯器

前言 我們想在一個keil里面可以打開32和51的文件&#xff0c;這樣就不需要兩個keil了 還有就是現在的keil&#xff0c;比如我用的是5.41的&#xff0c;就沒有5版本的處理器&#xff0c;所以要安裝 本篇文章我們來詳細講解如何實現上面說的兩個內容 準備的東西 1.ARM5編譯器 …

Flutter 彈窗隊列管理:支持優先級的線程安全通用彈窗隊列系統

在復雜的 Flutter 應用開發中&#xff0c;彈窗管理是一個常見難題。手動管理彈窗的顯示順序和條件判斷不僅繁瑣&#xff0c;還容易出錯。為此&#xff0c;我們實現了一個支持優先級的線程安全通用彈窗隊列管理系統。它能夠自動管理彈窗的顯示順序&#xff0c;支持條件判斷&…

鴻蒙NEXT開發剪貼板工具類(ArkTs)

import { pasteboard } from kit.BasicServicesKit; import { StrUtil } from ./StrUtil;/*** 剪貼板工具類* 需要權限&#xff1a;* ohos.permission.READ_PASTEBOARD // 允許應用讀取剪貼板。* author CSDN-鴻蒙布道師* since 2025/04/25*/ export class PasteboardUtil {…

FastAPI 零基礎入門指南:10 分鐘搭建高性能 API

一、為什么選擇 FastAPI&#xff1f; 想象一下&#xff0c;用 Python 寫 API 可以像搭積木一樣簡單&#xff0c;同時還能擁有媲美 Go 語言的性能&#xff0c;這個框架憑借三大核心優勢迅速風靡全球&#xff1a; 開發效率提升 3 倍&#xff1a;類型注解 自動文檔&#xff0c;…

【算法】BFS-解決FloodFill問題

目錄 FloodFill問題 圖像渲染 島嶼數量 島嶼的最大面積 被圍繞的區域 FloodFill問題 FloodFill就是洪水灌溉的意思&#xff0c;假設有下面的一塊田地&#xff0c;負數代表是凹地&#xff0c;正數代表是凸地&#xff0c;數字的大小表示凹或者凸的程度。現在下一場大雨&…

代碼隨想錄算法訓練營第三十七天|動態規劃part4

1049. 最后一塊石頭的重量 II 題目鏈接&#xff1a; 1049. 最后一塊石頭的重量 II - 力扣&#xff08;LeetCode&#xff09; 文章講解&#xff1a; 代碼隨想錄 思路&#xff1a; 理解為把石頭分成兩堆 使得兩堆的差值盡可能小 求這個最小值1 理解為往背包里裝物品 每個物品的…

(八)深入了解AVFoundation-采集:拍照功能的實現

引言 在上一篇文章中&#xff0c;我們初步完成了使用 AVFoundation 采集視頻數據的流程&#xff0c;掌握了 AVCaptureSession 的搭建與視頻流的預覽顯示。 本篇將繼續深入 AVFoundation&#xff0c;聚焦于靜態圖片采集的實現。通過 AVCapturePhotoOutput&#xff0c;我們可以…

git tag使用場景和實踐

背景 每次上線一個迭代&#xff0c;為了區分本次代碼的分支是哪個迭代的commit&#xff0c;可以給分支打上tag&#xff0c;這樣利于追蹤分支所屬迭代&#xff0c;如果devops沒有自動給分支打tag&#xff0c;需要自己來打 操作 1.查看當前tag git tag2.給分支打tag git tag…