纹理:就是图片在显存中的的称呼。
纹理坐标(UV坐标):左下角(0,0)、左上角(0,1)、右上角(1,1)、右下角(1,0),任何一张图片做成纹理都是这个坐标。
uv 对应叫法还有st, u、s 和x轴方向相同,v、t 和y轴方向相同。
图片贴到一个区域中,区域顶点坐标对应纹理坐标进行贴图。
//顶点数据
struct Vertex {
float x, y, z;
float u, v;
};
//纹理ID
GLuint _texture;
static void onInit() {
glEnable(GL_TEXTURE_2D); //启用纹理状态
//glGenTextures (GLsizei n, GLuint *textures);
//n 纹理个数
//textures 创建出来的纹理ID
glGenTextures(1, &_texture); //申请产生纹理ID,这里并没有实际申请纹理显存
glBindTexture(GL_TEXTURE_2D, _texture); //绑定纹理_texture 说明接下来的就针对这个纹理ID对应的纹理进行操作
char* data = new char[128 * 128 * 4]; //随机创建纹理颜色数据
for(int i = 0; i < 128 * 128 * 4; ++i) {
data[i] = rand() % 255;
}
//glTexParameteri (GLenum target, GLenum pname, GLint param);
// target 纹理种类 1d纹理 2d纹理 3d纹理
// pname 纹理参数名称
// param 纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //设置纹理参数 GL_TEXTURE_MAG_FILTER:放大纹理滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //设置纹理参数 GL_TEXTURE_MIN_FILTER:缩小纹理滤波
// glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
// target 纹理种类 1d纹理 2d纹理 3d纹理 (这里是一张图片即选择GL_TEXTURE_2D 2d纹理)
// level 等级
// internalformat 纹理格式 颜色数据存储格式 rgb rgba ...
// width 创建纹理的宽度
// height 创建纹理的高度
// border 边框
// format 纹理格式(指外部填充过来的纹理数据格式即后面data的颜色格式)
// type 数据类型(指外部填充过来的纹理数据类型即后面data的颜色类型)这里是GL_UNSIGNED_BYTE 每个通道占8个字节
// pixels 纹理数据(指外部填充过来的纹理数据)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); //让显卡分配一个纹理显存
}
// 绘制
static void render(GLFWwindow * window) {
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//添数据 xyz uv
Vertex cubeVertices[] =
{
{ -1.0f, -1.0f, 1.0f, 0, 0 },
{ 1.0f, -1.0f, 1.0f, 0, 1 },
{ 1.0f, 1.0f, 1.0f, 1, 1 },
{ -1.0f, 1.0f, 1.0f, 1, 0 },
};
//
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D, _texture);
#if 0
glEnable(GL_DEPTH_TEST);
glInterleavedArrays(GL_T2F_V3F, sizeof(Vertex), cubeVertices);
#else
glEnable(GL_DEPTH_TEST);
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); //指定纹理坐标数据
#endif
// 清成单位矩阵
glLoadIdentity();
// 产生一个矩阵
glTranslatef(0, 0, -10);
glDrawArrays(GL_QUADS, 0, 4);
glfwSwapBuffers(window);
glfwPollEvents();
}