在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++ 项目