返回

OpenGL纹理常用函数纪录,涵盖纹理加载、绑定、坐标定义、绘制方法等!

IOS

纹理加载

纹理加载是指将图像数据从内存加载到显存中。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模型表面,从而创建逼真的图形效果。