Android OpenGL-渲染到纹理-屏幕的特定区域

Android OpenGL-渲染到纹理-屏幕的特定区域,android,opengl-es,Android,Opengl Es,我在OpenGL游戏上实现了FBO。和Im渲染什么是渲染到屏幕上的纹理,问题是渲染到纹理从左下角开始。看: 渲染到默认帧缓冲区的内容: 渲染到附加到FBO的纹理的内容: 但我想要渲染到纹理的地方是: 我该怎么做?以下是渲染器Calass(FBO操作在onDrawFrame函数中完成): 无法设置FBO渲染的视口。如果只想绘制与绘制到默认帧缓冲区相同的几何体部分,则应使用视口尺寸的纹理大小: glViewport(0, 0, texW, texH); 完成FBO渲染后,不要忘记将视口设置回

我在OpenGL游戏上实现了FBO。和Im渲染什么是渲染到屏幕上的纹理,问题是渲染到纹理从左下角开始。看:

渲染到默认帧缓冲区的内容:

渲染到附加到FBO的纹理的内容:

但我想要渲染到纹理的地方是:

我该怎么做?以下是渲染器Calass(FBO操作在
onDrawFrame
函数中完成):


无法设置FBO渲染的视口。如果只想绘制与绘制到默认帧缓冲区相同的几何体部分,则应使用视口尺寸的纹理大小:

glViewport(0, 0, texW, texH);
完成FBO渲染后,不要忘记将视口设置回视图/曲面的适当大小,然后再次开始渲染到默认帧缓冲区

如草图所示,要绘制几何图形的不同(子)部分,您有几个选项:

  • 使用模型视图变换平移/缩放几何图形
  • 调整投影变换
  • 调整视口
根据渲染的内容和方式,使用其中任何一种渲染的结果都可能略有不同。特别是当涉及照明或透视投影时,并非所有选项都会给出完全相同的结果。在这种情况下,你必须决定你想要的行为

更改其中一个转换可能是最标准的方法。但是调整视口可能是一个优雅的选择,这取决于您正试图实现的目标

例如,仅根据草图粗略猜测值,您可以使用:

glViewport(texW / 4, -texH / 4, texW / 2, texH);
这将定义视口矩形,使其与草图中的橙色虚线矩形大致匹配。您可能需要对这些值进行更多的数学运算以保持纵横比,但这显示了基本思想

glViewport(texW / 4, -texH / 4, texW / 2, texH);