Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将硬编码图像加载到OpenGL纹理中_C++_C_Opengl_Textures_Hardcoded - Fatal编程技术网

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纹理对象的标准错误。