【问题标题】:Show common part of 2 semitransparent objects?显示 2 个半透明物体的共同部分?
【发布时间】:2017-12-06 19:54:00
【问题描述】:

我正在创建一个使用 OpenGL 来显示几个几何 3D 形状的数学应用程序。在某些情况下,这些形状相交,当这种情况发生时,我想在另一个形状中显示每个形状的相交部分。由于这两种形状都是半透明的,我需要的或多或少是这样的:

但是,使用 2 个半透明球体,我得到了这样的结果:

我知道,要获得正确的透明效果,应该在绘制透明形状之前关闭深度测试。然而,当透明形状超出另一个非透明形状时,这会导致另一个副作用:

那么,有没有一种方法可以在不破坏深度测试的情况下正确显示 2 个体积形状的相交部分?

【问题讨论】:

    标签: opengl testing transparency intersection depth


    【解决方案1】:

    那么,有没有办法显示(…)体积形状

    OpenGL(本身)不知道“体积”。它知道平面三角形、直线和点,这些纯属偶然也可能导致渲染副作用,如深度缓冲区测试的深度排序。

    从技术上讲,可以链接一系列绘图和模板缓冲区操作来执行 CSG(constructive solid geometry);详情请见ftp://ftp.sgi.com/opengl/contrib/blythe/advanced99/notes/node22.html。

    但是,您想要通过片段着色器中执行的简单光线追踪器更容易实现。现在光线追踪本身是一个广泛的主题,你可以写很多关于它的书(实际上已经写了很多关于这个主题的书)。最好参考一个例子。在这种情况下,我指的是以下 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 卷的错误,我们深表歉意 :-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多