【发布时间】: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 值(或者,单个十六进制值)。你知道我该怎么做吗?