openGL学习笔记十七: 简单纹理映射

  纹理:就是图片在显存中的的称呼。

  纹理坐标(UV坐标):左下角(0,0)、左上角(0,1)、右上角(1,1)、右下角(1,0),任何一张图片做成纹理都是这个坐标。
  uv 对应叫法还有st, u、s 和x轴方向相同,v、t 和y轴方向相同。

纹理映射:

图片贴到一个区域中,区域顶点坐标对应纹理坐标进行贴图。

openGL学习笔记十七: 简单纹理映射_第1张图片

openGL学习笔记十七: 简单纹理映射_第2张图片

代码实例:


//顶点数据
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();
}

运行结果:

openGL学习笔记十七: 简单纹理映射_第3张图片

你可能感兴趣的:(#,1.7,OpenGL)