Open19
Shader毎日やるぞ
毎日1記事やるぞ
おすすめ記事
- KENTOさんの記事一覧 | Zenn
- そろそろShaderをやるパート1 Unite 2017の動画を見る(基礎知識~フラグメントシェーダーで色を変える)
- IndieVisualLab/UnityGraphicsProgrammingSeries: 書籍「Unity Graphics Programming」シリーズのPDFコレクション
- 楽しい!Unityシェーダー お絵描き入門! - Google スライド
- The Book of Shaders
- Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more
- シェーダー - Unity マニュアル
- Unity ShaderLab ノート - Qiita
- レイマーチングで使われるSDFを解釈する~Part4~ - Qiita
- Distance Estimated 3D Fractalsを理解するためのロードマップ - 心鏡曼荼羅
- Shader1weekCompo
- GLSLシェーダープログラミングというのを最近やってる話 | 哲学思考のなれの果て
- SDF for raymarching (距離関数のスキル)
- Polytopes and Coxeter Groups
- Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more
2022/09/30
Unity2021 + Riderで環境構築
Riderがサポートするシェーダー周りの機能メモ - Qiita
そろそろShaderをやるパート2 Unite 2017の動画を見る(頂点シェーダーで大きさを変える)
プロシージャルモデリング
IndieVisualLab/UnityGraphicsProgrammingSeries: 書籍「Unity Graphics Programming」シリーズのPDFコレクション
2022/10/1
プロシージャルモデリング面白そうかも
Plane.cs
からやる
2022/10/4
楽しい!Unityシェーダー お絵描き入門! - Google スライドのp96
step(),frac(),floor()の使い方を学んだ
次はこれの立方体バージョンを作りたい(レイマーチ?)
2022/10/06
-
雷を描く - Qiita
- 雷のシミュレーション
-
Unity 2017.1 の機能の CustomRenderTexture を使ってみた - 凹みTips
- テッセレーション
2022/10/7~16
セラーノイズのボロノイ分割について
- The Book of Shaders: More noise
- Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more
ボロノイについて
-
計算幾何学入門 Introduction to Computational Geometry
- ドロネー図について
- 計算幾何学
-
ボロノイ図とその3つの性質 | 高校数学の美しい物語
- ボロノイ頂点
- Random Delaunay Triangulation
レイマーチングについて
- レイマーチングの理解
- 格子の探索
- レイマーチングのエフェクト
- (1) Tokyo Demo Fest 2021 - Seminar: "レイマーチング1から5(命名: @kuyuri_iroha)" by 0b5vr - YouTube
- レイマーチング1から5 - Google ドライブ
- レイマーチするとき、距離関数で法線を求める(陰関数の勾配で法線をもとめる)
- レイマーチングで使う色々な距離関数
- レイマーチングでエッジ検出
- レイマーチングで distance fog
- 20211210_distance fog
exp(-distance)
ボロノイの母点と格子をレイマーチングした
3Dボロノイレイマーチング
アルゴリズム
- 2Dの場合で、任意の点から最短のボロノイ頂点をもとめるアルゴリズムを考える
- 3d voronoi diagramで検索すると論文とかがでてくる
- 上を3Dに適応する
- ドロネー分割で上手くいくか?
色付け
- distance fog
格子
- modを使って格子の距離関数が書けるはず
- wgld.org | GLSL: オブジェクトの複製 repetition |
// 繰り返し、rは繰り返しの間隔
float3 trans(float3 p,float r)
{
return fmod(p,r)-r/2.0;
}
float cubesSDF(float3 p, float3 size)
{
p = abs(p);
float3 e = trans(p,1) ;
return length(max(abs(e) - size, 0.0)) ;
}
float grid2(float3 p )
{
float r = 0.01;
// 四角柱を各方向に繰り返し描画
float mx = cubesSDF(p,float3(1,r,r));
float my = cubesSDF(p,float3(r,1,r));
float mz = cubesSDF(p,float3(r,r,1));
return min(min(mx,my),mz);
}
2022/10/17
3Dボロノイアルゴリズム調査
ボロノイ境界
- Perfect Border Voronoi
- Inigo Quilez :: computer graphics, mathematics, shaders, fractals, demoscene and more
実装方針
1
任意の点Pと最も近いボロノイ頂点を含む面に垂直な直線との距離を返す距離関数を実装
2
任意の点Pとボロノイ平面との距離を返す関数から、垂直二等分点を中心とした適当な半径の球の外にある場合のみ距離を返す、含まれている場合は0.01とかを返す。
2022/10/18
4つの点から球の中心を求める。
- 二つの外心を求めて二つの直線から中心を求める
- 逆行列を計算する
- ガウスの消去法で解く
2023/06/25 初GLSL
短縮前
#ifdef GL_ES
precision mediump float;
#endif
uniform float time;
uniform vec2 resolution;
vec3 lightDir = normalize(vec3(1.0, 1.0, 1.0));
float sphereSDF(vec3 pos, float size){
return length(pos) - size;
}
float planeSDF(vec3 p, vec3 n, float s) {
return dot(normalize(n),p)-s;
}
float octaSDF(vec3 p, float s) {
return planeSDF(abs(p), vec3(1.0, 1.0, 1.0), s);
}
float SDF(vec3 pos, float size)
{
float sphere = sphereSDF(mod(pos,2.0)-1.0,size*(1.0+sin(time*2.0)*0.5));
float octa = octaSDF(mod(pos,2.0)-1.0,size*0.9);
return max(-sphere,octa);
}
vec3 getNormal(vec3 pos, float size)
{
float ep = 0.0001;
return normalize(vec3(
SDF(pos, size) - SDF(vec3(pos.x - ep, pos.y, pos.z), size),
SDF(pos, size) - SDF(vec3(pos.x, pos.y - ep, pos.z), size),
SDF(pos, size) - SDF(vec3(pos.x, pos.y, pos.z - ep), size)
));
}
void main( void )
{
vec2 pos = (gl_FragCoord.xy * 2.0 - resolution.xy) / min(resolution.x, resolution.y);
vec3 col = vec3(0.0);
vec3 rayOrigin = vec3(0.0, 0.0, -time);
float rayLength = 0.0;
float currentDistance = 1.0;
float epsilon = 0.01;
vec3 rayDir = normalize(vec3((gl_FragCoord.xy - resolution * 0.5) / resolution.y, 0.5));
vec3 P;
float size = 0.5;
for (int i = 0; i < 32; i++)
{
P = rayDir * rayLength + rayOrigin;
currentDistance = SDF(P, size);
if (currentDistance < 0.0001)
{
vec3 normal = getNormal(P, size);
float diff = dot(normal, lightDir);
col = vec3(0.1,0.1,1)+vec3(diff) + vec3(0.1);
break;
}
rayLength += currentDistance;
}
gl_FragColor = vec4(col, 1.0);
}
minify後
#define D(P) max(-(length(mod(P,2.)-1.)-.5*(1.+sin(t*2.)*.5)),dot(vec3(.6),abs(mod(P,2.)-1.))-.5*.9)
float i,l,d=1.,e=0.01;vec3 O=vec3(0,0,t),R=vec3((FC.xy-r*.5)/r.y,1),P;for(;i++<32.;){P=R*l+O,d=D(P);if(d<e)o.xyz=R+max(D(P+.3*e)-D(P),.0)/e;l+=d;}
立方体の辺だけを描画してくれるshader