我想用OpenGL创建一个简单的动画,展示一只蝴蝶/鸟儿飞翔的场景,但我不知道该如何解决这个问题。
如果动画比较小,那么使用两张图片来表示动画会是一个不错的解决方案。如果是这样,我应该如何在它们之间交换图片呢?
glTexImage2D
加载纹理图像,然后使用glTexSubImage2D
将图像加载到已存在的纹理中,这比调用glTexImage2D
要快得多,并且非常适合此类动画。void glTexSubImage2D(
GLenum target,
GLint level,
GLint xoffset,
GLint yoffset,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
const GLvoid * data
);
glTexSubImage2D
可以重新定义一个现有二维纹理图像的连续子区域。由数据引用的纹素将替换现有纹理数组的部分,包括xoffset
到xoffset + width - 1
(含)之间的x
索引和yoffset
到yoffset + height - 1
(含)之间的y
索引。此区域不得包括原始指定的纹理数组范围之外的任何纹素。
如果要获取完整的纹理图像交换,只需将xoffset
和yoffset
设置为零即可。
您可以指定纹理名称数组,例如:
char* textureNames[10] = { "...", "...", ..., "..." };
然后是纹理数据
GLbyte* textureData[10]; // 10 texture instances
LoadTGA
例程加载纹理数据。for (int i = 0; i < 10; i++) {
textureData[i] = LoadTGA(
textureNames[i],
/*... TEXTURE PARAMS MUST BE THE SAME FOR ALL IMAGES */
);
}
正在加载第一张图片
glTexImage2D(
GL_TEXTURE_2D, GL_RGB, 0, width, height, 0,
format, GL_UNSIGNED_BYTE, textureData[0]
);
static int imageIndex = 0;
glTexSubImage2D(
GL_TEXTURE_2D, 0, 0, 0, width, height,
format, GL_UNSIGNED_BYTE, textureData[imageIndex]
);
imageIndex++;
if (imageIndex == 10) // max index reached
imageIndex = 0;
for (int i = 0; i < 2; i++) {
g_pnTextures[i] = loadTGA(textureNames[i], g_pnTextures[i]);
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);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
}
g_pnTextures
必须是 GLuint
类型的数组。纹理生成调用将类似于 glGenTextures(2, g_pnTextures)
。
然后按顺序更改其索引。并将它们绑定到某个表面上。
glBindTexture(GL_TEXTURE_2D, g_pnTextures[imageIndex++]);
if (imageIndex == 10) // max index reached
imageIndex = 0;
glBegin(GL_QUADS);
// specify texture coords
glTexCoord2f(0.0f, 0.0f);
glVertex2f(-1.0f, -1.0f);
// specify texture coords
glTexCoord2f(0.0f, 1.0f);
glVertex2f(1.0f, -1.0f);
// specify texture coords
glTexCoord2f(1.0f, 1.0f);
glVertex2f(1.0f, 1.0f);
// specify texture coords
glTexCoord2f(1.0f, 0.0f);
glVertex2f(-1.0f, 1.0f);
glEnd();
code
char* textureNames[2] = { "Textures\bird1.tga", "Textures\bird2.tga"}; GLuint bird1Texture; GLuint bird2Texture; GLbyte* textureData[2]; // 2个纹理实例glGenTextures(1, &bird1Texture); glGenTextures(1, &bird2Texture); //这里出现了错误 textureData[0] = loadTGA(textureNames[0], bird1Texture); textureData[0] = loadTGA(textureNames[1], bird2Texture);glTexImage2D(GL_TEXTURE_2D, GL_RGB, 0, 10, 10, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData[0]); 抱歉,我无法缩进代码.. - Maria