有時候我們在遊戲,會看到類似這樣裸露的土地、沼澤之類的:
這是遊戲《自然之力》的地圖,在草地上會有「粘土」、「黑土」這樣裸露的區域,玩家能夠在這片區域挖土,不同的材料可以製作不同的道具。
那這個是怎麼做的呢?
比如,unity中刷地形的時候,就是使用第二種辦法,事先載入好紋理,再使用「刷子」在地形上畫對應的紋理貼圖。
這節我們使用**來實現這樣的效果。
原理很簡單,就是取不同的紋理貼圖的顏色,使用一張混合貼圖將這些顏色進行混合。後面我們結合**來講具體的過程。
實現好的效果是這樣的。
首先我們寫乙個多重紋理類來儲存我們需要使用到的紋理:
接著,我們在片段著色器中計算混合的紋理顏色:
我們想要實現的效果是,在一片綠油油的草地上,有裸露的土地和道理,那麼地形的整體背景應該是「草」,對應混合貼圖 blendmap 中的黑色背景。 為啥是黑色背景,而不是透明背景? 因為黑色背景 r=g=b=0 這樣,我們計算的時候就比較方便了,因為任何顏色值乘以0還是0,這樣就很容易過濾掉其他的顏色。
接下來我們逐行**解釋:
1
// pass_texturecoordinates 為整個地形塊的紋理座標
2// 對混合貼圖 blendmap 取樣也使用這個紋理座標,因為 混合貼圖代表著最終地形的貼圖是啥樣的
3vec4 blendmapcolor = texture(blendmap, pass_texturecoordinates);
1
// 過濾掉混合貼圖中的其他顏色,主要是為了貼地形的背景紋理
2float backtextureamount = 1 - (blendmapcolor.r + blendmapcolor.g + blendmapcolor.b);
看在ps中使用顏色拾取器,檢視混合貼圖中每個畫素的顏色,可以發現這個畫素要麼是純色的,要麼是兩種顏色的混合。注意,這裡的畫素值是0-255,在片段著色器中是0-1,就是除以了255歸一化了而已。
根據這個,我們可以發現,混合貼圖中任意一點的畫素r,g,b通道的值加起來不會超過255(在片段著色器中不會超過1)。
那麼backtextureamount計算的就是除去混合貼圖中某點畫素值的r,g,b通道值,用這個差值作為地形的背景混合因子。
這也是接下來**做的事情。
1
vec2 tilecoords = pass_texturecoordinates * 40.0f;
2vec4 backgroundtexturecolor = texture(backgroundtexture, tilecoords) * backtextureamount;
是不是很奇怪,為啥這裡把地形的紋理取樣座標pass_texturecoordinates乘以40。因為我們的地形貼圖很小啊,地形很大啊,如果使用地形的取樣座標去取樣貼圖的畫,相當於把一張小貼圖拉到地形那麼大,那麼你會看到什麼呢?
對啊,那就糊了啊。
但是你可能會說,那乘以40不就超過1了嘛,紋理取樣座標不是0-1嘛。
對啊,你說滴對。
但是,你忘了之前有個文章說到紋理環繞模式了嗎? 超過1的紋理座標會根據載入紋理時設定的紋理環繞模式進行取樣的。
你看,乘以40之後取樣的紋理很清晰。
接下來,我們分別使用 混合地圖中的 每個通道的顏色值作為混合因子,使用地形貼圖 比如 泥土、道路貼圖 作為對應的取樣貼圖,進行顏色計算。
最後將幾種顏色加起來作為最終的輸出顏色。
由於這裡用到了5張紋理,1張混合貼圖+4張地形貼圖,所以,我們在渲染的時候,需要開啟4個紋理單元:
最後,我們在生成地形時指定對應的貼圖紋理即可。
最後結果,前面已經看到了。
好了,結束。
其實很簡單有沒有。
分享3d程式設計的心得、演算法,包括:opengl、shader程式設計、webgl(three.js)等,一起走進3d程式設計的世界。
OpenGL遊戲引擎開發 1 環境搭建
我的計畫是帶大家從零開始寫乙個簡單的渲染引擎出來。當然,我不可能每行 都放在文章中,每節內容我們圍繞乙個主題,我先講解原理,再講解opengl實現的關鍵 然而我會把 給大家,大家自行查閱。一些基本的opengl知識,大家可以看learnopengl的教程,這個教程是以知識點的形式給大家講的,我們在這...
遊戲引擎開發
這條路很長,因為需要知道和用到的東西太多了。g8 y4 n r5 m4 x u6 h 8 o.g5 j 學習次序 1 首先是語言方面,這個問題沒有太多的選擇的餘地,基本上是用c和c vb的也有,但是很少 c 因為微軟的力挺,在遊戲開發中也逐漸多了示例。了解基本語義和語法就可以下一步了。如果想c 學精...
遊戲引擎開發之路
遊戲引擎開發之路 這條路很長,因為需要知道和用到的東西太多了。g8 y4 n r5 m4 x 學習次序 1 首先是語言方面 這個問題沒有太多的選擇的餘地 基本上是用c和 c vb的也有,但是很少 c 因為微軟的力挺,在遊戲開發中也逐漸多了示例。了解基本語義和語法就可以下一步了。如果想 c 學精通了在...