gpt4 book ai didi

c++ - 如何将硬编码图像加载到 OpenGL 纹理中

转载 作者:行者123 更新时间:2023-11-30 16:32:22 25 4
gpt4 key购买 nike

我正在尝试加载已存储为大型无符号字符数组的图像。更具体地说,由无符号字符组成的结构数组

typedef struct {
unsigned char
r,
g,
b;
}RGB;

图像数据本身从 gimp 导出为一个非常大的 c 源文件,如下所示

RGB Image[25000]={
{0,0,0},{0,0,0},{0,0,0},{174,174,174},{175,175,175},{177,177,177},
{180,180,180},{183,183,183},{187,187,187},{192,192,192},{196,196,196},
{202,202,202},{207,207,207},{213,213,213},{239,239,239},
...
}

我有图像的宽度、高度,并且知道它是 8 位 RGB 格式。我试图将它传递给 glTexImage2D,但它总是呈现全黑。

说类似的话

unsigned int imageWidth = 960;
unsigned int imageHeight = 540;

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, &Image);

问题不在于我的着色器代码或程序中的其他任何地方,因为如果我从文件加载纹理,一切都会正常。我只是不知道这些数据是否可以按原样读取,或者我是否必须以某种方式准备它,或者其他什么,我对 openGL 很陌生。

我的目标是将几个纹理硬编码到应用程序中,这样它们就不能轻易交换或修改。我正在使用 Gimp 插件将纹理导出到 c 源代码。还有另一个 Gimp 导出插件,它提供了我在 gcc/g++ 编译器上工作的源代码,但是当我尝试从 Visual Studio 进行编译时,它提示字符串太长

compiler limit: string exceeds 65535 bytes in length

但是它可以在 gcc/g++ 上运行。在这种情况下,来源看起来像这样

static const struct Image{
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char pixel_data[960 * 540 * 4 + 1];
} ImageImage = {
960, 540, 4,
"\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
"\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000"
"\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000"
"\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377"
"\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
"\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000"
"\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000"
"\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377"
...
}

这适用于 gcc/g++,但 Visual Studio 提示。这是一个非常非常长的文件,所以我并不感到惊讶,但是我无法让它工作,这真是令人遗憾。我尝试通过将每个最大限制字符串转换为 std::string 并将每个无符号字符传递到无符号字符 vector 中来解析它,我知道我不应该这样做,但我捕获了稻草这点

std::vector<unsigned char> _charVec;
std::string tempString = "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
"\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000"
"\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000"
"\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377"
"\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
...
_charVec.insert(_charVec.end(), tempString.begin(), tempString.end());

无论如何,这并不能解决问题。它会阻止编译器错误,但当我尝试访问存储数据的任何类对象或将容器传递给另一个方法时,它会导致崩溃。

我没有其他方法将我的纹理转换为源,并且有一两个我肯定不希望以原始方式分发,所以我想在 openGL 中加载这两个纹理源之一。只要我使用 Visual Studio 进行构建,第一个源格式可能就是我需要使用的,因为它无法处理第二种方法中的长字符串,并且尝试从中填充 vector 或数组似乎更多超出所需的额外步骤。我可能完全错了,因为我还不太熟悉 openGL 的细微差别。任何建议将不胜感激。

最佳答案

将图像导出为可用源数据的第一种方法确实有效,我的问题是在我的 Visual Studio 代码库中,我忘记在“硬编码”加载方法中设置纹理参数

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

感谢您在评论中提醒我,derhass。

关于c++ - 如何将硬编码图像加载到 OpenGL 纹理中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com