在C++、OpenGL、Glut中,如何将image.c绑定到一个纹理上,其中image.c来自Gimp>Export>C source code

Posted

技术标签:

【中文标题】在C++、OpenGL、Glut中,如何将image.c绑定到一个纹理上,其中image.c来自Gimp>Export>C source code【英文标题】:In C++, OpenGL, Glut, how to bind image.c to a texture, where image.c comes from Gimp>Export>C source code 【发布时间】:2014-03-06 12:42:15 【问题描述】:

所以我过去两天通过谷歌浏览了我的问题的不同类型的“解决方案”,没有那么多,而且我发现的那些似乎不起作用。

我正在从 Gimp 将一个小的测试图像导出为 .c 资源文件,它的大小是 64x64,它有一个 alpha 通道。 基本上看起来像:

    static const struct 
    unsigned int     width;
    unsigned int     height;
    unsigned int     bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ 
    char            *comment;
    unsigned char    pixel_data[64 * 64 * 4 + 1];
     ship = 
    64, 64, 4,
    (char*) 0,
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
    "\0\0\0\0\0\0\0\0\237\237\237\377\237\237\237\377\237\237\237\377\237\237"
    "\237\377\237\237\237\377\237\237\237\377\237\237\237\377vZI\0vZI\0vZI\0\0"
    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"

这样持续了很长一段时间,正如你所预料的那样,直到最终以

结束
    "\237\237\377\237\237\237\377\237\237\237\377",
    ;

那么我怎样才能真正使用这个资源文件呢?如果有人能提供一个例子,创建一个印有纹理的正方形所需的最低限度,我将不胜感激。

【问题讨论】:

该结构具有创建纹理所需的所有信息。什么不清楚? 【参考方案1】:

看看reference page for glTexImage2D,它是这样完成的(来自here):

GLuint texName1 = 0;

glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
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_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, ship.bytes_per_pixel, ship.width, ship.height, 0, GetDataFormat(), GetDataType(), ship.pixel_data);

glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (0.0, 0.0, -5.0f);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (.5, 0.0, -5.0f);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (.5, .5, -5.0f);
    glTexCoord2f (0.0, 1.0);
    glVertex3f (0.0, .5, -5.0f);
glEnd();

关键是这样的:

glTexImage2D(GL_TEXTURE_2D, 0, ship.bytes_per_pixel, ship.width, ship.height, 0, GetDataFormat(), GetDataType(), ship.pixel_data);

你需要自己实现GetDataFormat()GetDataType(),它会返回数据格式和类型。

一种可能的实现方式:

GLenum GetDataFormat()
  return  GL_BGRA;

GLenum GetDataType()
  return  GL_UNSIGNED_BYTE;

【讨论】:

谢谢,我想我无法理解 glTexImage2D 为我做了一切。我现在可以正常工作了,只是 alpha 通道似乎不起作用,它只是黑色。知道这可能是什么吗? nvm,忘记启用 GL_BLEND。现在一切正常,谢谢。【参考方案2】:

将文件添加到您的源代码中。 使用所需的所有信息创建船舶结构对象。

【讨论】:

以上是关于在C++、OpenGL、Glut中,如何将image.c绑定到一个纹理上,其中image.c来自Gimp>Export>C source code的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 7 中使用 OpenGL、Glut 和 Visual Studio 2008 准备 C++ 项目

鼠标点击开始动画 OpenGL/GLUT C++

C++ OpenGL/Glut 无法绘制

OpenGL/Glut glutSolidCube()

如何在visual c++中使用OpenGL

更新窗口显示 OpenGL/GLUT C++