V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
feng32
V2EX  ›  程序员

OpenGL 支持使用简单方法渲染一个半透明立方体吗

  •  
  •   feng32 · 2018-04-14 17:24:09 +08:00 · 5312 次点击
    这是一个创建于 2400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    像下面这样的类似半透明塑料的渲染效果:

    AutoCAD Cube

    请问 OpenGL 是否是这种渲染的合适方案,如果是的话基本思路是什么,如果不是是否有什么更合适的方法?(暂时只考虑 Windows 桌面平台下的实现,最好是比较轻量级的方案)

    6 条回复    2018-04-14 20:15:18 +08:00
    shihira
        1
    shihira  
       2018-04-14 17:57:43 +08:00   ❤️ 3
    OpenGL 没有什么适合不适合的,反正其它的图形库无论是 Metal 还是 DirectX 都功能都差不多。就从这附图上观察还是有很粗浅的光照的,用 Lambertian 就好。正常渲染半透明一般是要 Alpha Sorting,但是凸多边形不用,反正先画背面再画正面就好。

    但是如果非凸多边形,Alpha Sorting 搞起来就比较麻烦了,不如粗暴一点:

    1. 先画一遍到 Framebuffer 里,不用混合,全部画 vec4(1, 1, 1, 0.5),0.5 换成你想要的初始透明度
    2. 然后切换成 GL_ONE + GL_ONE 的方式混合
    3. 关 Cull 渲染。算光照,最后颜色值大概是 vec4(1-Intensity, 1-Intensity, 1-Intensity, alpha),Intensity 是 Lambertian 公式算出来的,alpha 是你希望每增厚一层透明度降低多少(正数)
    4. 然后把 Framebuffer 盖到屏幕上,用普通 GL_SRC_ALPHA + GL_ONE_MINUS_SRC_ALPHA 混合
    5. 然后再用画线模式,关 Cull,再画一遍

    每个模型需要总共 4 个 Pass。暂时想到是这样。

    ………… emm 妈妈我居然在 V 站答图形学
    shihira
        2
    shihira  
       2018-04-14 18:06:11 +08:00
    噢没看题,只需要画正方体,那就简单了。无脑混合就好。gl2 都能做。
    feng32
        3
    feng32  
    OP
       2018-04-14 18:08:16 +08:00
    @shihira OpenGL 里的混合支持像真实半透明实体那样,光线经过路径越长就越暗的效果吗?
    feng32
        4
    feng32  
    OP
       2018-04-14 18:12:04 +08:00
    上面的图只是个 AutoCAD 的大致效果,实际上我需要的效果是 (想象一下) 一块半透明塑料立方体在真实环境中 (四周全是白色背景) 下的视觉效果,再叠加个手动勾勒的边框线
    shihira
        5
    shihira  
       2018-04-14 18:22:42 +08:00   ❤️ 1
    @feng32 只要能写 shader 就没有什么不可以的。而且你所说的半透明塑料,有实心也有空心。空心的直接把 6 个面画出来混合就好。实心的事实上就是一个带散射的材质了,这就超级麻烦了。

    当然了另一方面也看你要求要有多真实。
    YyYyYyy
        6
    YyYyYyy  
       2018-04-14 20:15:18 +08:00 via Android
    @feng32 #3
    真实半透明实体?

    BSSRDF 了解一下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:09 · PVG 06:09 · LAX 14:09 · JFK 17:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.