그래서, "볼륨"에 대해 알고하지 않습니다 (그 자체로) 표시하는 방법 (...) 체적 모양
OpenGL은있다. 그것은 순수한 우연히 깊이 버퍼 테스트에 의한 심도 정렬과 같은 렌더링 부작용을 일으킬 수있는 평평한 삼각형, 선 및 점을 알고 있습니다.
기술적으로 CSG (건설적인 고체 기하학)를 수행하기 위해 일련의 그리기 및 스텐실 버퍼 작업을 연결할 수 있습니다. 자세한 내용은 ftp://ftp.sgi.com/opengl/contrib/blythe/advanced99/notes/node22.html을 참조하십시오.
그러나 원하는 것은 프래그먼트 셰이더에서 실행되는 간단한 광선 추적기를 통해 쉽게 구현됩니다. 이제 raytracing 자체는 광범위한 주제이며 책을 채울 수 있습니다 (실제로 많은 책이 주제에 쓰여졌습니다). 아마도 예제를 참조하는 것이 가장 좋습니다. 이 경우 나는을 참조 ShaderToy https://www.shadertoy.com/view/ldS3DW는 다음 - 그 쉐이더의 약간 버전을 박탈은 관심있는 교차 구조의 종류립니다
float sphere(vec3 ray, vec3 dir, vec3 center, float radius)
{
vec3 rc = ray-center;
float c = dot(rc, rc) - (radius*radius);
float b = dot(dir, rc);
float d = b*b - c;
float t = -b - sqrt(abs(d));
float st = step(0.0, min(t,d));
return mix(-1.0, t, st);
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
vec2 uv = (-1.0 + 2.0*fragCoord.xy/iResolution.xy) *
vec2(iResolution.x/iResolution.y, 1.0);
vec3 ro = vec3(0.0, 0.0, -3.0);
vec3 rd = normalize(vec3(uv, 1.0));
vec3 p0 = vec3(0.5, 0.0, 0.0);
float t0 = sphere(ro, rd, p0, 1.0);
vec3 p1 = vec3(-0.05, 0.0, 0.0);
float t1 = sphere(ro, rd, p1, 1.0);
fragColor = vec4(step(0.0,t0)*step(0.0,t1)*rd, 1.0);
}
확인을, 그래서 그렇게 할 "마술 방법은"없다 , 즉 OpenGL에서 옵션을 활성화하거나 비활성화합니다. 셰이더에서 그렇게하는 것이 좋겠지 만, 제 경우에는 단순한 구체를 넘어선 여러 모양이 있습니다. 따라서 셰이더가 훨씬 더 복잡해질 수 있습니다. 아마도 나를위한 더 나은 방법은 마침내 스텐실 버퍼를 사용하는 것입니다. 어쨌든, 답변 해 주셔서 감사합니다 (그리고 OpenGL 볼륨에 대한 실수로 인해 유감 :-)) –