C++ 使用帧缓冲区对象合成图像

C++ 使用帧缓冲区对象合成图像,c++,opengl-es,C++,Opengl Es,我试图在OpenGLES2.0中制作一些“图像”,但我遇到了一些问题。我想要的是构建一个帧缓冲区对象,比如说400x300像素中的一个,然后使用正交投影渲染一些图形 我认为创建帧缓冲区对象的方法是正确的。这是保存它的顶点数组: GLfloat vertexData[] = { // X Y Z U V -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, // Top-left 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, /

我试图在OpenGLES2.0中制作一些“图像”,但我遇到了一些问题。我想要的是构建一个帧缓冲区对象,比如说400x300像素中的一个,然后使用正交投影渲染一些图形

我认为创建帧缓冲区对象的方法是正确的。这是保存它的顶点数组:

GLfloat vertexData[] = {
// X      Y     Z     U     V
  -0.5f,  0.5f, 0.0f, 0.0f, 0.0f, // Top-left
   0.5f,  0.5f, 0.0f, 1.0f, 0.0f, // Top-right
   0.5f, -0.5f, 0.0f, 1.0f, 1.0f, // Bottom-right
  -0.5f, -0.5f, 0.0f, 0.0f, 1.0f  // Bottom-left
};
稍后,我将创建具有相同大小(即400x300)的纹理和renderbuffer。另外,我不知道之前的vertexData是否正确,它是否应该使用400x300而不是1x1

此外,当我构建投影和视图矩阵时,问题出现了:

_projection = glm::ortho(0.0f, 400.0f, 300.0f, 0.0f, 0.0f, 1.0f);
_view = glm::lookAt(glm::vec3(0,0,1), glm::vec3(0,0,0), glm::vec3(0,1,0));
当我使用它们时,我在屏幕上看不到任何东西。但是,当我将它们设置为identity matrix时,我会将绘制的图形显示到framebuffer对象,但我当然希望将像素坐标映射到opengl坐标,以便轻松绘制图像

这是我用来绘制绘制到帧缓冲区对象的元素的代码:

// Bind the framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, _framebufferObject);

// Set viewport to size of texture map and erase previous image
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, 400, 300);

// Render every GraphicComponents to the FBO
for(GraphicComponent* gc : _graphicComponents) {
  gc->render();
}

// Unbind the FBO so rendering will return to the backbuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, _screenWidth, _screenHeight);
GraphicComponent类的render方法只是绘制元素。例如,对于矩形构件:

void RectangleComponent::render() {
    _shader.useProgram();

    glVertexAttribPointer(_colorHandler, 3, GL_FLOAT, GL_FALSE, 0, _vertexData);
    glEnableVertexAttribArray(_colorHandler);

    glUniformMatrix4fv(_mvpHandler, 1, GL_FALSE, glm::value_ptr(_projectionMatrix * _viewMatrix * _modelMatrix));

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, _indices);

}
当我把它画在帧缓冲区对象之外时,效果非常好


TL;DR我想在帧缓冲区对象上绘制一些元素,如矩形、文本等,但我不知道在渲染到帧缓冲区对象时,我的元素使用了哪些大小(或顶点位置)。另外,我希望帧缓冲区对象中的元素以正交投影方式渲染,这样它们的opengl坐标映射到屏幕像素,左上角位于(0,0)。

当绘制到FBO时,您很可能希望使用正交投影,以便可以使用“像素”坐标

要将FBO中的纹理绘制为全屏四边形,请使用标识投影矩阵和

GLfloat vertexData[] = {
// X      Y     Z     U     V
  -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, // Bottom-right
  -1.0f,  1.0f, 0.0f, 0.0f, 1.0f, // Top-left
   1.0f, -1.0f, 0.0f, 1.0f, 0.0f, // Bottom-right
   1.0f,  1.0f, 0.0f, 1.0f, 1.0f  // Top-left
};

然后绘制gldrawArray(GL_三角形_字符串,0,4);所以你不需要使用索引数组。

好的,我做得不错,但是我的环境有点奇怪(我用的是投影仪,不是屏幕),我必须处理它

我所做的唯一更改是使用标识矩阵作为视图矩阵,因为不需要它,并将顶点数据数组设置为:

GLfloat vertexData[] = {
// X        Y       Z     U     V
  -400.0f,  300.0f, 0.0f, 0.0f, 0.0f, // Top-left
   400.0f,  300.0f, 0.0f, 1.0f, 0.0f, // Top-right
   400.0f, -300.0f, 0.0f, 1.0f, 1.0f, // Bottom-right
  -400.0f, -300.0f, 0.0f, 0.0f, 1.0f  // Bottom-left
};

正交投影矩阵是正确的。

这与我的问题完全无关,因为这不是我要问的。