圖形學初識--紋理采樣和Wrap方式

文章目錄

  • 前言
  • 正文
    • 1、為什么需要紋理采樣?
    • 2、什么是紋理采樣?
    • 3、如何進行紋理采樣?
        • (1)假設繪制區域為矩形
        • (2)假設繪制區域為三角形
    • 4、什么是紋理的Wrap方式?
    • 5、有哪些紋理的Wrap方式?
        • (1)Repeat
        • (2)Mirror_Repeat
        • (3)Clamp_To_Edge
        • (4)Clamp_To_Border
    • 6、如何實現紋理的Wrap方式?
        • (1)Repeat
        • (2)Mirror_Repeat
  • 結尾:喜歡的小伙伴可以點點關注+贊哦

前言

上節講述了雙線性插值算法,雖然也有提到主要應用的點就是紋理采樣,但是對于這一塊有些小小白可能還不了解,所以這一節補充一下紋理采樣的內容!

請叫我貼心航火火!夢想為小白而生!

正文

1、為什么需要紋理采樣?

想象一個場景: 如果有這么一個需求,需要在屏幕的一塊400x400目標區域顯示一張圖片,正好這張圖片的尺寸也是400x400像素,怎么做?

答: 啥都不需要做,是的,根本不需要做什么處理,直接一一對應像素顯示即可!

但是,實際情況中,往往幾乎不可能這么巧合的一一對應,要么紋理圖片過大,要么紋理圖片過小,沒法一一對應,怎么辦呢?

答: 通過引入一種機制,進行等比例對應,這就是uv坐標的由來,它本質上就表示百分比,一般地,uv坐標的標準取值范圍是:0.0 - 1.0。

舉個紋理圖片過小的例子,如下圖: 當我們需要繪制 400x400 窗口區域圖片紋理大小是 200x200,如果要在窗口 (20, 20) 位置繪制,那么我們就相當于取紋理圖片的 ( 20 / 400 , 20 / 400 ) = ( 0.05 , 0.05 ) (20 / 400 , 20 / 400) = (0.05, 0.05) (20/400,20/400)=(0.05,0.05) 比例位置的像素數據,也就是 ( 0.05 ? 200 , 0.05 ? 200 ) = ( 10 , 10 ) (0.05 * 200,0.05 * 200) = (10, 10) (0.05?2000.05?200)=(10,10) 位置的數據!這里的 ( 0.05 , 0.05 ) (0.05, 0.05) (0.05,0.05)? 其實就是uv坐標!

在這里插入圖片描述

這里引申一下,由于上述舉的例子是繪制區域大,紋理圖片小。所以自然而然會存在多個繪制區域對應一個紋理像素位置的情況。這時候就應用到上節的內容。是直接采用最鄰近的采樣方式,還是雙線性插值的方式,來緩解像素化的情況,取決于自身的需求!

2、什么是紋理采樣?

在屏幕上某一像素繪制時,根據像素所在位置,去圖片上尋找對應像素值的過程,這個過程就是紋理采樣!如下圖所示:

在這里插入圖片描述

3、如何進行紋理采樣?

其實需要采樣的情形無非就是兩種情況,上面也說了!紋理太大或太大。這里咱們只說紋理太小的情況,需要用到上一節的雙線性插值的知識。

紋理太大的時,解決的思路無非就是讓紋理變小,變到一個最適合繪制窗口的大小。如果想要適應各種繪制窗口大小,就需要利用MipMap的知識,后面章節有空的話,會把這部分給補上哦,童鞋們!

(1)假設繪制區域為矩形

需要在一個分辨率為 screen_width X screen_height 的矩形窗口區域繪制一張圖片,這張圖片分辨率為picture_width X picture_height,假設繪制區域左下角的uv坐標為 ( u x 0 , u y 0 ) (u_{x0}, u_{y0}) (ux0?,uy0?),右上角的uv坐標為 ( u x 1 , u y 1 ) (u_{x1}, u_{y1}) (ux1?,uy1?) ,且滿足 0 = < u x 0 、 u x 1 、 u y 0 、 u y 1 < = 1.0 0 =< u_{x0}、u_{x1}、u_{y0}、u_{y1} <= 1.0 0=<ux0?ux1?uy0?uy1?<=1.0 ,則對于任何繪制區域坐標為 ( x , y ) (x,y) (x,y)? 的uv坐標為
u x = x s c r e e n _ w i d t h ? u x 1 + ( 1 ? x s c r e e n _ w i d t h ) ? u x 0 u y = y s c r e e n _ h e i g h t ? u y 1 + ( 1 ? y s c r e e n _ h e i g h t ) ? u y 1 u_x = \frac{x}{screen\_width} *u_{x1} + (1 - \frac{x}{screen\_width}) * u_{x0}\\ u_y = \frac{y}{screen\_height} *u_{y1} + (1 - \frac{y}{screen\_height}) * u_{y1}\\ ux?=screen_widthx??ux1?+(1?screen_widthx?)?ux0?uy?=screen_heighty??uy1?+(1?screen_heighty?)?uy1?
既然已經有了繪制區域每一個位置的uv坐標,咱么只需要根據uv坐標,去紋理圖片進行采樣像素值即可,至于采取何種采樣方法,可以參考上一片文章,既可以采用最鄰近取整的方式,也可以采取雙線性插值的方式!這里根據用戶需求,自行決定,不多贅述!

(2)假設繪制區域為三角形

給定三個頂點 p 1 = ( x 1 , y 1 ) 、 p 2 = ( x 2 , y 2 ) 、 p 3 = ( x 3 , y 3 ) p1 = (x_1,y_1)、p2 = (x_2,y_2)、p3 = (x_3,y_3) p1=(x1?,y1?)p2=(x2?,y2?)p3=(x3?,y3?) 并且給定三個頂點的uv坐標分別為 u 1 = ( u x 1 , u y 1 ) , u 2 = ( u x 2 , u y 2 ) , u 3 = ( u x 3 , u y 3 ) u_1 = (u_{x1},u_{y1}),u_2 = (u_{x2},u_{y2}),u_3 = (u_{x3},u_{y3}) u1?=(ux1?,uy1?),u2?=(ux2?,uy2?),u3?=(ux3?,uy3?),如何得知三角形內每一個頂點 p ( x , y ) p(x,y) p(x,y) 的uv坐標呢?

這時候重心坐標插值公式,又派上用上了,之前的章節已經介紹過,就不過多闡釋了!

這時候 每一個三角形內的頂點 p ( x , y ) p(x,y) p(x,y) 的uv坐標 u p = α u 1 + β u 2 + γ u 3 u_p = \alpha u_1 + \beta u_2 +\gamma u_3 up?=αu1?+βu2?+γu3? ,三個系數根據重心坐標公式即可算得!這時候同樣,根據uv坐標去紋理圖片進行采樣像素值即可!

簡單給個參考圖:

在這里插入圖片描述

4、什么是紋理的Wrap方式?

雖然標準規定的uv坐標范圍為: ( 0.0 , 1.0 ) (0.0, 1.0) (0.0,1.0) ,但是如果越界了,對應的uv坐標的采樣值如何取呢?這個問題的答案就是紋理的Wrap屬性!

5、有哪些紋理的Wrap方式?

常見的Wrap方式有四種:

  • Repeat
  • Mirror_Repeat
  • Clamp_To_Edge
  • Clamp_To_Border

這里分別簡單介紹并給出示例圖:

(1)Repeat

超出部分,不斷循環重復

在這里插入圖片描述

(2)Mirror_Repeat

超出部分,不斷循環鏡像重復

在這里插入圖片描述

(3)Clamp_To_Edge

紋理坐標會被約束在0到1之間,超出的部分會重復紋理坐標的邊緣,產生一種邊緣被拉伸的效果

在這里插入圖片描述

(4)Clamp_To_Border

超出的坐標為用戶指定的邊緣顏色

在這里插入圖片描述

6、如何實現紋理的Wrap方式?

上述的第(3)和第(4)很好理解,咱們就討論下第(1)種和第(2)種的計算方式吧!

(1)Repeat

計算公式:
記 f ( x ) 函數表示取浮點數 x 的小數部分 , 則坐標 ( u x , u y ) 的最終坐標為 u x = f ( f ( u x ) + 1 ) u y = f ( f ( u y ) + 1 ) 記f(x)函數表示取浮點數x的小數部分,則坐標(u_x, u_y)的最終坐標為\\ u_x = f(\ f(u_x) + 1\ )\\ u_y = f(\ f(u_y) + 1\ ) f(x)函數表示取浮點數x的小數部分,則坐標(ux?,uy?)的最終坐標為ux?=f(?f(ux?)+1?)uy?=f(?f(uy?)+1?)

舉例佐證:

  • ( 1.2 , 2.2 ) = > ( f ( 0.2 + 1 ) , f ( 0.2 + 1 ) ) = > ( 0.2 , 0.2 ) (1.2, 2.2) => (\ f(0.2 + 1),f(0.2 + 1)\ ) => (0.2, 0.2) (1.2,2.2)=>(?f(0.2+1),f(0.2+1)?)=>(0.2,0.2) ok

  • ( 0.3 , 0.8 ) = > ( f ( 0.3 + 1 ) , f ( 0.8 + 1 ) ) = > ( 0.3 , 0.8 ) (0.3, 0.8) => (\ f(0.3 + 1),f(0.8 + 1)\ ) => (0.3, 0.8) (0.3,0.8)=>(?f(0.3+1),f(0.8+1)?)=>(0.3,0.8) ok

  • ( ? 0.5 , ? 2.2 ) = > ( f ( ? 0.5 + 1 ) , f ( ? 0.2 + 1 ) ) = > ( 0.5 , 0.8 ) (-0.5, -2.2) => (\ f(-0.5 + 1),f(-0.2 + 1)\ ) => (0.5, 0.8) (?0.5,?2.2)=>(?f(?0.5+1),f(?0.2+1)?)=>(0.5,0.8) ok

(2)Mirror_Repeat

計算公式:
記 f ( x ) 函數表示取浮點數 x 的小數部分 , 則坐標 ( u x , u y ) 的最終坐標為 u x = 1 ? f ( f ( u x ) + 1 ) u y = 1 ? f ( f ( u y ) + 1 ) 記f(x)函數表示取浮點數x的小數部分,則坐標(u_x, u_y)的最終坐標為\\ u_x = 1 - f(\ f(u_x) + 1\ )\\ u_y = 1 - f(\ f(u_y) + 1\ ) f(x)函數表示取浮點數x的小數部分,則坐標(ux?,uy?)的最終坐標為ux?=1?f(?f(ux?)+1?)uy?=1?f(?f(uy?)+1?)

舉例佐證:

  • ( 1.2 , 2.2 ) = > ( 1 ? f ( 0.2 + 1 ) , 1 ? f ( 0.2 + 1 ) ) = > ( 1 ? 0.2 , 1 ? 0.2 ) = > ( 0.8 , 0.8 ) (1.2, 2.2) => (\ 1 - f(0.2 + 1),1 - f(0.2 + 1)\ ) => (1 - 0.2, 1 - 0.2) => (0.8,0.8) (1.2,2.2)=>(?1?f(0.2+1),1?f(0.2+1)?)=>(1?0.2,1?0.2)=>(0.8,0.8) ok
  • ( 0.3 , 0.8 ) = > ( 1 ? f ( 0.3 + 1 ) , 1 ? f ( 0.8 + 1 ) ) = > ( 1 ? 0.3 , 1 ? 0.8 ) = > ( 0.7 , 0.2 ) (0.3, 0.8) => (\ 1 - f(0.3 + 1),1 - f(0.8 + 1)\ ) => (1 - 0.3, 1 - 0.8) => (0.7, 0.2) (0.3,0.8)=>(?1?f(0.3+1),1?f(0.8+1)?)=>(1?0.3,1?0.8)=>(0.7,0.2) ok
  • ( ? 0.5 , ? 2.2 ) = > ( 1 ? f ( ? 0.5 + 1 ) , 1 ? f ( ? 0.2 + 1 ) ) = > ( 1 ? 0.5 , 1 ? 0.8 ) = > ( 0.5 , 0.2 ) (-0.5, -2.2) => (\ 1 - f(-0.5 + 1),1 - f(-0.2 + 1)\ ) => (1 - 0.5, 1 - 0.8) => (0.5, 0.2) (?0.5,?2.2)=>(?1?f(?0.5+1),1?f(?0.2+1)?)=>(1?0.5,1?0.8)=>(0.5,0.2) ok

結尾:喜歡的小伙伴可以點點關注+贊哦

希望對各位小伙伴能夠有所幫助哦,永遠在學習的道路上伴你而行, 我是航火火,火一般的男人!

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

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

相關文章

洪師傅代駕系統開發 支持公眾號H5小程序APP 后端Java源碼

代駕流程圖 業務流程圖 管理端設置 1、首頁裝修 2、師傅獎勵配置 師傅注冊后,可享受后臺設置的新師傅可得的額外獎勵; 例:A注冊了師傅,新人獎勵可享受3天,第一天的第一筆訂單完成后可得正常傭金傭金*獎勵比例 完成第二筆/第三筆后依次可得正常傭金傭金*獎勵比例 完成的第四…

牛客NC166 連續子數組的最大和(二)【中等 前綴和數組+動態規劃 Java/Go/PHP/C++】

題目 題目鏈接&#xff1a; https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21 思路 前綴和數組動態規劃Java代碼 import java.util.*;public class Solution {/*** 代碼中的類名、方法名、參數名已經指定&#xff0c;請勿修改&#xff0c;直接返回方法規…

小短片創作-優化場景并輸出短片(二)

1、什么是潮濕感 什么是潮濕感&#xff1a;基礎顏色變化粗糙度變化表面滲入性 1.基礎顏色變化&#xff1a;潮濕的地方顏色會變深 2.粗糙度變化&#xff1a;鏡面粗糙度為0&#xff0c;潮濕的地方粗糙度會變低 3.表面滲入性&#xff1a;主要看材質是否防水 2、調整場景材質增…

小抄 20240526

1 一些人焦慮的原因&#xff0c;可能是他也知道自己做的事無意義&#xff0c;但是又停不下來&#xff0c;于是一直在做無用功&#xff0c;空耗精神力量。 可以試著去做一些熱愛的、有價值的事情&#xff0c;焦慮就會慢慢消失。 2 人們看歷史的時候&#xff0c;很容易把自己代…

士大夫v產生的

一、前言 亂碼七糟 [lun qī bā zāo]&#xff0c;我時常懷疑這個成語是來形容程序猿的&#xff01; 無論承接什么樣的需求&#xff0c;是不是身邊總有那么幾個人代碼寫的爛&#xff0c;但是卻時常有測試小姐姐過來聊天(_求改bug_)、有產品小伙伴送吃的(_求寫需求_)、有業務小…

Java 寫入 influxdb

利用Python隨機生成一個1000行的csv文件 import csv import random from datetime import datetime, timedelta from random import randint, choice# 定義監控對象列表和指標名稱列表 monitor_objects [Server1, Server2, Server3, DB1] metric_names [CPUUsage, MemoryUsa…

網絡編程 —— Http進度條

第一種下載帶進度的方法 string url "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi"; 1使用getASync獲取服務器響應數據 參數1請求的路徑&#xff0c; 參數2 HttpCompletionOption.ResponseHeadersRead 請求完成時候等待請求帶什么程度才…

耐高溫輸送帶的優勢

耐高溫輸送帶&#xff1a;工業運輸的革命性升級&#xff0c;助力生產線高效穩定運行 在現代化工業生產的浪潮中&#xff0c;耐高溫輸送帶以其獨特的優勢&#xff0c;正逐漸成為工業運輸領域的得力助手。它不僅能夠有效提升生產效率&#xff0c;更能確保生產線的安全穩定運行&a…

算法隨想錄第二十天打卡|654.最大二叉樹 , 617.合并二叉樹 ,700.二叉搜索樹中的搜索 , 98.驗證二叉搜索樹

654.最大二叉樹 又是構造二叉樹&#xff0c;昨天大家剛剛做完 中序后序確定二叉樹&#xff0c;今天做這個 應該會容易一些&#xff0c; 先看視頻&#xff0c;好好體會一下 為什么構造二叉樹都是 前序遍歷 題目鏈接/文章講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;又是構…

「動態規劃」打家劫舍

力扣原題鏈接&#xff0c;點擊跳轉。 有一個小偷&#xff0c;要偷東西。假設有n個房間&#xff0c;每個房間都有現金&#xff0c;下標為i的房間內的現金數是nums[i]。不能同時偷相鄰的2個房間&#xff0c;其中第一個房間和最后一個房間是相鄰的。那么這個小偷最多能偷到多少現…

YOLOv8+PyQt5鳥類檢測系統完整資源集合(yolov8模型,從圖像、視頻和攝像頭三種路徑識別檢測,包含登陸頁面、注冊頁面和檢測頁面)

資源包含可視化的鳥類檢測系統&#xff0c;基于最新的YOLOv8訓練的鳥類檢測模型&#xff0c;和基于PyQt5制作的可視化鳥類檢測系統&#xff0c;包含登陸頁面、注冊頁面和檢測頁面&#xff0c;該系統可自動檢測和識別圖片或視頻當中出現的各種鳥類&#xff0c;以及自動開啟攝像頭…

Linux漢化Jupyter Notebook

要在Linux系統中使Jupyter Notebook漢化&#xff0c;可以通過安裝jupyterlab-language-pack-zh-CN擴展來實現。以下是具體步驟和示例代碼&#xff1a; 打開終端。 執行以下命令以安裝Jupyter Notebook的中文語言包&#xff1a; pip install jupyterlab-language-pack-zh-CN …

【CSharp】將ushort數組保存為1通道位深16bit的Tiff圖片

【CSharp】將ushort數組保存為1通道位深16bit的Tiff圖片 1.背景2.接口 1.背景 System.Drawing.Common 是一個用于圖像處理和圖形操作的庫&#xff0c;它是 System.Drawing 命名空間的一部分。由于 .NET Core 和 .NET 5 的跨平臺特性&#xff0c;許多以前內置于 .NET Framework…

基于Fluent和深度學習算法驅動的流體力學計算與應用

“基于Fluent和深度學習算法驅動的流體力學計算與應用”專題大綱 目錄 主要內容 機器學習與流體力學入門 一、流體力學基礎理論與編程實戰1、流體力學的發展概述 2、不可壓縮流體力學的基本方程 3、湍流理論與湍流模型簡介 4、傅里葉變換和流體的尺度分析 5、偽譜法求解不可壓…

Vue小程序項目知識積累(二)

1.wx.reLaunch(Object object) 關閉所有頁面&#xff0c;打開到應用內的某個頁面。 wx.reLaunch({url:/pages/positons/index}) 參數說明&#xff1a; 屬性類型默認值必填說明urlstring是需要跳轉的應用內頁面路徑 (代碼包路徑)&#xff0c;路徑后可以帶參數。參數與路徑之…

微信小程序上傳包過大的最全解決方案!

微信小程序的發布大小限制是2MB。然而一個程序怎么能這么小&#xff1f; 介紹一下項目中的經驗。 新項目 如果是剛開始做的新項目&#xff0c;一定確定好自己要用的Ui框架&#xff0c;而且確定之后&#xff0c;千萬不要引入別的&#xff0c;否則占大小&#xff01;&#xff0…

HNCTF

HNCTF 文章目錄 HNCTFBabyPQEZmathez_Classicf(?*?)MatrixRSABabyAESIs this Iso? BabyPQ nc簽到題&#xff0c;跟端口連接拿到n和phin n 8336450100232098099043686671148282601664696810002345240872579498695511770993195704402414029892029461830476866385453475141207…

【開源】加油站管理系統 JAVA+Vue.js+SpringBoot+MySQL

目錄 一、項目介紹 論壇模塊 加油站模塊 汽油模塊 二、項目截圖 三、核心代碼 一、項目介紹 Vue.jsSpringBoot前后端分離新手入門項目《加油站管理系統》&#xff0c;包括論壇模塊、加油站模塊、汽油模塊、加油模塊和部門角色菜單模塊&#xff0c;項目編號T003。 【開源…

如何使用jQuery重定向到另一個網頁

在我們開始討論如何重定向到另一個網頁之前,必須明確一點:jQuery 是一個用于 DOM 操作的 JavaScript 庫,因此你不應該使用 jQuery 來實現頁面重定向。 jQuery 官方網站的某段話: 雖然 jQuery 可能能夠在較舊的瀏覽器版本中運行,但我們并沒有主動在這些版本中進行測試,也…

矩陣對角化在機器學習中的奧秘與應用

在機器學習的廣闊領域中&#xff0c;矩陣對角化作為一種重要的數學工具&#xff0c;扮演著不可或缺的角色。從基礎的線性代數理論到復雜的機器學習算法&#xff0c;矩陣對角化都在其中發揮著重要的作用。 矩陣對角化的概念與原理 矩陣對角化是矩陣理論中的一個基本概念&#x…