GLSL 레이 마칭 연구_거리 함수에 대해 공부해본 09 (Plane의 함수를 만지다)
Plane 수식
n_{x}x+n_{y}y+n_{z}z=n_{w}
에서,
n_{x}:x方向の傾き, n_{y}:y方向の傾き, n_{z}:z方向の傾き \\
-n_{w}/n_{y}:y軸の高さ \\
(n_{x},n_{y},n_{z}):法線ベクトル
파생은이 기사를 참조하십시오 평면 방정식과 그 세 가지 방법을 찾는 방법
Plane의 거리 함수는
vec4 n = vec4(【x方向の傾き】, 【y方向の傾き】, 【z方向の傾き】, 1.0);
return dot(p,n.xyz) + n.w;
이 함수는 단순히 floor
를 작성할 때 사용하는 함수이므로 특별한 설명은 없습니다.
강하게 말하면 카메라에 평행하게 만들고 싶다면 vec4 n = vec4(0.0, 1.0, 0.0, 1.0);
우선, 뭔가를 만들어 보겠습니다.
달
바운드 해 보았습니다.
출처
// ============================================================================
// Plane function
// ============================================================================
precision mediump float;
uniform vec2 resolution; // resolution (512.0, 512.0)
uniform vec2 mouse; // mouse (-1.0 ~ 1.0)
uniform float time; // time (1second == 1.0)
uniform sampler2D prevScene; // previous scene texture
// Planeの距離関数
float sdPlane(vec3 p){
// Planeの距離関数
// n must be normalized
vec4 n = vec4(0.0, 1.0, 0.0, 1.0);
return dot(p, n.xyz) + n.w;
}
// 球
float dSphere(vec3 p){
// バウンドの表現
p = vec3(p.x+2.0, p.y+2.0-1.25*cos(time) ,p.z-2.0);
return length(vec3(p.x-3.0, p.y-3.0, p.z))-0.7;
}
// 距離関数を呼び出すハブ関数
float distanceHub(vec3 p){
// return sdPlane(p);
return min(sdPlane(p), dSphere(p));
}
// 法線を生成する
vec3 genNormal(vec3 p){
float d = 0.001;
return normalize(vec3(
distanceHub(p + vec3( d, 0.0, 0.0)) - distanceHub(p + vec3( -d, 0.0, 0.0)),
distanceHub(p + vec3(0.0, d, 0.0)) - distanceHub(p + vec3(0.0, -d, 0.0)),
distanceHub(p + vec3(0.0, 0.0, d)) - distanceHub(p + vec3(0.0, 0.0, -d))
));
}
void main(){
// スクリーンスペースを考慮して座標を正規化する
vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
// カメラを定義する
vec3 cPos = vec3(0.0, 0.0, 5.0); // カメラの位置
vec3 cDir = vec3(0.0, 0.0, -1.0); // カメラの向き(視線)
vec3 cUp = vec3(0.0, 1.0, 0.0); // カメラの上方向
vec3 cSide = cross(cDir, cUp); // 外積を使って横方向を算出
float targetDepth = 1.0; // フォーカスする深度
// カメラの情報からレイを定義する
vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir * targetDepth);
// マーチングループを組む
float dist = 0.0; // レイとオブジェクト間の最短距離
float rLen = 0.0; // レイに継ぎ足す長さ
vec3 rPos = cPos; // レイの先端位置(初期位置)
for(int i = 0; i < 32; ++i){
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
// レイとオブジェクトの距離を確認
if(abs(dist) < 0.001){
// 法線を算出
vec3 normal = genNormal(rPos);
// ライトベクトルの定義
vec3 light = normalize(vec3(1.0, 1.0, 1.0));
// ライトベクトルとの内積を取る
float diff = max(dot(normal, light), 0.1);
gl_FragColor = vec4(vec3(diff, diff, diff), 1.0);
}else{
// 衝突しなかった場合はそのまま黒
gl_FragColor = vec4(vec3(0.0, 0.0, 0.0), 1.0);
}
}
Reference
이 문제에 관하여(GLSL 레이 마칭 연구_거리 함수에 대해 공부해본 09 (Plane의 함수를 만지다)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/muripo_life/items/074f69a5f0bac74e71e6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
n_{x}x+n_{y}y+n_{z}z=n_{w}
n_{x}:x方向の傾き, n_{y}:y方向の傾き, n_{z}:z方向の傾き \\
-n_{w}/n_{y}:y軸の高さ \\
(n_{x},n_{y},n_{z}):法線ベクトル
vec4 n = vec4(【x方向の傾き】, 【y方向の傾き】, 【z方向の傾き】, 1.0);
return dot(p,n.xyz) + n.w;
이 함수는 단순히
floor
를 작성할 때 사용하는 함수이므로 특별한 설명은 없습니다.강하게 말하면 카메라에 평행하게 만들고 싶다면
vec4 n = vec4(0.0, 1.0, 0.0, 1.0);
우선, 뭔가를 만들어 보겠습니다.
달
바운드 해 보았습니다.
출처
// ============================================================================
// Plane function
// ============================================================================
precision mediump float;
uniform vec2 resolution; // resolution (512.0, 512.0)
uniform vec2 mouse; // mouse (-1.0 ~ 1.0)
uniform float time; // time (1second == 1.0)
uniform sampler2D prevScene; // previous scene texture
// Planeの距離関数
float sdPlane(vec3 p){
// Planeの距離関数
// n must be normalized
vec4 n = vec4(0.0, 1.0, 0.0, 1.0);
return dot(p, n.xyz) + n.w;
}
// 球
float dSphere(vec3 p){
// バウンドの表現
p = vec3(p.x+2.0, p.y+2.0-1.25*cos(time) ,p.z-2.0);
return length(vec3(p.x-3.0, p.y-3.0, p.z))-0.7;
}
// 距離関数を呼び出すハブ関数
float distanceHub(vec3 p){
// return sdPlane(p);
return min(sdPlane(p), dSphere(p));
}
// 法線を生成する
vec3 genNormal(vec3 p){
float d = 0.001;
return normalize(vec3(
distanceHub(p + vec3( d, 0.0, 0.0)) - distanceHub(p + vec3( -d, 0.0, 0.0)),
distanceHub(p + vec3(0.0, d, 0.0)) - distanceHub(p + vec3(0.0, -d, 0.0)),
distanceHub(p + vec3(0.0, 0.0, d)) - distanceHub(p + vec3(0.0, 0.0, -d))
));
}
void main(){
// スクリーンスペースを考慮して座標を正規化する
vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
// カメラを定義する
vec3 cPos = vec3(0.0, 0.0, 5.0); // カメラの位置
vec3 cDir = vec3(0.0, 0.0, -1.0); // カメラの向き(視線)
vec3 cUp = vec3(0.0, 1.0, 0.0); // カメラの上方向
vec3 cSide = cross(cDir, cUp); // 外積を使って横方向を算出
float targetDepth = 1.0; // フォーカスする深度
// カメラの情報からレイを定義する
vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir * targetDepth);
// マーチングループを組む
float dist = 0.0; // レイとオブジェクト間の最短距離
float rLen = 0.0; // レイに継ぎ足す長さ
vec3 rPos = cPos; // レイの先端位置(初期位置)
for(int i = 0; i < 32; ++i){
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
// レイとオブジェクトの距離を確認
if(abs(dist) < 0.001){
// 法線を算出
vec3 normal = genNormal(rPos);
// ライトベクトルの定義
vec3 light = normalize(vec3(1.0, 1.0, 1.0));
// ライトベクトルとの内積を取る
float diff = max(dot(normal, light), 0.1);
gl_FragColor = vec4(vec3(diff, diff, diff), 1.0);
}else{
// 衝突しなかった場合はそのまま黒
gl_FragColor = vec4(vec3(0.0, 0.0, 0.0), 1.0);
}
}
Reference
이 문제에 관하여(GLSL 레이 마칭 연구_거리 함수에 대해 공부해본 09 (Plane의 함수를 만지다)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/muripo_life/items/074f69a5f0bac74e71e6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// ============================================================================
// Plane function
// ============================================================================
precision mediump float;
uniform vec2 resolution; // resolution (512.0, 512.0)
uniform vec2 mouse; // mouse (-1.0 ~ 1.0)
uniform float time; // time (1second == 1.0)
uniform sampler2D prevScene; // previous scene texture
// Planeの距離関数
float sdPlane(vec3 p){
// Planeの距離関数
// n must be normalized
vec4 n = vec4(0.0, 1.0, 0.0, 1.0);
return dot(p, n.xyz) + n.w;
}
// 球
float dSphere(vec3 p){
// バウンドの表現
p = vec3(p.x+2.0, p.y+2.0-1.25*cos(time) ,p.z-2.0);
return length(vec3(p.x-3.0, p.y-3.0, p.z))-0.7;
}
// 距離関数を呼び出すハブ関数
float distanceHub(vec3 p){
// return sdPlane(p);
return min(sdPlane(p), dSphere(p));
}
// 法線を生成する
vec3 genNormal(vec3 p){
float d = 0.001;
return normalize(vec3(
distanceHub(p + vec3( d, 0.0, 0.0)) - distanceHub(p + vec3( -d, 0.0, 0.0)),
distanceHub(p + vec3(0.0, d, 0.0)) - distanceHub(p + vec3(0.0, -d, 0.0)),
distanceHub(p + vec3(0.0, 0.0, d)) - distanceHub(p + vec3(0.0, 0.0, -d))
));
}
void main(){
// スクリーンスペースを考慮して座標を正規化する
vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
// カメラを定義する
vec3 cPos = vec3(0.0, 0.0, 5.0); // カメラの位置
vec3 cDir = vec3(0.0, 0.0, -1.0); // カメラの向き(視線)
vec3 cUp = vec3(0.0, 1.0, 0.0); // カメラの上方向
vec3 cSide = cross(cDir, cUp); // 外積を使って横方向を算出
float targetDepth = 1.0; // フォーカスする深度
// カメラの情報からレイを定義する
vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir * targetDepth);
// マーチングループを組む
float dist = 0.0; // レイとオブジェクト間の最短距離
float rLen = 0.0; // レイに継ぎ足す長さ
vec3 rPos = cPos; // レイの先端位置(初期位置)
for(int i = 0; i < 32; ++i){
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
// レイとオブジェクトの距離を確認
if(abs(dist) < 0.001){
// 法線を算出
vec3 normal = genNormal(rPos);
// ライトベクトルの定義
vec3 light = normalize(vec3(1.0, 1.0, 1.0));
// ライトベクトルとの内積を取る
float diff = max(dot(normal, light), 0.1);
gl_FragColor = vec4(vec3(diff, diff, diff), 1.0);
}else{
// 衝突しなかった場合はそのまま黒
gl_FragColor = vec4(vec3(0.0, 0.0, 0.0), 1.0);
}
}
Reference
이 문제에 관하여(GLSL 레이 마칭 연구_거리 함수에 대해 공부해본 09 (Plane의 함수를 만지다)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/muripo_life/items/074f69a5f0bac74e71e6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)