C++ 如何将硬编码图像加载到OpenGL纹理中
我正在尝试加载一个已存储为大量未签名字符的图像。更具体地说,是由无符号字符组成的结构数组C++ 如何将硬编码图像加载到OpenGL纹理中,c++,c,opengl,textures,hardcoded,C++,C,Opengl,Textures,Hardcoded,我正在尝试加载一个已存储为大量未签名字符的图像。更具体地说,是由无符号字符组成的结构数组 typedef struct { unsigned char r, g, b; }RGB; 图像数据本身作为一个非常大的c源文件从gimp导出,如下所示 RGB Image[25000]={ {0,0,0},{0,0,0},{0,0,0},{174,174,174},{175,175,175},{177,177,177}, {180,
typedef struct {
unsigned char
r,
g,
b;
}RGB;
图像数据本身作为一个非常大的c源文件从gimp导出,如下所示
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编译时,它抱怨字符串太长
编译器限制:字符串长度超过65535字节
但是,它可以在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++上有效,但visualstudio对此表示不满。这是一个很长的文件,所以我并不感到惊讶,但它真的很糟糕,我无法让它工作。我试图通过将每个max limit字符串转换成std::string来解析它,并将这些字符串中的每个无符号字符传递到无符号字符向量中,我知道我不应该这样做,但我现在正在抓紧救命稻草
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());
std::vector\u charVec;
std::string tempString=“\000\000\377\000\000\000\377\000\000\000\377\000\000\000\000\377\000\000\000\377\000\000\000\377\000\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.end(),tempString.begin(),tempString.end());
不管怎么说,这都不管用。它会停止编译器错误,但当我试图访问存储数据的任何类对象,或将容器传递给另一个方法时,它会导致崩溃
我没有其他方法将我的纹理转换成源代码,并且有一两个我绝对不希望被原始分发,所以我希望在openGL中加载这两个纹理源中的一个。第一种源代码格式可能是我在使用VisualStudio构建时需要使用的格式,因为它无法处理第二种方法中的长字符串,并且尝试从中填充向量或数组似乎需要更多的额外步骤。我可能在这方面完全错了,因为我还不太熟悉openGL的细微差别。任何建议都将不胜感激。将图像导出为可用源数据的第一种方法确实有效,我的问题在于我的Visual Studio代码库我忘记了在“硬编码”加载方法中设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
感谢您在评论中提醒我,德哈斯。您的纹理之一是RGB,另一个是RGBA。对于这两种情况,
glTexImage2D
调用需要不同,并且glPixelStore
设置必须反映结构中的实际对齐/填充。通常,有更好的方法将大型数组转换为应用程序二进制,而不是将其转换为源代码。在gcc世界中,objcopy
可以从数据中创建一个对象文件,并在过程中导出变量(C代码可以通过使用相同名称声明extern
globals来使用这些变量)。微软的工具也可以做到这一点,尽管最简单的方法可能是再次使用objcopy
,并指定一个微软的COFF作为输出格式。我上面提到的方法在这里解释得很好:我会采用一种很好的老方法,将文件读入数组,然后将其传递到glTexImage2D
在哪里设置texutre过滤器?这看起来像是尝试使用非mipmap complete纹理对象的标准错误。