我想创建一个简单的动画,显示使用OpenGL飞行的蝴蝶/鸟,但我不知道如何解决问题。
创建一个具有两个图像的纹理以表示动画是一个很好的解决方案,因为动画很小?如果是这样,我应该如何在它们之间交换图片?
答案 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
索引xoffset
和xoffset + width - 1
,包括{和yoffset
和yoffset + height - 1
,包括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]);
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动画,第一种技术是最好的方法。