【发布时间】:2014-10-26 16:15:09
【问题描述】:
所以我仍在尝试在 OpenGL 和 DirectX 中获得相同的结果。
现在我的问题是使用渲染目标和视口。
到目前为止我学到了什么:
- 如果调整窗口大小,DirectX 的 Backbuffer 会拉伸 -- 渲染纹理的大小变化
- 如果调整窗口大小,则调整 OpenGL 的 Backbuffer 大小 -- 渲染的纹理停留在它被渲染的地方
现在我在这里所做的是将 OpenGL 的视口更改为窗口大小。现在两者都有相同的结果,渲染的纹理被拉伸。 一个骗局: -OpenGL 的 Viewport 的 Size 不能像 DirectX 那样设置,因为它被设置为 Window Size。
现在在渲染 Rendertarget 时会发生这种情况:
- DirectX:大小很重要,如果 Size 大于 Backbuffer,则纹理只占很小的位置,如果 Size 小于 Backbuffer,则纹理占很多位置
- OpenGL:大小无关紧要,渲染的上下文保持不变/拉伸。
现在我的问题是:
如何在 OpenGL 和 DirectX 中获得相同的结果? 我想要我在 OpenGL 中的 DirectX 中得到的相同结果。到目前为止,我的想法是正确的还是有更好的想法?
【问题讨论】:
-
如果你想复制 DirectX 的行为,然后绘制到一个 Frambuffer 对象并使用
GL_LINEAR采样将该 FBO 传送到默认帧缓冲区(窗口)。 这就是你想要的行为,对吧?哪里帧缓冲区分辨率不随窗口调整大小而变化? -
@AndonM.Coleman 我将帧缓冲区中的所有内容渲染为纹理,然后绘制该纹理。如果我使用 blit,我的纹理不会通过着色器,对吗?我想要的基本上是,如果我更改 FBO 纹理的大小,它也会影响纹理在其上的渲染方式,就像在 DirectX 中一样。这行得通吗?
-
嗯,我不明白你的意思。在调整窗口大小方面,D3D 和 GL 之间唯一相关的区别与调整帧缓冲区大小的方式有关。 GL 会自动执行此操作,在 D3D 中您必须自己执行此操作。但是,如果您使用 FBO 进行绘图,则可以防止 GL 在调整窗口大小时调整您绘制到的帧缓冲区的大小。