本文共 3556 字,大约阅读时间需要 11 分钟。
#include
#define GLEW_STATIC
#include
#include
// 使用 SOIL 头文件
#include
// 使用上一篇里的着色器类
#include "Shader.h"
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
// 窗口大小
const GLuint WIDTH = 800, HEIGHT = 600;
int main () {
// GLFW
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "UseTexture.cpp", nullptr, nullptr);
glfwMakeContextCurrent(window);
// GLEW
glewExperimental = GL_TRUE;
glewInit();
glViewport(0, 0, WIDTH, HEIGHT);
// 配置着色器,使用着色器函数加载、编译、链接着色器源码
Shader ourShader("useTexture.vgl", "useTexture.fgl");
// 顶点
GLfloat vertices[] = {
// 顶点坐标 // 颜色值 // 纹理坐标
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // 右上角
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,-0.0f, // 右下角
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, -0.0f,-0.0f, // 左下角
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, -0.0f, 1.0f // 左上角
};
// 索引
GLuint indices[] = {
0, 1, 3,
1, 2, 3
};
// 创建和使用 VBO、VAO、EBO
GLuint VBO, VAO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
// 顶点坐标
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
// 颜色值
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
// 纹理坐标
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// 创建纹理对象
GLuint texture;
// 生成 1 个纹理
glGenTextures(1, &texture);
// 将纹理绑定到 GL_TEXTURE_2D 上,对 GL_TEXTURE_2D 的所有操作都会附加到 texture 上
glBindTexture(GL_TEXTURE_2D, texture);
// 设置纹理取样步长(防止图像扭曲倾斜)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// 设置纹理环绕方式(重复方式)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);// S 轴
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // T 轴
//float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
//glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
// 设置纹理过滤方式(线性方式)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 宽高数据
int width, height;
// 加载图片,其宽高将会存到参数变量中,返回一个非常大的 char(byte)数组
unsigned char* image = SOIL_load_image("a.jpg", &width, &height, 0, SOIL_LOAD_RGB);
// glTexImage2D()
// 绑定图像(目标,多级渐远纹理级别[0,基本级别],格式[RGB],宽度,高度,格式,数据类型[char数组],图像)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
// 自动生成多级渐远纹理
glGenerateMipmap(GL_TEXTURE_2D);
// 绑定好图像后释放内存和解绑
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
// 主循环
while (!glfwWindowShouldClose(window)) {
// 事件处理
glfwPollEvents();
// 指定背景色(深蓝色)
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 绑定纹理对象,函数会自动把纹理赋值给片段着色器的采样器
glBindTexture(GL_TEXTURE_2D, texture);
// 使用着色器
ourShader.use();
// 绘制矩形
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
// 交换缓冲
glfwSwapBuffers(window);
}
// 删除 VAO、VBO 和 EBO,释放空间
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
// 释放 GLFW 内存
glfwTerminate();
return 0;
}
转载地址:https://blog.csdn.net/weixin_33565558/article/details/111975336 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!