【问题标题】:Get colour of specific pixel in an OpenGL texture?获取OpenGL纹理中特定像素的颜色?
【发布时间】:2019-01-31 04:43:02
【问题描述】:

我正在尝试使用 OpenGL (C++) 从特定纹理中获取特定像素的颜色。我一直在看glGetTexImage(),因为它看起来有点像我想要的,但我不知道应该把它放在什么上下文中。我错了吗?它不需要是最快的选择,因为它不是逐帧的;就在游戏开始的时候。

纹理不会被渲染到屏幕上,只是用作获取信息的一种方式。我使用以下函数来加载纹理。

GLuint TextureUtil::loadTexture(const char* filename, int* widthVar, int* heightVar) {
        unsigned char* image = SOIL_load_image(filename, widthVar, heightVar, NULL, SOIL_LOAD_RGBA);

        GLuint 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_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);


        if (image) {
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, *widthVar, *heightVar, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
            glGenerateMipmap(GL_TEXTURE_2D);
        } else {
            std::cout << "ERROR: TextureUtil.cpp - Texture loading failed." << std::endl;
        }

        glActiveTexture(0);
        glBindTexture(GL_TEXTURE_2D, 0);
        SOIL_free_image_data(image);

        return texture;
    }

【问题讨论】:

  • 可能需要了解更多。通常你使用 glTexImage2D 上传纹理。在将值上传到 GPU 之前读取那里的值不是更合适吗?如果这是一个渲染纹理,那么是的,您必须使用 glGetTexImage 读回纹理内容。其中哪一部分需要帮助?
  • 如果您的纹理附加到 FBO,您也可以考虑使用 glReadPixels。
  • @Wyck 我已经根据上下文稍微编辑了我的问题。如果您需要任何其他信息,请告诉我。
  • 你有unsigned char *image。那是指向图像数据的指针。像素的所有字节都在那里。在给定原始存储的情况下,您是否只需要知道如何访问内存以获取特定 x,y 像素的 RGB?
  • @Wyck 我什至没有意识到unsigned char* image 指向图像数据,但是现在我想起来了,其他任何事情都是愚蠢的。无论如何,是的,我想要来自所述图像的 [x, y] 像素的 RGB 值(或者,单个十六进制值)。你知道我该怎么做吗?

标签: c++ opengl


【解决方案1】:

假设您对坐标列x 和行y 处的像素感兴趣,那么:

unsigned char* image = SOIL_load_image(filename, widthVar, heightVar, NULL, SOIL_LOAD_RGBA);
int width = *widthVar;

unsigned char* pixel = image + y * width * 4 + x * 4;

unsigned char red = pixel[0];
unsigned char green = pixel[1];
unsigned char blue = pixel[2];
unsigned char alpha = pixel[3];

SOIL_load_image 函数的错误检查留给您添加。例如,如果文件名不存在,我完全希望它返回 nullptr。

【讨论】:

  • 我简直不敢相信我自己无法解决这个问题。超级简单。无论如何,非常感谢你。这正是我一直在寻找的。显然,我把它弄得太复杂了。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多