SceneKit的水面效果

最近研究了一下SceneKit,發現很多很有意思的效果,這裏乾脆記錄一下防止忘了。

因爲是隨手記的可能會比較亂(笑)

總之如果你對Scenekit有一點點了解的話就可以看了 (如果沒有的話先看看教程吧)

第一個比較有意思的點是水面效果。

水面效果主要涉及材質這一方面,完全可以不使用swift/oc代碼搞定,效果大概是這個樣子

首先隨便拉一個geometry(我用的是floor)

選擇floor,然後打開材質菜單欄


Diffuse就是這個物體的底色,水面的顏色就用藍色吧(當然,換個其他的顏色也不錯,比如黃河水)

Metalness不用管,因爲我們要渲染的是水(你要非渲染水銀我也沒辦法,但是正常的水就跳過)

Roughness是粗糙程度,爲了透明反射的效果我們用黑色

接下來是重頭戲:Normal

Normal就是一個物體表面的波瀾,如果我們要掀起波瀾那就要整一個normal map(這個可以在搜索引擎上面找)

(裏面的參數保持默認就可以)

Illumination,Emission和Displacement全部默認

然後我們要搞一個天空並設置成背景和環境(其實主要是要有云體現水面的折射,隨便做一個就行了)(關於天空的構造有時間再說,嘿嘿)

Ok,是不是已經出現天空效果了

接下來是讓我們的這一瓢死水動起來了

我有一個不太好的習慣,就是一次寫不了太多字,先把代碼貼這裏,明天(也許?)再講

float waterSpeed = u_time * -0.1;
vec2 uvs = _surface.normalTexcoord;
uvs.x *= 2;
vec3 tn = texture2D(u_normalTexture, vec2(uvs.x, uvs.y + waterSpeed)).xyz;
tn = tn * 2 - 1;vec3 tn2 = texture2D(u_normalTexture, vec2(uvs.x + 0.35 , uvs.y + 0.35 + (waterSpeed * 1.3))).xyz;tn2 = tn2 * 2 - 1;
vec3 rn = (tn + tn2) * 0.5;
mat3 ts = mat3(_surface.tangent, _surface.bitangent, _surface.geometryNormal);
_surface.normal = normalize(ts * rn);







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章