最近研究了一下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);