創作內容

6 GP

記錄一下自己做過的programming&art

作者:NiloCat│2015-06-15 01:16:56│巴幣:12│人氣:1050
[記錄文]
記錄一下近幾年學過/做過的大小事。

2011_9_28 第一天學習Programming,是Java的Hello World。
2013_1_29 C++ DirectX 11 programming
http://youtu.be/ewxAv1SQsEk
2013_5_11 Unreal Engine 3 Dynamic Enviroment Shader - Snow
http://youtu.be/WWNJjEmRUgA?t=2m1s
2013_8月 C4Cat成立
2013_9月~2014_2_9 在C4Cat負責一個手機遊戲,
但我因Unity技術不足,失敗了,但C4Cat的成員沒有怪責我。
2014_3_4 決心由零開始重新學習Unity,
Space Shooter(Unity官方的學習project)
https://972db5d5c164ce9573a022afa122d90df7681a82.googledriv…
2014_3_6 開始研究Shader Programming(cg),
2D Animation Fragment Shader
https://11120fda4bc4ff42e383940841d95a62b62c18b1.googledriv…
2014_3_19 Vertex Shader (這個我自己很喜歡www)
https://1501a95243b07d50fcac6e33121d2215212d3bc0.googledriv…
2014_4_28 花一個月做遊戲,順利完成了
Shadow of Life,巴哈參賽
http://youtu.be/v5a0p5LTqbA
2014_5_6 dynamix MV rim light ,vertexAO shader
https://2c1c022af3b65737a32487682cd23d8c09b0f04f.googledriv…
2014_5_9 開始停止Programming的學習,轉去學畫畫了
2014_5_27 First Original Character Art
http://www.pixiv.net/member_illust.php…
2014_6_11 2014巴哈ACG創作大賽(台灣) - Shadow of Life 佳作賞
http://prj.gamer.com.tw/acgaward/2014/awards_game.php…
2014_9_13 IGF China 2014 - Shadow of Life Student Finalist
http://www.gdcchina.com/events/igf_finalists.html
2014_11月 Shadow of Life (Mobile)
http://youtu.be/CHzKv8Hc3iU

2015_3月 UnrealEngine4學習
https://youtu.be/oY9mQ_FlNRE
2015_5月 DX11 Compute Shader GPU Particle(由別人的sample code開始的)
2015_6月 因朋友想要一年前的Fragment wave shader的source code,所以重製了一下

2015_1月~今(不能公開的C4Cat團隊開發遊戲)

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2867450
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 14 篇留言

要你命3000
大大 想請問一下 學SHADER有沒有什麼推薦的方法
學了一兩周之後
只看得懂程式碼
但要我自己寫
不知道怎麼將腦中想要的效果寫出來
我本身只學過程式
沒有任何美術經驗...
很多時都不知道那些式子為什麼要那樣做...

07-01 21:30

NiloCat
介意把你"腦中想要的效果"告訴我嗎?
從一個例子中解釋會比較容易

我自己要去寫一個new shader時,
通常都是從一個基本的shader template 去改的。
例如
https://en.wikibooks.org/wiki/Cg_Programming/Unity/Textured_Spheres07-16 01:32
NiloCat
這樣我可以專注在shading上的問題,而不是寫shader的syntax問題07-16 01:33
要你命3000
應該說 因為我看了不少文章
還有一些SHADER的書
但都沒有解釋 struct vertexInput
struct vertexOutput
這些東西裡面的結構
還有我們到底取得的是什麼東西
像假如我想取得所有點
然後往外擴張(我知道要取法向量)
到底該怎麼寫

07-16 09:34

要你命3000
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
像這種的
通常問題就是我想自己寫一個效果
但我不知道裡面該怎麼寫...

07-16 09:38

NiloCat
關於
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;

float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
這是什麼,有什麼用。07-16 21:21
NiloCat
我就用這個做例子吧
https://en.wikibooks.org/wiki/Cg_Programming/Unity/Textured_Spheres

一個shader會做的通常是
1.從model取得需要的data(例如vertex position,vertex normal,vertex color,vertex texture coordinate....等等,而這就是你指的vertexInput)
2.用取得的data在vertex shader 做action(例如把model向normal方向擴大)
3.vertex shader完成後,可以return一個struct(就是你指的vertexOutput)給fragment shader用
4.fragment shader用vertex shader給予的struct的data,做pixel 最終顏色的計算07-16 21:21
NiloCat
下邊會講一下shader coding上的

#pragma vertex vert //這句是指我們想vertex shader用 vert這個function
#pragma fragment frag //這句是指我們想fragmnetshader用 frag這個function

你可以改自己想要的名字,例如
#pragma vertex myVertexFunction
#pragma vertex myFragmentFunction

uniform sampler2D _MainTex; //指從shader外(Unity)傳一張texture到這shader07-16 21:21
NiloCat
struct vertexInput {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
};

這個struct會指定shader應該從mesh中得到什麼data.
如果我加一行
float3 myNormalFromMesh : NORMAL;

我就可以在vertexShader中利用meshNormal(法向量)做計算

關於有什麼data可以從mesh傳到vertexShader,可以看這list
: POSITION;
: NORMAL;
: TEXCOORD0;
: TEXCOORD1;
: TEXCOORD2;
: TEXCOORD3;
: TANGENT;
: COLOR;

http://docs.unity3d.com/Manual/SL-VertexProgramInputs.html07-16 21:21
NiloCat
在vertexShader中

vertexOutput vert(vertexInput input) //vertexInput是上邊講到的struct
{
vertexOutput output;

output.tex = input.texcoord;

//這句是做ModelViewProject matrix transform,
//是由objectSpace transform 到 screenSpace
//令output.pos準備好在fragmentShader中運作
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);

//把計算好的struct傳給fragmentShader
return output;
}07-16 21:30
NiloCat
如果你想mesh向normal方向擴大,

1.要在vertexInput struct加
float3 myNormalFromMesh : NORMAL;

2.在vertexShader做ModelViewProject transform前改變vertexPosition
output.pos = mul(UNITY_MATRIX_MVP, input.vertex + float4(input.myNormalFromMesh,0) * 1);07-16 21:34
要你命3000
首先謝謝大大的解惑
想問一下uniform是什麼意思
這詞我查很多網站還是沒有很清楚

然後是 TEXCOORD0;
他有01234 是什麼意思
很多UV貼圖嗎?

還有我想確認一下觀念
所以我們寫SHADER是
每一個vertex都跑這個流程一次

還有一個問題是
Tangent這東西通常什麼時候需要取用
返回的東西到底是什麼 官網關於這東西的描述我不太懂意思= =

07-16 22:28

NiloCat
uniform 是cg variable's 的qualifier。(指這個variable是從外傳到shader中的)
在Unity的 .shader file中, 有uniform和沒有uniform是完全沒有分別的
所以你可以不用理會uniform,07-16 23:09
NiloCat
: TEXCOORD0,
: TEXCOORD1,
: TEXCOORD2,
: TEXCOORD3

如果是在vertexInput struct中,這0123就是指把mesh的texture coordinate都傳到vertexShader(因為1個mesh可以有很多組texture coordinate,就是分了幾set UV的意思)
07-16 23:15
NiloCat
shader是由vertex shader 和 fragment shader 組成的

"還有我想確認一下觀念"
1個vertex會運行你的vertex shader一次
1個screen上的pixel會運行你的fragment shader一次

例如你做了一個車的mesh,用了100個vertex,你要render這個車就要把vertex shader運行100次。

當所有vertex都運行完vertex shader,GPU就會做rasterization(把vertex shader的計算結果linear interpulate到任何一個相關的pixel上)

假設你的車在畫面上佔了300x300個pixel,你就會運行fragment shader 300x300 = 90000次07-16 23:24
NiloCat
Tangent是計算normal map時用的
: TANGENT; 給予的data就是你在3d software(3dsmax,maya...)給予 mesh的tangent07-16 23:26
NiloCat
Tangent我認為之後再去理解都沒有問題,因為tangent是不容易簡單地運用的07-16 23:28
要你命3000
struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR;
};

v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.color.xyz = v.normal * 0.5 + 0.5;
o.color.w = 1.0;
return o;
}

還有像上面這種
我要怎麼分辨他寫的STRUCT到底是INPUT還是OUTPUT

appdata_base還有這個用法我也不太清楚
這些我都在官網看過 但看完描述也是模模糊糊
觀念沒有很清楚

07-16 22:42

NiloCat
appdata_base 是unity已經寫好給你用的 vertex input struct。
其實只是方便你不用寫vertex input struct而已。

appdata_base(和幾個其他appdata_xxx struct)和下邊的code是沒有分別的

struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};

struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};

struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
#if defined(SHADER_API_XBOX360)
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
fixed4 color : COLOR;
};07-16 23:45
要你命3000
分了幾SET UV是什麼意思啊
UV不就是單一張貼圖嘛
可以分是什麼意思?

07-16 23:34

NiloCat
struct的名字是自己改的,你可以叫 struct myVertexInput{...}; 都可以
要知道struct是Input / Output。要看什麼function用了這個struct。

//這一句指vertex shader會用1個叫 myVertexShaderFunction() 的function去運行
#pragma vertex myVertexShaderFunction

myVertexOutput myVertexShaderFunction (myVertexInput input)
{
// some vertex function code here
}

很多數情況 input struct會有
float4 xxx : POSITION;

而 output struct會有
float4 xxx : SV_POSITION

07-16 23:36

NiloCat
"分了幾SET UV是什麼意思啊
UV不就是單一張貼圖嘛
可以分是什麼意思?"

UV "不是" 單一張貼圖,而是 texture coordinate,是2個數字(u,v)組成的
我們會在fragment function用這個uv數字去找texture上的位置。

tex2D(_MainTex, input.tex.xy);

例如當u=0.5,v=0.5時,我們會找到在_MainTex中心的顏色

07-16 23:41

要你命3000
恩 我知道他是一個(u,v)
但我不太懂得是用一個0就好了
為什麼還要有1,2,3,4 分SET的意思是什麼
最後想問說
SV_POSITION跟POSITION差在哪
為什麼OUTPUT 要用SV_POSITION
我記得有說以前可以通用
但現在OUTPUT好像建議都加上SV

07-17 09:08

NiloCat
: TEXCOORD0; //是指從mesh取得第一組 UV,很多數的情況1個mesh要上texture都是用這個UV
: TEXCOORD1; //是指從mesh取得第二組 UV,很多數的情況Unity的Lightmapping會用這個UV

: TEXCOORD2;
: TEXCOORD3;
//當你在max/maya/blender...自己建模時,你可以另加其他UV
//所以1個mesh的1個vertex是可以有幾組UV的

07-17 16:00

NiloCat
在vertexInput中用POSITION 是指從mesh取得的model space/object space/local space position
會用到的是 x,y,z(就好像Unity C#的 transform.localPosition)
這個POSITION的value是用mesh的origin(0,0,0)做中心的,所以你在Unity Scene把gameObject拉到什麼地方都不會影響vertexInput的 POSITION。
--------------------------------------------------------------
在vertexOutput中用SV_Position 是1個ScreenSpace Position,是指這個float4會用來做rasterizer stage operation.
(SV_Position.xy 是 screen xy , SV_Position.z是 depth buffer non-linear value)
SV prefix 是指 "System Value",這個Semantics 從是DirectX 10 開始出現的。
--------------------------------------------------
POSTION 和 SV_POSITION 的關係是ModelViewProjection transform
//o.pos 是 SV_POSITION,而 v.vertex是POSITION
//這句在很多情況都會在vertex shader出現
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

07-17 16:21

新手方
巴幣不多 只能送500支持

小的有問題想問:
大大建議C++學到甚麼地步在開始學DX呢?

07-26 12:19

NiloCat
你好 新手方
其實C++ 慬基本pointer,reference,memory allocation,struct,class,function call,ifelse,forloop,已經可以開始的了。

如果發現看DX sample project時不是因為DX API/3D concept,而是真的因為C++阻止了理解,這時再去看C++吧
07-26 12:53
NiloCat
一開始學DX時,看愈簡單的sample project愈有幫助(一開始不用自已Coding,看慬sample project,慬得改,是你的第一目標07-26 12:56
velloyboy
大大的觀念很清楚呢! 看完留言有些網路上找不到的觀念都解了,想請問您是有特別學過電腦圖學之類的嗎?

08-10 18:02

coco830514
謝謝大大!!!!
最近開始學習shader,剛到大致了解在做什麼,但很多地方觀念也是模模糊糊的
剛好看到這篇解了很多自己看不太明白的地方,真的謝謝大大耐心解惑
不過有一點可以請大大幫忙嗎> <
上面很多shader有關的連結都失效了,如果大大願意的畫能否補檔呢
再次謝謝!!!

02-24 17:06

我要留言提醒:您尚未登入,請先登入再留言

6喜歡★colin299 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:試一下Unreal En...

追蹤私訊切換新版閱覽

作品資料夾

coopdar1345我的GP超人
「我的夢想在於璀璨的太空,穿越宇宙萬物星河,人類的探索之心,從無止息。」山‧布礠——《遙遠的星球》看更多我要大聲說1小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】