gpt4 book ai didi

c++ - 使用 Visual Studio 在 Opengl 1 中创建纹理动画的最佳方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 21:38:45 26 4
gpt4 key购买 nike

我想使用 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 redefines a contiguous subregion of an existingtwo-dimensional texture image. The texels referenced by data replacethe portion of the existing texture array with x indices xoffsetand xoffset + width - 1 , inclusive, and y indices yoffset andyoffset + height - 1 , inclusive. This region may not include anytexels outside the range of the texture array as it was originallyspecified.

如果要获得完整的纹理图像交换,您只需将 xoffsetyoffset 指定为零即可。

您可以像这样指定纹理名称数组

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;

考虑到您使用少量的帧(纹理),我建议您为渲染添加一些延迟,因为图片变化非常快。

或者当您想要实现实时渲染速度时,您可以使用某种异步计时器在纹理索引之间切换。

或者您只想在 2 个单独的纹理之间切换,我之前已经回答过如何 randomly apply textures to the surfaces .所以它可以通过创建 2 个简单的 2d 纹理来简单地完成。

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)

然后依次改变它的索引。并将它们绑定(bind)到某个表面。

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();

如您所见,此 loadTGA 函数返回内存缓冲区而不是 OpenGL 纹理标识符(这会导致值转换问题)。

注意:最后的技术可以应用于少量纹理。如果你想实现电影效果可视化或GIF动画,第一种技术是最好的方法。

关于c++ - 使用 Visual Studio 在 Opengl 1 中创建纹理动画的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com