2017-12-06 12 views
0

OpenGL을 사용하여 여러 기하학적 3D 모양을 표시하는 수학 응용 프로그램을 만들고 있습니다. 어떤 경우에는이 쉐이프들이 서로 엇갈 리며,이 때 서로 다른 쉐이프의 교차하는 부분을 보여주기를 원합니다. 양쪽 모양이 반투명으로 내가 필요한 것은 더 많거나 같은 덜 뭔가 :2 개의 반투명 오브젝트의 공통 부분을 표시 하시겠습니까?

Perfect intersection

그러나,이 개 반투명 분야와 내가 대신 그 결과를 얻을 :

With depth testing

내가 아는 올바른 투명 효과를 얻으려면 투명한 모양을 그리기 전에 깊이 테스트를 해제해야합니다. 투명 형상이 다른 비 투명 형상 넘어 그러나이 다른 부작용을 일으킬 : 그래서

Without depth testing

올바르게 다른 내부 2 개 체적 형상 각각의 교차 부분을 표시하는 방법이 깨지 않고, 거기 깊이 테스트?

답변

1

그래서, "볼륨"에 대해 알고하지 않습니다 (그 자체로) 표시하는 방법 (...) 체적 모양

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); 
} 
+0

확인을, 그래서 그렇게 할 "마술 방법은"없다 , 즉 OpenGL에서 옵션을 활성화하거나 비활성화합니다. 셰이더에서 그렇게하는 것이 좋겠지 만, 제 경우에는 단순한 구체를 넘어선 여러 모양이 있습니다. 따라서 셰이더가 훨씬 더 복잡해질 수 있습니다. 아마도 나를위한 더 나은 방법은 마침내 스텐실 버퍼를 사용하는 것입니다. 어쨌든, 답변 해 주셔서 감사합니다 (그리고 OpenGL 볼륨에 대한 실수로 인해 유감 :-)) –

관련 문제