通过每帧改变纹理UV坐标实现纹理循环滚动。
_textureV += 0.01f;
//这里设置一个矩形区域 并设置纹理uv坐标
for(int i = 0; i < 4; ++i) {
cubeVertices[i].v -= _textureV; //每次渲染 改变纹理 v 坐标即可实现纹理滚动效果
}
代码如下:
//顶点数据
struct Vertex {
float x, y, z;
float u, v;
};
//纹理ID
GLuint _texture;
float _textureV = 0;;
static FIBITMAP*readImage(const char* fileName) {
//1 获取图片格式
FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(fileName, 0);
if(fifmt == FIF_UNKNOWN) {
return 0;
}
//2 加载图片
FIBITMAP *dib = FreeImage_Load(fifmt, fileName, 0);
FREE_IMAGE_COLOR_TYPE type = FreeImage_GetColorType(dib);
//! 获取数据指针
FIBITMAP* temp = dib;
dib = FreeImage_ConvertTo32Bits(dib);
FreeImage_Unload(temp);
BYTE* pixels = (BYTE*)FreeImage_GetBits(dib);
int width = FreeImage_GetWidth(dib);
int height = FreeImage_GetHeight(dib);
for(int i = 0; i < width * height * 4; i+=4) {
BYTE temp = pixels[i];
pixels[i] = pixels[i + 2];
pixels[i + 2] = temp;
}
return dib;
}
static void onInit() {
FIBITMAP* arrayImage[1];
arrayImage[0] = readImage("../res/1.jpg");
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //循环
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
BYTE* pixels = (BYTE*)FreeImage_GetBits(arrayImage[0]);
int width = FreeImage_GetWidth(arrayImage[0]);
int height = FreeImage_GetHeight(arrayImage[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
FreeImage_Unload(arrayImage[0]);
}
// 绘制
static void render(GLFWwindow * window) {
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
_textureV += 0.01f;
//这里设置一个矩形区域 并设置纹理uv坐标
Vertex cubeVertices[] =
{
{ -1.0f, -0.125f, 1.0f, 0, 0 },
{ 1.0f, -0.125f, 1.0f, 1, 0 },
{ 1.0f, 0.125f, 1.0f, 1, 0.15f },
{ -1.0f, 0.125f, 1.0f, 0, 0.15f },
};
for(int i = 0; i < 4; ++i) {
cubeVertices[i].v -= _textureV; //每次渲染 改变纹理 v 坐标即可实现纹理滚动效果
}
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D, _texture);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &cubeVertices[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &cubeVertices[0].u);
// 清成单位矩阵
glLoadIdentity();
// 产生一个矩阵
glTranslatef(0, 0, -4);
glDrawArrays(GL_QUADS, 0, 4);
glfwSwapBuffers(window);
glfwPollEvents();
}