在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從零開始學3D著色器編程

lviY_AI_shequ ? 來源:fqj ? 2019-05-16 14:31 ? 次閱讀

這篇教程是今日GitHub趨勢榜第一,一天便達到了1500星。主要介紹了通過使用Panda3D游戲引擎和OpenGL著色語言來為3D游戲添加紋理,法線貼圖,泛光,環境遮擋等等。教程內容十分豐富,動圖也非常生動。

Shader,是運行在GPU上的程序,中文稱為著色器。它的主要用途是對三維物體進行著色處理,對光與影進行計算,以及控制紋理顏色的呈現等,最終,將游戲引擎中的幾何數據轉化為屏幕上的模型、場景以及特效。

吃雞、農藥、戰地、塞爾達…都離不開著色器,著色器被譽為照亮虛擬世界的"魔法"。 著色器還可以用來做后期處理,類似PS。

著色程序是一整套編譯好并鏈接在一起的著色器的集合。著色器shader的編寫需要使用著色語言GL Shader Language(GLSL),GLSL的語法與C語言很類似。

著色器編程不光是對開發技能的考驗,更是對程序員想象力的挑戰,以至于有說法稱會寫Shader的程序員是站在食物鏈頂端的人。想成為游戲開發高手,著色器編程是必備技能。

有興趣在3D游戲中添加紋理,光照,陰影,法線貼圖,環境光遮蔽了嗎?好極了!今天新智元為大家帶來一個Github項目,從零開始教會大家進行3D游戲著色。

以下一系列著色技術,都是具有高可移植的技巧,無論是Godot還是Unity都將適用。通過這些技術,你的游戲視覺效果將提升到新的高度。

對于著色器之間的粘合劑,作者選擇了神器Panda3D游戲引擎和OpenGL著色語言(GLSL)。

Panda3D是一個強大的渲染引擎。核心渲染模塊基于C++開發。Panda3D提供了Python的腳本化實用接口

本項目code在以下環境下測試通過。

Linux manjaro 4.9.135-1-MANJARO

OpenGL renderer string: GeForce GTX 970/PCIe/SSE2

OpenGL version string: 4.6.0 NVIDIA 410.73

g++ (GCC) 8.2.1 20180831

Panda3D 1.10.1-1

運行示例代碼需要先build

如果你想運行示例代碼,首先要先build。根據不同平臺安裝對應版本的Panda3D。其次,Clone項目repo,進入目錄,開始編譯。

Linux:

g++ -c main.cxx -o 3d-game-shaders-for-beginners.o -std=gnu++11 -O2 -I/usr/include/python2.7/ -I/usr/include/panda3d/

編譯完成后執行:

g++ 3d-game-shaders-for-beginners.o -o 3d-game-shaders-for-beginners -L/usr/lib/panda3d -lp3framework -lpanda -lpandafx -lpandaexpress -lp3dtoolconfig -lp3dtool -lp3pystub -lp3direct -lpthread

Mac:

clang++ -c main.cxx -o 3d-game-shaders-for-beginners.o -std=gnu++11 -g -O2 -I/usr/include/python2.7/ -I/Developer/Panda3D/include/

編譯完成后執行:

clang++ 3d-game-shaders-for-beginners.o -o 3d-game-shaders-for-beginners -L/Developer/Panda3D/lib -lp3framework -lpanda -lpandafx -lpandaexpress -lp3dtoolconfig -lp3dtool -lp3pystub -lp3direct -lpthread坐標系統

開始插手著色器代碼之前,需要對3D物體的坐標系統有所了解。和在立體幾何的坐標系意義,繪制3D物體也是需要x、y、z三個坐標軸的值。

將定義好的坐標軸的值轉換為實際繪制的坐標,需要經過五個坐標系統的轉換。

模型空間

相對于原點 (0,0,0) 而自定義的起始坐標點。

世界空間

世界空間就是當所有物體一起繪制、仍然相對于原點的、更大的一個坐標系。可以防止模型出現扎堆兒情況。

觀察空間

將世界空間的坐標轉化為攝像機的視角所觀察到的空間坐標。

裁剪空間

根據我們的需要來裁剪一定范圍內的物體,而在這個范圍之外的坐標就會被忽略掉,實質上還是進行坐標的操作。

屏幕空間

將坐標投射到屏幕上。

渲染到紋理

渲染到紋理(Render To Texture, RTT)是現在很多特效里面都會用到的一項很基本的技術,實現起來很簡單,也很重要。

渲染到紋理是為了實現一些特殊的效果,比如一個光滑的球體,它應該是可以反射周圍環境的,這個時候就需要先渲染到紋理。

在此設置中,示例代碼執行以下操作:

存儲幾何數據(如頂點位置或法線)供以后使用

存儲材料數據(如漫反射顏色)供以后使用

UV映射各種紋理(漫反射,普通,陰影等)

計算環境光,漫反射光,鏡面光和發光光

呈現霧

紋理和光照(Lighting)

紋理涉及使用UV坐標將一些顏色或一些其他類型的矢量映射到片段。 U和V的范圍從0到1。每個頂點都獲得一個UV坐標,并在頂點著色器中輸出。

完成lighting涉及到計算和組合環境光、漫反射光、鏡面光和發射光方面。示例代碼使用Phong lighting。Diffuse代碼:

// ... float diffuseIntensity = max(dot(normal, unitLightDirection), 0.0); if (diffuseIntensity > 0) { // ... } // ...

法線貼圖

法線貼圖(英語:Normal mapping)是一種模擬凹凸處光照效果的技術,是凸凹貼圖的一種實現。法線貼圖可以在不添加多邊形的前提下,為模型添加細節。常見的使用場景是為低多邊形模型改善外觀、添加細節,此時的法線貼圖一般根據高多邊形模型或高度貼圖生成。

頂點代碼:

// ...uniform mat3 p3d_NormalMatrix;// ...in vec3 p3d_Normal;// ...in vec3 p3d_Binormal;in vec3 p3d_Tangent; // ... vertexNormal = normalize(p3d_NormalMatrix * p3d_Normal); binormal = normalize(p3d_NormalMatrix * p3d_Binormal); tangent = normalize(p3d_NormalMatrix * p3d_Tangent); // ...

描邊

描邊著色器需要一個輸入紋理,用于檢測邊緣中的顏色。此輸入紋理的候選者包括材質的漫反射顏色、漫反射貼圖的顏色、頂點法線,甚至法線貼圖的顏色。

uniform struct { vec4 diffuse;} p3d_Material;out vec4 fragColor;void main() { vec3 diffuseColor = p3d_Material.diffuse.rgb; fragColor = vec4(diffuseColor, 1);}

霧化、全屏泛光

霧(fog,或在Blender中稱為mist)將霧氣效果添加到場景中,提供神秘感和柔化。

// ...uniform struct p3d_FogParameters { vec4 color ; float start ; float end ; } p3d_Fog;// ...

Panda3D提供了一個很好的數據結構,可以保存所有fog參數,你也可以手動將其傳遞給著色器。

Bloom有時候也叫Glow效果,中文一般叫做“全屏泛光”,可以使得發光物體看起來更逼真。

屏幕空間環境光遮蔽(SSAO)

環境光遮蔽(AO,ambient occlusion),大致上指的是幾何物體的拐角處,因為受光不全面(被相鄰的面擋光/遮蔽),導致變暗。屏幕環境光遮蔽技術使用了屏幕空間場景的深度而不是真實的幾何體數據來確定遮蔽量。這一做法相對于真正的環境光遮蔽不但速度快,而且還能獲得很好的效果,使得它成為近似實時環境光遮蔽的標準。

下面動圖展示了用AO和沒用AO的區別。用了AO,物體拐角的地方會變暗看起來就更逼真。

景深

景深(英語:Depth of field, DOF)景深是指相機對焦點前后相對清晰的成像范圍。在光學中,尤其是錄影或是攝影,是一個描述在空間中,可以清楚成像的距離范圍。

雖然透鏡只能夠將光聚到某一固定的距離,遠離此點則會逐漸模糊,但是在某一段特定的距離內,影像模糊的程度是肉眼無法察覺的,這段距離稱之為景深。

景深淺則模糊范圍大,虛化效果明顯。反之則虛化效果減弱。焦外代碼示例:

// ... vec4 result = vec4(0); for (int i = 0; i < size2; ++i) { x = size - xCount; y = yCount - size; result += texture ( blurTexture , texCoord + vec2(x * separation, y * separation) ); xCount -= 1; if (xCount < countMin) { xCount = countMax; yCount -= 1; } } result = result / size2; // ...色調分離和像素化

色調分離是指一幅圖像原本是由緊緊相鄰的漸變色階構成,被數種突然的顏色轉變所代替。這一種突然的轉變,亦稱作“跳階”。色調分離其實就是用來制造分色效果。

將3D游戲像素化使他看起來很有趣,并可以節省時間,不必手動創建所有的像素藝術。和色調分離相結合,可以打造真正的復古外觀。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 3D
    3D
    +關注

    關注

    9

    文章

    2955

    瀏覽量

    110165
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70361
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    從零開始CPLD和Verilog HDL編程技術教程免費下載

    從零開始學系列之從零開始CPLD和Verilog HDL編程技術非常不錯,大家支持下下載地址:https://bbs.elecfans.com/jishu_264455_1_1.ht
    發表于 02-06 16:42

    從零開始電路基礎》(從零開始電子技術叢書)

    電氣控制與PLC技術].劉建清.掃描版.pdf[從零開始電子測量技術].李建清.掃描版.pdf[從零開始CPLD和Verilog.HDL編程
    發表于 06-05 23:12

    從零開始低壓

    從零開始低壓電工技術下載
    發表于 07-02 21:50

    從零開始layout

    請問誰有從零開始layout的教程,共享一下,謝謝!
    發表于 07-23 14:50

    從零開始電子》叢書全套網盤分享

    ://pan.baidu.com/s/1jSiiNZWIVCrQCeMlBBOMhA提取碼:6y3f【從零開始電子叢書】從零開始CPLD
    發表于 06-28 18:45

    初學者都在看!!從零開始單片機C語言 【從零開始電子叢書】

    初學者都在看!!從零開始單片機C語言【從零開始電子叢書】
    發表于 07-27 15:32

    IMX OpenGL著色器問題如何解決?

    IMX OpenGL 著色器問題
    發表于 04-20 07:33

    實時3D藝術最佳實踐-材料和著色器用戶指南

    材質和著色器決定3D對象在屏幕上的顯示方式,了解它們做什么,以及如何優化它們。 本指南涵蓋了多種不同的材質和著色器優化,可以幫助您的游戲 跑步效率更高,看起來更好。 本指南也以Unity學習課程
    發表于 08-02 06:11

    從零開始CPLD和Verilog HDL編程技術

    從零開始CPLD和Verilog HDL編程技術:CPLD(復雜可編程邏輯器件)在數字電子技術領域中的應用越來越廣泛,尤其適合于新產品的開發與小批量生產,因此深受廣大工程技術人員喜愛
    發表于 03-13 15:15 ?405次下載
    <b class='flag-5'>從零開始</b><b class='flag-5'>學</b>CPLD和Verilog HDL<b class='flag-5'>編程</b>技術

    從零開始電路基礎

    從零開始電路基礎 電路基礎是學習電子技術的起步知識。本書就是為使初學者從零開始,快速掌握電路基礎知識而編寫的。與傳統的電路基礎教材不同的是,本書擯棄了
    發表于 03-15 16:12 ?0次下載

    從零開始CPLD和Verilog HDL編程技術

    從零開始CPLD和Verilog HDL編程技術 CPLD(Complex Programmable Logic Device)復雜可編程邏輯器件,是從PAL和GAL器件發展出來的
    發表于 03-16 15:42 ?132次下載

    從零開始搭建3D打印機

    從零開始搭建3D打印機從零開始搭建3D打印機
    發表于 01-15 16:35 ?0次下載

    [Arduino編程從零開始].[英].Simon.Monk

    Arduino編程從零開始
    發表于 01-22 13:47 ?13次下載

    從零開始android游戲編程

    從零開始android游戲編程
    發表于 03-19 11:23 ?3次下載

    圖文詳解:從零開始電源資源下載

    圖文詳解:從零開始電源資源下載
    發表于 04-25 16:11 ?104次下載
    圖文詳解:<b class='flag-5'>從零開始</b><b class='flag-5'>學</b>電源資源下載
    主站蜘蛛池模板: 97人人射| 99国产国人青青视频在线观看 | 在线观看s色| www.午夜色| 日韩电影天堂网 | 欧美一级视频在线观看 | 亚洲免费视频一区二区三区 | 激情文学综合 | 天天干人人 | a久久久久一级毛片护士免费 | 欧美黑人性受xxxx喷水 | 在线免费观看视频黄 | mm365快播综合网 | 中国一级特黄真人毛片免费看 | 午夜视频在线观看网站 | 国产国产成人人免费影院 | 夜夜福利| 人人做人人爽久久久精品 | 国产三级日产三级日本三级 | 欧美大胆一级视频 | 在线观看国产久青草 | aaa大片| 欧美人成a视频www | 边做边爱在线观看视频免费 | 亚洲伊人久久网 | 欧美日韩不卡码一区二区三区 | 校园激情综合网 | 久九色| 亚洲小便 | 福利色播 | 久久影视免费体验区午夜啪啪 | 日本一区高清视频 | 色多多黄色 | 在线 你懂的 | 新版天堂中文资源官网 | 激情五月综合网 | 久久福利精品 | 亚洲精品午夜视频 | 日日摸人人看97人人澡 | 亚洲春色www | 特一级黄 |