GAMES202-高質量實時渲染(homework1)

目錄

  • Homework1
    • shadow Map
    • PCF(Percentage Closer Filter)
    • PCSS(Percentage Closer Soft Shadow)

GitHub主頁:https://github.com/sdpyy1
作業實現:https://github.com/sdpyy1/CppLearn/tree/main/games202

Homework1

shadow Map

首先需要完成MVP矩陣的構造,在這里的mvp用來表示如果一個模型在shadowmap視角下的位置

    CalcLightMVP(translate, scale) {let lightMVP = mat4.create();let modelMatrix = mat4.create();let viewMatrix = mat4.create();let projectionMatrix = mat4.create();// Model transformmat4.translate(modelMatrix,modelMatrix,translate);mat4.scale(modelMatrix,modelMatrix,scale);// View transformmat4.lookAt(viewMatrix, this.lightPos, this.focalPoint, this.lightUp);// Projection transformmat4.ortho(projectionMatrix, -100,100,-100,100,0.1,400); // 實測far要得400可以覆蓋到整個平面mat4.multiply(lightMVP, projectionMatrix, viewMatrix);mat4.multiply(lightMVP, lightMVP, modelMatrix);return lightMVP;}

他在頂點著色器中使用,目的是傳遞每個頂點位置在光源視角下坐標 vPositionFromLight = uLightMVP * vec4(aVertexPosition, 1.0);
在片段著色器中,先實現比較的函數

float useShadowMap(sampler2D shadowMap, vec4 shadowCoord){// shadowmap中存儲的深度float lightDepth = unpack(texture2D(shadowMap, shadowCoord.xy));// 著色點深度float shadowDepth = shadowCoord.z;float visibility = 1.0;// 被擋住了if (shadowDepth > lightDepth) {visibility = 0.0;}return visibility;
}

在主函數中,需要先對光源坐標處理一下,因為它是經過透視投影處理后的NDC坐標,而shadowMap上取值其實需要的是UV坐標(0,1)之間,所以需要先轉到[0,1]之間
??:透視除法在透視投影時才需要,我看別的博客都寫了,其實是不需要的

  float visibility = 1.0;// 透視投影時才需要// vec3 shadowCoord = vPositionFromLight.xyz / vPositionFromLight.w;vec3 shadowCoord = (vPositionFromLight.xyz+1.0)/2.0;visibility = useShadowMap(uShadowMap, vec4(shadowCoord, 1.0));

請添加圖片描述
居然沒出現自陰影問題,我們手動創建一個,首先光源位置修改在engine.js中lightPos

	// Add lights// light - is open shadow map == truelet lightPos = [0, 90, 80];let focalPoint = [0, 0, 0];let lightUp = [0, 1, 0]const directionLight = new DirectionalLight(5000, [1, 1, 1], lightPos, focalPoint, lightUp, true, renderer.gl);renderer.addLight(directionLight);

把光源變斜一點,就會發現場景從遠到近逐漸出現自陰影現象
y = 40
請添加圖片描述
y=30請添加圖片描述
y=20
請添加圖片描述
y=10這時候整個地板都出錯了
請添加圖片描述
加一個自偏移,就解決了

  if (shadowDepth  > lightDepth + 0.01) {visibility = 0.0;}

請添加圖片描述
下面是偏移量改為0.05的效果,效果就太差了,偏移量應該根據光照的角度動態調整
請添加圖片描述

走樣的情況,下面就用PCF來解決~
請添加圖片描述

PCF(Percentage Closer Filter)

簡單理解就是不只判斷shadowmap的一個位置,而是一圈位置的平均。
作業中提供了兩種采樣,它的作用就是減少計算量,沒必要真的一個一個便利來取均值,偏移記錄在了vec2 poissonDisk[NUM_SAMPLES];
下面是我的實現

float PCF(sampler2D shadowMap, vec4 coords) {poissonDiskSamples(coords.xy);// 采樣數float numSamples = 0.0;// 沒有遮擋的采樣數float numUnBlock = 0.0;// 過濾核大小float filterSize = 5.0;float mapSize = 2048.0;// 過濾核范圍float filterRange = filterSize / mapSize;for(int i = 0;i<NUM_SAMPLES;i++){vec2 samplexCoor = coords.xy + poissonDisk[i] * filterRange;// 采樣時可能會越界if(samplexCoor.x > 0.0 && samplexCoor.x < 1.0 && samplexCoor.y > 0.0 && samplexCoor.y < 1.0) {numSamples++;if(useShadowMap(shadowMap,vec4(samplexCoor,coords.z,1.0)) == 1.0) {numUnBlock++;}}}return numUnBlock/numSamples;
}

鋸齒位置的變化(過濾核大小為5)
請添加圖片描述
當改為20時
請添加圖片描述
改為100時,出現了大量噪點
請添加圖片描述

PCSS(Percentage Closer Soft Shadow)

用PCF來做軟陰影,一句話來說就是動態修改過濾核的尺寸,達到不同的因子區域不同的軟硬程度

第一步需要在一定范圍內搜索深度比著色點進的點,從而得到一個平均深度

float findBlocker( sampler2D shadowMap,  vec2 uv, float zReceiver ) {int numSamples = 0;float sumDepth = 0.0;float searchSize = 15.0;float mapSize = 2048.0;float searchRange = searchSize / mapSize;for( int i = 0; i < BLOCKER_SEARCH_NUM_SAMPLES; i ++ ) {vec2 sampleCoor = uv + poissonDisk[i] * searchRange;// 采樣時可能會越界if(sampleCoor.x > 0.0 && sampleCoor.x < 1.0 && sampleCoor.y > 0.0 && sampleCoor.y < 1.0) {float depth = unpack(texture2D(shadowMap, sampleCoor));if(depth < zReceiver) {sumDepth += depth;numSamples++;}}}if(numSamples > 0) {return sumDepth / float(numSamples);} else {return zReceiver;}
}

下來就計算半影尺寸并把它作為過濾核尺寸來進行PCF

float PCSS(sampler2D shadowMap, vec4 coords){uniformDiskSamples(coords.xy);// STEP 1: avgblocker depthfloat avgBlockerDepth = findBlocker(shadowMap, coords.xy, coords.z);// STEP 2: penumbra size// 假設光源尺寸為50float Wlight = 50.0;float penumbraSize = (coords.z - avgBlockerDepth) * Wlight / avgBlockerDepth;// STEP 3: filtering// 把半影尺寸當做過濾核大小return PCF(shadowMap, coords,penumbraSize);
}

光源尺寸越大,陰影軟硬區分程度越大,因為計算出的過濾核尺寸區分度越大
Wlight = 50
請添加圖片描述
Wlight = 100
請添加圖片描述
設置過小時,反而看不出什么效果
請添加圖片描述

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

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

相關文章

JDK(Ubuntu 18.04.6 LTS)安裝筆記

一、前言 本文與【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】同批次&#xff1a;先搭建數據庫&#xff0c;再安裝JDK&#xff0c;后面肯定就是部署Web應用&#xff1a;典型的單機部署。“麻雀雖小五臟俱全”&#xff0c;善始善終&#xff0c;還是記下來吧。…

軟件測試之接口測試常見面試題

一、什么是(軟件)接口測試? 接口測試&#xff1a;是測試系統組件間接口的一種測試方法 接口測試的重點&#xff1a;檢查數據的交換&#xff0c;數據傳遞的正確性&#xff0c;以及接口間的邏輯依賴關系 接口測試的意義&#xff1a;在較早期開展&#xff0c;在軟件開發的同時…

Lua 第11部分 小插曲:出現頻率最高的單詞

在本章中&#xff0c;我們要開發一個讀取并輸出一段文本中出現頻率最高的單詞的程序。像之前的小插曲一樣&#xff0c;本章的程序也十分簡單但是也使用了諸如迭代器和匿名函數這樣的高級特性。 該程序的主要數據結構是一個記錄文本中出現的每一個單詞及其出現次數之間關系的表。…

軟件項目進度管理活動詳解

目錄 1. 活動定義&#xff08;Activity Definition&#xff09; 2. 活動排序&#xff08;Activity Sequencing&#xff09; 3. 活動資源估算&#xff08;Activity Resource Estimating&#xff09; 4. 活動歷時估算&#xff08;Activity Duration Estimating&#xff09; …

docker 國內源和常用命令

Ubuntu | Docker Docs 參考docker官方安裝docker # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt…

身份與訪問管理(IAM):零信任架構下的認證授權技術與實戰

身份與訪問管理&#xff08;IAM&#xff09;&#xff1a;零信任架構下的認證授權技術與實戰 在網絡安全防御體系中&#xff0c;身份與訪問管理&#xff08;Identity and Access Management, IAM&#xff09;是守護數字資產的“數字門禁系統”。隨著遠程辦公和多云架構的普及&a…

Maven進階知識

一、Maven 坐標 &#xff08;一&#xff09;概念 在 Maven 中坐標是構件的唯一標識&#xff0c;其元素包括 groupId、artifactId、version、packaging、classifier。其中 groupId、artifactId、version 是必定義項&#xff0c;packaging 默認為 jar。 &#xff08;二&#x…

網絡原理 ——TCP 協議

TCP 報文結構 TCP 頭部 20字節&#xff08;無選項&#xff09;&#xff0c;關鍵字段&#xff1a; 字段長度&#xff08;bit&#xff09;說明源端口16發送方端口目的端口16接收方端口序列號&#xff08;seq&#xff09;32數據字節的編號確認號&#xff08;ack&#xff09;32期…

C#使用sftp遠程拷貝文件

需要下載 的包&#xff1a;Core.Renci.SshNet 下載依賴包的時候需要注意版本&#xff0c;高版本的.net環境不支持會用不了&#xff0c;我用的.net5,所以下載的2021.10.2 功能的核心式創建一個SftpClient&#xff0c;并傳入所需要的參數&#xff1a;遠程IP地址&#xff0c;端口…

文本預處理(NLTK)

1. 自然語言處理基礎概念 1.1 什么是自然語言處理 自然語言處理( Natural Language Processing, NLP)是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融語言學、計算機科學、數學于…

socket編程基礎

上一篇 --- 網絡基礎概念&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147320155?fromshareblogdetail&sharetypeblogdetail&sharerId147320155&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 理…

CSS 解決手機瀏覽器默認行為(點擊出現藍色背景)

最近寫了一個 Web 應用&#xff0c;可以兼容手機端和PC端&#xff0c;在PC端調試的時候沒有發現這個問題&#xff0c;但是在手機上或者PC瀏覽器改成手機模式進行調試的時候就會出現下面這個場景&#xff1a; 這是兩個 div&#xff0c;點擊的時候&#xff0c;會出現一個藍色的背…

多模態大語言模型arxiv論文略讀(三十八)

Tables as Texts or Images: Evaluating the Table Reasoning Ability of LLMs and MLLMs ?? 論文標題&#xff1a;Tables as Texts or Images: Evaluating the Table Reasoning Ability of LLMs and MLLMs ?? 論文作者&#xff1a;Naihao Deng, Zhenjie Sun, Ruiqi He, A…

聊聊Spring AI Alibaba的YuQueDocumentReader

序 本文主要研究一下Spring AI Alibaba的YuQueDocumentReader YuQueDocumentReader community/document-readers/spring-ai-alibaba-starter-document-reader-yuque/src/main/java/com/alibaba/cloud/ai/reader/yuque/YuQueDocumentReader.java public class YuQueDocument…

OCR定制識別:解鎖文字識別的無限可能

OCR 定制識別是什么&#xff1f; OCR&#xff0c;即光學字符識別&#xff08;Optical Character Recognition&#xff09; &#xff0c;它就像是一個神奇的 “文字翻譯器”&#xff0c;能把圖片里的文字轉化成計算機可編輯的文本。比如&#xff0c;你掃描一份紙質文檔成圖片&am…

麒麟系統(基于Ubuntu)上使用Qt編譯時遇到“type_traits文件未找到”的錯誤

在麒麟系統&#xff08;基于Ubuntu&#xff09;上使用Qt編譯時遇到“type_traits文件未找到”的錯誤&#xff0c;通常是由于C標準庫頭文件缺失或項目配置問題導致的。以下是逐步解決方案&#xff1a; 1. 安裝C標準庫和開發工具 確保系統已安裝完整的開發工具鏈和標準庫&#…

服務器上安裝node

1.安裝 下載安裝包 https://nodejs.org/en/download 解壓安裝包 將安裝包上傳到/opt/software目錄下 cd /opt/software tar -xzvf node-v16.14.2-linux-x64.tar.gz 將解壓的文件夾移動到安裝目錄(/opt/nodejs)下 mv /opt/software/node-v16.14.2-linux-x64 /opt/nodejs …

Vue3 + Vite + TS,使用 ExcelJS導出excel文檔,生成水印,添加背景水印,dom轉圖片,插入圖片,全部代碼

Vue3 Vite TS,使用 ExcelJS導出excel文檔&#xff0c;生成水印&#xff0c;添加背景水印&#xff0c;dom轉圖片&#xff0c;插入圖片&#xff0c;全部代碼 ExcelJS生成文檔并導出導出表頭其他函數 生成水印設置文檔的背景水印dom 轉圖片插入圖片全部代碼 ExcelJS 讀取&#…

devops自動化容器化部署

devops 一、簡單案例體驗gitlabrunner部署靜態文件二、devops企業級部署方案1、流程圖2、依賴工具3、流程圖4、主機規劃5、安裝工具軟件1、安裝git2、安裝gitlab3、安裝jenkins-server4、安裝harbor5、安裝web-server&#xff0c;也就是部署服務的機子&#xff0c;需要安裝dock…

高級 SQL 技巧:提升數據處理能力的實用方法

在數據驅動的時代,SQL 作為操作和管理關系型數據庫的標準語言,其重要性不言而喻。基礎的 SQL 語句能滿足日常的數據查詢需求,但在處理復雜業務邏輯、進行數據分析和優化數據庫性能時,就需要掌握一些高級 SQL 技巧。這些技巧不僅能提高查詢效率,還能實現復雜的數據處理任務…