【问题标题】:How to apply a vertex shader to all vertices in a scene in OpenGL?如何将顶点着色器应用于OpenGL中场景中的所有顶点?
【发布时间】:2014-07-19 02:04:39
【问题描述】:

我现在正在开发 OpenTK 中的一个小型引擎,到目前为止,我已经让着色器工作了。不过我想知道,如何将着色器应用于整个场景!?例如,我在我的世界中看到过这种情况,有人创建了一个扭曲整个场景的着色器。但是由于每个对象都使用自己的着色器进行渲染,我该如何实现呢?

【问题讨论】:

  • 我不知道 MinceCraft,但运行时可能会从一些片段组成实际的着色器。例如。一个基本的光照步骤,更多的工作,用户定义的步骤等等。毕竟,你可以从字符串编译着色器。

标签: opengl shader opentk


【解决方案1】:

您似乎指的是一种名为post processing 的技术。它的工作方式是首先使用已有的着色器将整个场景渲染为纹理。然后,您可以使用片段着色器将此纹理渲染到屏幕上,以应用各种效果,例如运动模糊、扭曲或景深。

【讨论】:

  • 不,我说的是顶点着色器
  • 好吧,在那种情况下,您所要求的不存在。后期处理是最接近能够将多个着色器应用于同一对象的方法。
【解决方案2】:

“但是由于每个对象都使用自己的着色器进行渲染”

这不是 OpenGL 的工作方式。事实上,OpenGL 中没有“模型”(您可能指的是“对象”)之类的东西。 OpenGL 一次绘制一个图元(点、线和三角形)。此外,一组图元与所使用的着色器之间没有硬性关联。

在批处理开始时绑定单​​个着色器程序是微不足道的,并且该批处理的每个图元都受此着色器的影响。如果批次包含整个场景,则整个场景都使用该着色器。

【讨论】:

    【解决方案3】:

    AFAIK,一次只能绑定一个顶点着色器。

    您可能想要尝试的是先渲染到纹理,然后将纹理重新渲染到屏幕上,但对其进行一些更改(例如变形)。如果您想要应用更复杂的更改,您还可以提取深度缓冲区并使用它。

    【讨论】:

      【解决方案4】:

      如果您在渲染循环之前绑定所需的着色器,它将影响所有项目,直到您取消绑定它(即绑定 id #0)或通过 glEnable()/glDisable() 禁用 GL_TEXTURE_2D。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        相关资源
        最近更新 更多