2020年12月20日星期日

How to sample a pixel from a framebuffer texture in OpenGL?

I am creating a color picker OpenGL application for images with ImGUI. I have managed to load an image by loading the image into a glTexImage2D and using ImGUI::Image(). Now I would like to implement a method, which can determine the color of the pixel in case of a left mouse click.

Here is the method I loading the texture, then assigning it to a framebuffer:

bool LoadTextureFromFile(const char *filename, GLuint *out_texture, int *out_width, int *out_height,ImVec2 mousePosition ) {        // Reading the image into a GL_TEXTURE_2D      int image_width = 0;      int image_height = 0;      unsigned char *image_data = stbi_load(filename, &image_width, &image_height, NULL, 4);      if (image_data == NULL)          return false;        GLuint image_texture;      glGenTextures(1, &image_texture);      glBindTexture(GL_TEXTURE_2D, image_texture);        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);      stbi_image_free(image_data);      glBindTexture(GL_TEXTURE_2D, 0);        *out_texture = image_texture;      *out_width = image_width;      *out_height = image_height;        // Assigning texture to Frame Buffer      unsigned int fbo;      glGenFramebuffers(1, &fbo);      glBindFramebuffer(GL_FRAMEBUFFER, fbo);      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, image_texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, image_texture, 0);        if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE){          std::cout<< "Frame buffer is done."<< std::endl;      }      return true;  }  

Unfortunately, the above code results in a completely blank screen. I guess, there is something I missed during setting the framebuffer.

Here is the method, where I would like to sample the framebuffer texture by using the mouse coordinates:

    void readPixelFromImage(ImVec2 mousePosition) {          unsigned char pixels[4];          glReadBuffer(GL_COLOR_ATTACHMENT0);          glReadPixels(GLint(mousePosition.x), GLint(mousePosition.y), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);                std::cout << "r: " << static_cast<int>(pixels[0]) << '\n';          std::cout << "g: " << static_cast<int>(pixels[1]) << '\n';          std::cout << "b: " << static_cast<int>(pixels[2]) << '\n';          std::cout << "a: " << static_cast<int>(pixels[3]) << '\n' << std::endl;      }  

Any help is appreciated!

https://stackoverflow.com/questions/65386354/how-to-sample-a-pixel-from-a-framebuffer-texture-in-opengl December 21, 2020 at 09:06AM

没有评论:

发表评论