GLSL 레이마칭 연구_거리 함수에 대해 공부해본 25
17165 단어 GLSL
GLSL 레이 마칭 연구_거리 함수에 대해 공부해본 09 (Plane의 함수를 만지다)
이전에 Plane 함수를 할 때의 이미지입니다.
마틴 그룹의 정확성 문제이지만 ...
이 둥글기를 취하고 싶다고 생각했습니다.
// レイが進む処理(マーチングループ)
for(int i = 0; i < 32; ++i){
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
그래서, 이번 이야기는, 이 둥근을 취하는 이야기…
for문은 float에서도 돌릴 수 있다.
이제 이런 것을 깨달았습니다.
2의 제곱이 아니어도 좋다!
for( float i=.0; i<16.; i+=.05 ) {
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
이번에는 이것뿐입니다.
다음부터, 이것을 바탕으로 지형 생성에서도 써 가려고 생각합니다.
코드
// ============================================================================
// fractal terrain
// ============================================================================
/* 精度修飾子の宣言 */
precision mediump float;
/* WebGLで受け渡された変数 */
// 解像度 (512.0, 512.0)
uniform vec2 resolution;
// mouse (-1.0 ~ 1.0)
uniform vec2 mouse;
// time (1second == 1.0)
uniform float time;
// previous scene texture
uniform sampler2D prevScene;
// 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 distanceHub(vec3 p){
return sdPlane(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))
));
}
// シェーディング(色など)
vec3 doColor(vec3 p){
float e = 0.001;
// レイとオブジェクトの距離を確認
if (distanceHub(p)<e){
// 法線を算出
vec3 normal = genNormal(p);
// ライトベクトルの定義(マウスの影響を受けるように)
vec3 light = normalize(vec3(1.0, 1.0, 1.0));
// ライトベクトルとの内積を取る
float diff = max(dot(normal, light), 0.1);
return vec3(diff, diff, diff);
// スペキュラーを定義する
// float spec = pow(diff*diff, 15.0);
// return vec3(diff+spec, diff+spec, diff+spec);
}
// 衝突しなかった場合はそのまま黒
return vec3(0.0);
}
/* カメラのワーク */
void main(){
// スクリーンスペースを考慮して座標を正規化
vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
/* カメラを定義 */
// カメラの位置
vec3 cPos = vec3(1.0, 3.0,0.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( float i=.0; i<16.; i+=.05 ) {
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
// レイとオブジェクトの距離を確認
vec3 color = doColor(rPos);
gl_FragColor = vec4(color, 1.0);
}
Reference
이 문제에 관하여(GLSL 레이마칭 연구_거리 함수에 대해 공부해본 25), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/muripo_life/items/31903d82fedf5cd6f920
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
for( float i=.0; i<16.; i+=.05 ) {
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
// ============================================================================
// fractal terrain
// ============================================================================
/* 精度修飾子の宣言 */
precision mediump float;
/* WebGLで受け渡された変数 */
// 解像度 (512.0, 512.0)
uniform vec2 resolution;
// mouse (-1.0 ~ 1.0)
uniform vec2 mouse;
// time (1second == 1.0)
uniform float time;
// previous scene texture
uniform sampler2D prevScene;
// 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 distanceHub(vec3 p){
return sdPlane(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))
));
}
// シェーディング(色など)
vec3 doColor(vec3 p){
float e = 0.001;
// レイとオブジェクトの距離を確認
if (distanceHub(p)<e){
// 法線を算出
vec3 normal = genNormal(p);
// ライトベクトルの定義(マウスの影響を受けるように)
vec3 light = normalize(vec3(1.0, 1.0, 1.0));
// ライトベクトルとの内積を取る
float diff = max(dot(normal, light), 0.1);
return vec3(diff, diff, diff);
// スペキュラーを定義する
// float spec = pow(diff*diff, 15.0);
// return vec3(diff+spec, diff+spec, diff+spec);
}
// 衝突しなかった場合はそのまま黒
return vec3(0.0);
}
/* カメラのワーク */
void main(){
// スクリーンスペースを考慮して座標を正規化
vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
/* カメラを定義 */
// カメラの位置
vec3 cPos = vec3(1.0, 3.0,0.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( float i=.0; i<16.; i+=.05 ) {
dist = distanceHub(rPos);
rLen += dist;
rPos = cPos + ray * rLen;
}
// レイとオブジェクトの距離を確認
vec3 color = doColor(rPos);
gl_FragColor = vec4(color, 1.0);
}
Reference
이 문제에 관하여(GLSL 레이마칭 연구_거리 함수에 대해 공부해본 25), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/muripo_life/items/31903d82fedf5cd6f920텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)