gpt4 book ai didi

OpenGL render-to-texture-via-FBO——不正确的显示与正常的纹理

转载 作者:IT王子 更新时间:2023-10-29 01:12:45 27 4
gpt4 key购买 nike

到纹理绑定(bind)的屏幕外帧缓冲区对象的屏幕外渲染应该是微不足道的,但我遇到了一个我无法解决的问题。

我的完整示例程序(目前只有 2D!)在这里:

http://pastebin.com/hSvXzhJT

请参阅下面的一些说明。

我正在创建一个 rgba 纹理对象 512x512,将它绑定(bind)到一个 FBO。此时不需要深度或其他渲染缓冲区,严格来说是 2D。

以下极其简单的着色器渲染到该纹理:

顶点着色器:

varying vec2 vPos; attribute vec2 aPos;
void main (void) {
vPos = (aPos + 1) / 2;
gl_Position = vec4(aPos, 0.0, 1.0);
}

在 aPos 中,这只是得到一个包含四边形的 4 个 xy 坐标的 VBO (-1, -1::1, -1::1, 1::-1, 1)

因此,尽管帧缓冲区分辨率理论上应该为 512x512,显然着色器将其“纹理”渲染到“全(关闭)屏幕四边形”上,遵循 GLs -1..1 坐标范例。

片段着色器:

varying vec2 vPos;
void main (void) {
gl_FragColor = vec4(0.25, vPos, 1);
}

因此它设置了一种完全不透明的颜色,红色固定为 0.25,绿色/蓝色取决于 0 到 1 之间的任何 x/y。

此时我的假设是渲染 512x512 纹理仅显示 -1..1 全(关闭)屏幕四边形,从 0..1 开始对绿色/蓝色进行片段着色。

所以这是我的屏幕外设置。在屏幕上,我有另一个真正可见的全屏四边形,带有 4 个 xyz 坐标 { -1, -1, 1::: 1, -1, 1::: 1, 1, 1::: -1, 1, 1}。同样,现在这是二维的,所以没有矩阵,所以 z 总是 1。

这个四边形由不同的着色器绘制,简单地渲染给定的纹理,教科书 GL-101 风格。在我上面链接的示例程序中,我有一个简单的 bool 切换 doRtt,当它为 false(默认值)时,根本不执行渲染到纹理,这个着色器只显示使用当前目录中的 texture.jpg。

此 doRtt=false 模式显示第二个屏幕四重渲染器对于我当前的要求是“正确的”,并按照我的意愿执行纹理:垂直重复两次,水平重复两次(稍后将被夹紧,重复是仅用于此处测试),否则在没有纹理过滤或 mipmap 的情况下进行缩放。

因此无论窗口(以及视口(viewport))如何调整大小,我们总是会看到一个全屏四边形,其中一个纹理在水平方向重复两次,在垂直方向重复两次。

现在,在 doRtt=true 的情况下,第二个着色器仍然在执行它的工作,但纹理永远不会完全正确地缩放或绘制,我不确定,因为不幸的是我们不能只说“嘿 gl 保存这个 FBO到磁盘以进行调试。”

RTT 着色器确实执行了一些部分渲染(或者可能是完整渲染,再次无法确定屏幕外发生了什么......)特别是当你将视口(viewport)调整为比默认大小小很多时你会看到中断在纹理重复之间,并没有显示我们非常简单的 RTT 片段着色器所期望的所有颜色。

(A) 要么:我的代码正确创建了 512x512 纹理但未正确映射(但为什么使用完全相同的简单纹理四边形着色器的 doRtt=false 任何给定的 texture.jpg 文件显示得很好? )

(B) 或:512x512 纹理未正确渲染,并且 rtt frag 着色器以某种方式根据窗口分辨率更改其输出——但为什么呢?对于 x 和 y,离屏四边形始终为 -1..1,顶点着色器始终将其映射到片段坐标 0..1,对于这个简单的测试,RTT 纹理始终保持在 512x512!

请注意,屏幕外四边形和屏幕上四边形都不会改变它们的坐标,并且始终是“全屏”(两个维度上都是 -1..1)。

同样,这应该很简单。我到底错过了什么?

规范:OpenGL 4.2(但代码显然不需要任何 4.2 功能!),Nvidia Quadro 5010M,openSuse 12.1 64 位,Golang Weekly 22-Feb-2012。

最佳答案

首先 - 尝试检查 OpenGL 错误。在每个 OpenGL 函数之后调用 glGetError()。您还必须为绘图设置正确的视口(viewport)。在绘制到 FBO 之前调用 glViewport(0, 0, 512, 512)。在绘制到屏幕之前调用 glViewport(0, 0, display_width, display_height)。

此外,当您使用 FBO 渲染时,也无需绑定(bind) rttFrameTex。只有在着色器中读取纹理时才需要绑定(bind)纹理。

关于OpenGL render-to-texture-via-FBO——不正确的显示与正常的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9629763/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com