2017年10月21日 星期六

詳解火炬之光穿透剪影的效果(Silhouette or X Ray)

其實這個效果跟Shader沒什麼關係,基本上就是畫兩次,一次是畫剪影(Behind Pass),第二次是畫原本的模型(Original Pass),重點是Render State的設置…
以下是以Untiy Shader Lib為例:

Behind Pass的ZBuffer相關屬性設為:
ZTest Greater:意思是畫的時候,深度要大於目前畫面的深度值才畫,也就是被擋住的時候才
畫。
ZWrite Off:指的是不要寫入深度值,因為這個只是簡影,他跟目前畫面深度值是一樣
的。
基本上,這樣就差不多了,剩下的OgrinalPass就不多說了,因為這就是你原來的Shader Pass
啊!相關的範例Source Code如下:

Shader "Unlit/XRayExample"
{
Properties
{
_XrayColor("RimColor", Color) = (1.0, 0.0, 0.0, 1.0)
_MainTex("MainTex", 2D) = "white" {}
}
SubShader
{
LOD 200
Pass //behind pass
{
//render after opacity with alphaTest
Tags{ "RenderType" = "Transparent" "Queue" = "Transparent-20" }
ZWrite Off
ZTest Greater
Cull Back
Blend SrcAlpha One
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex VertexProgram
#pragma fragment FragmentProgram
struct VertexInput
{
float4 Vertex : POSITION;
};

struct VertexOutput
{
float4 Vertex : SV_POSITION;
};
uniform fixed4 _XrayColor;

VertexOutput VertexProgram(VertexInput Input)
{
VertexOutput Output;
Output.Vertex = mul(UNITY_MATRIX_MVP, Input.Vertex);;
return Output;
}
fixed4 FragmentProgram(VertexOutput Input) : SV_Target
{
return _XrayColor;
}
ENDCG
}
Pass //original pass
{
CGPROGRAM
#pragma vertex VertexProgram
#pragma fragment FragmentProgram
#include "UnityCG.cginc"

struct VertexInput
{
float4 Vertex : POSITION;
float2 UV : TEXCOORD0;
};

struct VertexOutput
{
float4 Vertex : SV_POSITION;
float2 UV : TEXCOORD0;
};
uniform sampler2D _MainTex;
half4 _MainTex_ST;

VertexOutput VertexProgram(VertexInput Input)
{
VertexOutput Output;
Output.Vertex = mul(UNITY_MATRIX_MVP, Input.Vertex);
Output.UV = TRANSFORM_TEX(Input.UV, _MainTex);
return Output;
}
fixed4 FragmentProgram(VertexOutput Input) : SV_Target
{
return tex2D(_MainTex, Input.UV);
}
ENDCG
}
}
}

相關的影片如下:



如果想模擬XRay顯示效果的話,在BehindPass加入Rim處理即可,相關的範例影片如下:



後記:其實在沒有Shader的時代,就可以利用multi pass及Render State來實作許多效果,好好利用SceneBlend、MultiPass及RenderState吧。

2017年9月28日 星期四

Sailing simulation with Recastnavigation

For sailing purpose and path finding, I append smooth rotate and speed limit process.
but it's cause unsafe path problem, so i reduce max speed when happen hit wall and agent obstacle.
The final result is here:




Dream continues in...

2017年9月22日 星期五

Append smooth rotate process to Recastnavigation DetourCrowd system

Recastnavigation Detour Crowd is a best path find solution, but for vehicle is not, maybe open steer is better.
I try append smooth process to DetourCrowd, it looks better(smooth rotate).

What did I do?

  1. Append float currentDir[3] and float roateSpeed to dtCrowdAgent.
  2. Append Smooth process to calcSmoothSteerDirection function
  3. Store finial velocity to currentDir[3]
the result is here:




Dream continues in...

2017年6月27日 星期二

AI-RecastNavgation and Crowd avoidance system

在RTS遊戲開發的領域,Path find及local avoidance
一直是很重要的相關技術,而這兩個部份的位移處理
整合,也是令人頭痛的問題。

RecastNavgation是一套相當成熟的路徑搜尋函式庫,
作者Mikko Mononen曾在Crysis擔任lead AI programmer,
且這套函式庫廣泛被商業遊戲引擎中使用(Unreal及Unity)
,也支持動態計算導航網格。

一般的做法大部份都是使用RVO+RecastNavgation但這樣
會造成整合相當困難(RVO說要去這裡,Recast說要去這裡
,倒底聽誰的)。

另外RVO本身也支援靜態阻檔物(obstacle),但它是用一
直撞過去的方式,沒有路徑搜尋。筆者之前曾嘗試著利用
其相關資訊,動態計算出導航點,但在比較複雜的場景效
果不佳,所以就放棄了。

後來去抓最新的RecastNavgation,發現他早就支援了crowd
local avoidance的功能,而且也找到許多Unreal的開發者
早就從RVO移轉到Recast crowd system。

Unity的Path find system雖然也是以RecastNavgation為基
礎開發的,但目前卻還沒有支援Crowd,人家Unreal全部都是
C++,可能比較好支援…

話說回來,目前的專案需求是Server及Client要共用路徑搜尋
的功能,所以不能跟Unity有任何的關係,於是如果要支援
RecastNavgation及其Crowd系統,比較好的解決方案可能就是
自行設計RecastNavgation native c++ plugin

以下是初步整合的成果,此畫面目前是用Ogre來Render(之後
再整合到Unity),在走道可以通過的時候,Agent Sphere會
在那邊排隊等通過,但沒辦法走的時候就各自從旁邊繞過去了

Dream continues in...

2017年5月26日 星期五

Edit and generate RVO obstacle data with ConvexHull in unity

I use C# convex hull library to develop edit and generate RVO obstacle data.
It's just parse unity's mesh data to convex hull data, and put the convex hull vertex to RVO obstacle build function.

The c# convex hull library is here:
MIConvexHull
The c# RVO library is here:
RVO2 Library
The result is here:

2017年5月16日 星期二

Process RVO agent stuck obscale problem with fix path mechanism

Normally, RVO agent behavior have stuck obstacle problem.
So, I add fix path mechanism(data form obstacle vertex point and current agent's point)
to solve this problem.
The idea graph is here:
The result video is here:



Dream continues in...

2017年4月23日 星期日

RVO測試

RVO要是用來做大量物件近距離閃避處理的一套函式庫,有好幾個版本,主要演變過程為
RVO =>HRVO =>ORCA,詳細資訊可以參考這個網站: