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
没有评论:
发表评论