哪个是使用Visual Studio在Opengl 1中创建纹理动画的最佳方法?

时间:2015-12-25 23:32:58

标签: c++ opengl animation

我想创建一个简单的动画,显示使用OpenGL飞行的蝴蝶/鸟,但我不知道如何解决问题。

创建一个具有两个图像的纹理以表示动画是一个很好的解决方案,因为动画很小?如果是这样,我应该如何在它们之间交换图片?

1 个答案:

答案 0 :(得分:2)

通过调用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重新定义了现有二维纹理图像的连续子区域。数据引用的纹素将现有纹理数组的部分替换为x索引xoffsetxoffset + width - 1,包括{和yoffsetyoffset + height - 1,包括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]); rutine加载具有自动内存分配的纹理数据

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

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

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

或者你只是想在两个单独的纹理之间进行更改,我之前已经回答过randomly apply textures to the surfaces。所以它可以通过创建2个简单的2d纹理来完成。

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(); 类型数组。纹理生成调用将类似于$('.product-addon-kwota-dla-autora input').attr('value', Total);

比顺序更改其索引。并将它们绑定到某个表面。

$('.product-addon-kwota-dla-autora input').val(Total);

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

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