[연재 GLSL 이야기] 치카라를 원하는가… … (제2화) 새로운 힘, 그 이름은 벡터 거리 필드!
벡터 거리 필드
h tps://오. gl / Bkk
precision mediump float;
uniform vec2 m; // mouse
uniform float t; // time
uniform vec2 r; // resolution
uniform sampler2D smp; // prev scene
void main(void){
vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y); // 正規化
vec2 q = normalize(p)*.8-p;
float l=step(length(q),.03);
gl_FragColor = vec4(vec3(l), 1.);
}
먼저 벡터 디탄스 필드를 사용하여 원을 그립니다.
보통 원을 그린 것과 다르지 않네요.
한 번 쓸데없는 변환이 들어갔을 뿐이므로, 당연하네요.
vec2 q = normalize(p)*.8-p;
이 q는 벡터 거리 필드에서
length 함수를 곱하면
float l=length(q);
언제든지 거리 필드로 되돌릴 수 있습니다.
그런데, 2D에서는 사용되지 않는 normalize(p)라고 하는 낯선 glsl의 함수가 사용되고 있네요.
원의 거리 필드는
1.-length(p)
하지만 여기에서 원의 벡터 거리 필드를 추측해 보겠습니다.
1. 라는 것은 원래는 p의 단위 벡터로 추측할 수 있으므로 normalize(p)로 추측할 수 있습니다.
length(normalize(p)) = 1.
라는 것은
length(normalize(p)) - length(p)
길이를 정리하면
length(normalize(p)-p)
벡터 거리 필드는 길이를 사용하여 스칼라로 만들기 전에
normalize(p)-p
제대로 이끌었습니다!
이것만이라면, 단순히 한 번 쓸데없는 처리가 들어갈 뿐이므로,
서둘러 원형 벡터 거리 필드에 원형 벡터 거리 필드를 올려 봅시다!
다음 번
precision mediump float;
uniform vec2 m; // mouse
uniform float t; // time
uniform vec2 r; // resolution
uniform sampler2D smp; // prev scene
void main(void){
vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y); // 正規化
vec2 q = normalize(p)*.8-p;
float l=step(length(q),.03);
gl_FragColor = vec4(vec3(l), 1.);
}
vec2 q = normalize(p)*.8-p;
float l=length(q);
1.-length(p)
length(normalize(p)) = 1.
length(normalize(p)) - length(p)
length(normalize(p)-p)
normalize(p)-p
Reference
이 문제에 관하여([연재 GLSL 이야기] 치카라를 원하는가… … (제2화) 새로운 힘, 그 이름은 벡터 거리 필드!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7CIT/items/cfe28d258cddb009f67e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)