返回
OpenGL纹理常用函数纪录,涵盖纹理加载、绑定、坐标定义、绘制方法等!
IOS
2023-11-08 20:09:41
纹理加载
纹理加载是指将图像数据从内存加载到显存中。OpenGL提供了多种纹理加载函数,以下是一些常用的函数:
glTexImage2D()
:该函数用于加载二维纹理图像。glTexImage3D()
:该函数用于加载三维纹理图像。glTexImage1D()
:该函数用于加载一维纹理图像。
纹理绑定
纹理绑定是指将纹理对象与当前OpenGL状态绑定。这样,后续的OpenGL绘图操作就会使用绑定的纹理。OpenGL提供了多种纹理绑定函数,以下是一些常用的函数:
glBindTexture()
:该函数用于绑定二维纹理对象。glBindTexture3D()
:该函数用于绑定三维纹理对象。glBindTexture1D()
:该函数用于绑定一维纹理对象。
纹理坐标
纹理坐标是指纹理图像中像素的位置。OpenGL提供了多种纹理坐标生成函数,以下是一些常用的函数:
glTexCoord2f()
:该函数用于生成二维纹理坐标。glTexCoord3f()
:该函数用于生成三维纹理坐标。glTexCoord1f()
:该函数用于生成一维纹理坐标。
纹理绘制
纹理绘制是指将纹理图像应用于3D模型表面。OpenGL提供了多种纹理绘制函数,以下是一些常用的函数:
glDrawArrays()
:该函数用于绘制一组顶点数组,并使用绑定的纹理进行纹理绘制。glDrawElements()
:该函数用于绘制一组索引顶点数组,并使用绑定的纹理进行纹理绘制。
代码示例
以下是一个使用OpenGL加载、绑定和绘制纹理的简单示例代码:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
// 顶点着色器代码
const char *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"layout (location = 1) in vec2 aTexCoord;\n"
"out vec2 TexCoord;\n"
"void main() {\n"
" gl_Position = vec4(aPos, 1.0);\n"
" TexCoord = aTexCoord;\n"
"}\n";
// 片段着色器代码
const char *fragmentShaderSource = "#version 330 core\n"
"in vec2 TexCoord;\n"
"uniform sampler2D texture1;\n"
"out vec4 FragColor;\n"
"void main() {\n"
" FragColor = texture(texture1, TexCoord);\n"
"}\n";
int main() {
// 初始化GLFW
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 创建窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "纹理绘制", NULL, NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 加载GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 创建纹理
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// 加载纹理图像
int width, height, nrChannels;
unsigned char *data = stbi_load("texture.png", &width, &height, &nrChannels, 0);
if (data) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
} else {
std::cout << "Failed to load texture" << std::endl;
return -1;
}
stbi_image_free(data);
// 创建顶点数组对象和顶点缓冲对象
unsigned int VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
// 绑定顶点数组对象
glBindVertexArray(VAO);
// 绑定顶点缓冲对象
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// 设置顶点数据
float vertices[] = {
// 顶点位置 // 纹理坐标
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f
};
// 将顶点数据复制到顶点缓冲对象中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 设置顶点属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
// 创建着色器程序
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 激活着色器程序
glUseProgram(shaderProgram);
// 绑定纹理
glBindTexture(GL_TEXTURE_2D, texture);
// 循环渲染
while (!glfwWindowShouldClose(window)) {
// 检查是否有事件发生
glfwPollEvents();
// 清空缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 绑定顶点数组对象
glBindVertexArray(VAO);
// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 6);
// 交换前后缓冲区
glfwSwapBuffers(window);
}
// 释放资源
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteProgram(shaderProgram);
// 终止GLFW
glfwTerminate();
return 0;
}
总结
本文记录了OpenGL纹理的常用函数,包括纹理加载、绑定、坐标定义和绘制方法。通过这些函数,您可以轻松地将纹理应用于3D模型表面,从而创建逼真的图形效果。