opengl 怎么把一张图片渲染到frame buffer的颜色附件上
时间: 2023-08-04 09:04:34 浏览: 49
将一张图片渲染到frame buffer的颜色附件上,需要完成以下几个步骤:
1. 创建并绑定一个 frame buffer 对象。
2. 创建一个颜色缓存附件并将其附加到 frame buffer 上。
3. 将要渲染的图片绑定到纹理上。
4. 将纹理附加到颜色缓存附件上并进行渲染。
下面是具体的代码实现:
```c++
// 创建并绑定一个 frame buffer 对象
unsigned int FBO;
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
// 创建一个颜色缓存附件并将其附加到 frame buffer 上
unsigned int textureColorBuffer;
glGenTextures(1, &textureColorBuffer);
glBindTexture(GL_TEXTURE_2D, textureColorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorBuffer, 0);
// 检查 frame buffer 是否完整
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// 将要渲染的图片绑定到纹理上
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
int width, height, nrChannels;
unsigned char* data = stbi_load("image.jpg", &width, &height, &nrChannels, 0);
if (data) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
} else {
std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
// 将纹理附加到颜色缓存附件上并进行渲染
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glViewport(0, 0, screenWidth, screenHeight);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glGetUniformLocation(shaderProgram, "textureSampler"), 0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
```
在这段代码中,我们首先创建并绑定了一个 frame buffer 对象。然后,我们创建了一个颜色缓存附件并将其附加到 frame buffer 上。接下来,我们加载图片并将其绑定到纹理上。最后,我们将纹理附加到颜色缓存附件上并进行渲染。注意,在渲染结束后,我们需要将 frame buffer 解绑,否则后续的渲染操作会影响到我们的 frame buffer。