【问题标题】:OpenGL Multiple Render Targets with multiple gl_Position output具有多个 gl_Position 输出的 OpenGL 多个渲染目标
【发布时间】:2016-02-11 11:12:16
【问题描述】:

我正在寻找可以在不同位置写入缓冲区的 MRT。

示例

缓冲区 0: gl_Position[0] = vec4(uv,0.,1.); gl_FragData[0] = vec4(1.);

缓冲区 1: gl_Position[1] = MVP * pos; gl_FragData[1] = vec4(0.);

顶点着色器是否可以有多个输出? 我找不到任何相关的资源..

【问题讨论】:

  • 您好,欢迎来到 SO。请添加代码的重要部分。阅读how to askmcve 以提出更受欢迎的问题。

标签: c++ opengl glsl


【解决方案1】:

顶点着色器可以有多个输出吗?

不,但这并不意味着您无法获得想要的效果。好吧,你没有详细描述你想要什么,但这已经是 OpenGL 所能提供的最接近的了。

你想要的看起来很像layered rendering几何着色器能够生成进入不同层的图元。因此,您可以生成一个渲染到一层的三角形,然后生成第二个渲染到另一层的三角形。

当然,这提出了一个问题:什么是层?嗯,这与layered framebuffers 有关。看,如果您将分层图像附加到帧缓冲区(array texturecubemap texture),每个阵列层/立方体贴图面代表可以渲染到的不同 2D 层。几何着色器可以将每个输出图元发送到分层帧缓冲区中的特定层。因此,如果您在图像中有 3 个数组层,您的 GS 可以将图元输出到第 0、1 或 2 层,并且该图元只会渲染到数组纹理中的特定图像。

深度缓冲区也可以分层,如果您想要使用分层渲染进行深度测试,您必须使用分层深度缓冲区。图元渲染的所有方面都由它发送到的层控制。因此,当片段着色器运行时,输出将仅发送到它被渲染到的层。深度测试完成后,该测试的读取将仅从深度缓冲区的该层读取。等等,包括混合。

当然,使用分层帧缓冲区意味着特定图像附件中的所有层都必须来自相同的纹理。因此它们必须具有相同的Image Format。所以有限制。但总的来说,它或多或少符合您的要求。

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多