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

时间:2018-05-04 23:23:22

标签: c++ c opengl textures hardcoded

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

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编译时,它抱怨字符串是长的

  

编译器限制:字符串长度超过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 ++,但视觉工作室抱怨。这是一个非常长的文件,所以我不会感到惊讶,但这是一个真正的无赖,我无法让它工作。我已经尝试通过将每个最大限制字符串变成std :: string并将每个unsigned char从那些传递给unsigned chars的向量来解析它,我知道我不应该这样做,但我正在抓住吸管这一点

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构建,因为它无法处理第二种方法中的长字符串并尝试从中填充矢量或数组似乎更多超出需要的额外步骤。因为我对openGL的细微差别还不是很熟悉,所以我可能会犯这个错误。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

将图像导出为可用源数据的第一种方法确实有效,我的问题出现在我的Visual Studio代码库中,我忘了在我的&#34;硬编码&#34;中设置纹理参数。加载方法

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

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