使用渲染到纹理的多遍着色

时间:2012-05-27 02:42:10

标签: c++ glsl render-to-texture openscenegraph multipass

我正在尝试使用OpenSceneGraph实现多次传递渲染方法。但是,我不完全确定我的问题是理论问题,还是由于缺乏OSG的应用知识。到目前为止,我已成功通过使用正交投影渲染到纹理来实现多遍着色,但我似乎无法进行透视投影。

可能我不太了解如何实现多遍着色。当然,我必须使用多遍着色器将整个场景预渲染到纹理,然后在最终渲染中使用纹理。但是,我不是在谈论为场景中的每个对象创建单独的纹理,而是有效地捕获整个预渲染场景的屏幕截图。然后,仅从该纹理中,将渲染的效果应用于各个几何。

我认为这意味着我必须对顶点着色器中每个几何体的顶点坐标进行额外转换。也就是说,在计算之后:

gl_Position = ModelViewProjectionMatrix * Vertex;

我需要更进一步,计算顶点的屏幕坐标,以便正确映射顶点(同样,假设纹理包含场景的整个屏幕截图)。

如果我是正确的,那么我必须能够在与最终渲染中使用的视图相同的透视图中预渲染场景,而不是正交视图。这是我遇到麻烦的地方。我可以做一个正交的视图做我想要的,但不是透视图。

我的方法是否正确?我能想象的唯一另一种方法是将所有内容渲染到屏幕填充四边形(实际上,与转换为屏幕坐标相同),但这并不能减少在预渲染阶段使用透视投影的需要。

思考?链接??

编辑:我还应该指出,在我成功的尝试中,我只使用了片段着色器。透视投影工作,但是,当然,我使用的屏幕对齐四边形是偏移而不是居中。我添加了一个直通顶点着色器,一切都变成了空白。

1 个答案:

答案 0 :(得分:1)

事实证明,我的方法是正确的。它特别好,因为它避免了必须在我的场景图中添加另一个摄像头来渲染最终输出 - 我可以简单地使用主摄像头。不幸的是,这意味着我的所有输出纹理都以屏幕分辨率呈现,而不是适合于对象大小的分辨率。也就是说,如果我的屏幕是1024 x 1024,那么输出纹理也是如此,图形中每个预渲染摄像机都有一个。效率不高,但现在还可以。

相关问题