使用framebuffer对象组合图像
Composing images using framebuffer objects
我正试图在OpenGL ES 2.0中制作一些"图像",但我遇到了一些问题。我想要的是建立一个framebuffer对象,假设是一个400 × 300像素的对象,然后使用正交投影渲染一些图形。
我认为创建framebuffer对象的方式是正确的。这是保存它的顶点数组:
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)。此外,我真的不知道如果以前的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));
当我使用它们时,我在屏幕上看不到任何东西。然而,当我将它们设置为标识矩阵时,我看到我绘制的图形到framebuffer对象,但当然我想将像素坐标映射到opengl坐标,以便轻松绘制图像。
这是我用来绘制绘制到framebuffer对象的元素的代码:
// 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方法只是绘制元素。例如,对于rectanglecomcomponent:
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);
}
当我在framebuffer对象外绘制它时,效果非常好。
TL;DR我想绘制一些元素,如矩形,文本等到framebuffer对象,但我不知道我的元素在渲染到framebuffer对象时使用的大小(或顶点位置)。此外,我希望framebuffer对象中的元素以正交投影呈现,因此它们的opengl坐标映射到屏幕像素和它们的左上角(0,0)。
好的,所以我做得对,但是我的环境有点奇怪(我使用投影仪,而不是屏幕),我必须处理它。
我所做的唯一改变,是使用单位矩阵作为视图矩阵,因为它是不需要的,并设置顶点数据数组为:
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
};
正交投影矩阵正确
当绘制到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
};
,然后绘制glDrawArrays(GL_TRIANGLE_STRING, 0,4);所以你不需要使用索引数组
- LoadImage 函数不适用于 ImageMagick 创建的位图图像
- 将Qt qml文件转换为位图图像
- 如何通过用C++编写的代码将位图图像保存在Android设备中
- 创建位图图像未在窗口上打印
- 内存泄漏,许多位图图像C CLI
- 组合图:C 是否有TensorFlow Import_graph_def当量
- C :阅读位图图像的问题
- 如何从scan0创建位图/图像
- 使用 CGAL 简化组合图
- 24位图图像和16位图图像中的RGB颜色
- C++,双线性插值以修补放大的位图图像上的孔
- C++中的位图图像处理
- 从位图图像文件读取像素数据值
- 如何让 WNDCLASS 将位图图像作为背景
- 位图图像未显示在CListCtrl报告视图中
- C++:将整数的文本文件转换为BMP格式的位图图像文件
- 如何在不使用外部库的情况下加载到 8 位C++位图图像
- 在Android NDK上通过JNI从OpenGL ES Framebuffer创建位图图像
- 读取位图图像时获取错误数据
- 在哪里可以找到 24 位位图图像 RLE 的示例