OpenGL:使用FBO为渲染对象并从GPU取出存图
生活随笔
收集整理的這篇文章主要介紹了
OpenGL:使用FBO为渲染对象并从GPU取出存图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenGL 使用FBO為渲染對象并從GPU取出存圖的代碼
#include "gl/glew.h" #include "gl/glut.h" #include <fstream> #define isize 512 const char* vertexShaderSource = "#version 460 \n" "layout (location = 0) in vec3 aPos;\n" "void main()\n" "{\n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\0"; const char* fragmentShaderSource = "#version 460 \n" "out vec4 FragColor;\n" "void main()\n" "{\n" " FragColor = vec4(0.0f, 1.0f, 1.0f, 1.0f);\n" "}\n\0";void saveToBMP24(void* packBuffer, const std::string& img); int main(int argc, char** argv) {argc;argv;//初始化窗口以及渲染上下文//創建viewportint iViewportIndex = 0;float fv4Viewport[4] = {0.0f,0.0f,512.0f,512.0f};glViewportIndexedfv(iViewportIndex, fv4Viewport);//創建FBO綁定的紋理GLuint texName;glGenTextures(1, &texName);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, texName);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, GLint(0), GL_RGBA, isize, isize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);//創建FOBGLuint FramebufferName;glGenFramebuffers(1, &FramebufferName);glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texName, 0);//三角形的三個頂點數據float vertices[] = {-0.5f, -0.5f, 0.0f, // left 0.5f, -0.5f, 0.0f, // right 0.0f, 0.5f, 0.0f // top };//創建VAO VBO unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);//初始化program,shaderint vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);int shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);//清背景glClearColor(0.0f, 0.0f, 0.0f, 0.0f);glClear(GL_COLOR_BUFFER_BIT);//設置繪制buffer,數組形式設置GLuint a[] = { GL_COLOR_ATTACHMENT0 };glDrawBuffers(1, a);glUseProgram(shaderProgram);//綁定VAOglBindVertexArray(VAO);//繪制三角形glDrawArrays(GL_TRIANGLES, 0, 3);//備份int iOldPixelPackAlignment(1);glGetIntegerv(GL_PACK_ALIGNMENT, &iOldPixelPackAlignment);//設置新的對齊glPixelStorei(GL_PACK_ALIGNMENT, 1);//綁定fbo,讀取數據glBindFramebuffer(GL_READ_FRAMEBUFFER, FramebufferName);glReadBuffer(GL_COLOR_ATTACHMENT0);void* pImage = new char[isize * isize * 4];glReadPixels(0, 0, isize, isize,GL_RGBA, GL_UNSIGNED_BYTE, pImage);glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);//存圖 bmp格式saveToBMP24(pImage, "/usr/sss1.bmp");return 0; }void saveToBMP24(void* packBuffer, const std::string& img) {using namespace std;//讀入一個bmp格式文件,創建頭用,todo:尺寸和位數對應fstream in("/usr/123.bmp", ios_base::in | ios_base::binary);if (!in){return;}char bmpHeader[54] = { 0 };in.read(bmpHeader, sizeof(bmpHeader));char* pBuffer = new char[isize * isize *3];in.read(pBuffer, isize * isize * 3);in.close();fstream out(img.c_str(), ios_base::out | ios_base::binary | ios_base::trunc);if (!out){in.close();delete[] pBuffer;return;}//RGB數據拷貝,A丟棄for (size_t i = 0; i < isize*isize; i++){int num = i * 4;int numI = i * 3;pBuffer[numI] = ((char*)packBuffer)[num + 2];pBuffer[numI+1] = ((char*)packBuffer)[num + 1];pBuffer[numI+2] = ((char*)packBuffer)[num ];}*((int*)&bmpHeader[0x12]) = isize;*((int*)&bmpHeader[0x16]) = isize;//bmp對齊int totals = (isize) * 3;while (totals % 4 != 0)++totals;totals = totals * (isize);out.write(bmpHeader, sizeof(bmpHeader));out.write(pBuffer, totals);out.close();delete[]pBuffer; }?
總結
以上是生活随笔為你收集整理的OpenGL:使用FBO为渲染对象并从GPU取出存图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nvml.dll 英伟达公司提供的动态库
- 下一篇: Linux移植遇到问题记录