Opengl常用缓冲对象功能介绍及使用示例(C++实现)

news2025/2/26 1:27:36

本文整理了常用的opengl缓冲区对象并安排了使用示例

名称英文全称作用简述
顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置,存储顶点属性设置,简化渲染流程,避免重复设置状态
顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点属性数据,提升渲染性能
索引缓冲区对象Element/Index Buffer Object (EBO/IBO)存储顶点索引,减少数据冗余
统一缓冲区对象Uniform Buffer Object (UBO)存储着色器统一变量,方便多着色器共享
着色器存储缓冲区对象Shader Storage Buffer Object (SSBO)供着色器直接读写复杂数据
像素缓冲区对象Pixel Buffer Object (PBO)加速像素数据在 CPU 和 GPU 间传输
变换反馈缓冲区对象Transform Feedback Buffer Object (TFBO)存储处理后的顶点数据用于后续渲染
原子计数器缓冲区对象Atomic Counter Buffer Object (ACBO)存储可并发修改的计数器
纹理缓冲区对象Texture Buffer Object (TBO)将缓冲区数据作为一维纹理采样
查询对象Query Object查询 OpenGL 操作状态和结果用于调试
帧缓冲区对象Framebuffer Object (FBO)自定义渲染目标实现离屏渲染
渲染缓冲区对象Renderbuffer Object (RBO)与 FBO 配合存储单一图像数据
命令缓冲区Command Buffer提前记录命令,减少 CPU - GPU 同步开销
稀疏纹理Sparse Texture仅为纹理实际部分分配内存,节省空间
采样器缓冲区对象Sampler Buffer Object结合缓冲区与采样器功能访问数据
多视图帧缓冲区对象Multiview Framebuffer Object支持同时渲染到多个视图用于特殊渲染

1. 顶点数组对象(Vertex Array Object, VAO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    // 初始化 GLFW
    if (!glfwInit()) {
        std::cerr << "GLFW 初始化失败" << std::endl;
        return -1;
    }

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(800, 600, "VAO 示例", nullptr, nullptr);
    if (!window) {
        glfwTerminate();
        std::cerr << "窗口创建失败" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    // 初始化 GLEW
    if (glewInit() != GLEW_OK) {
        glfwTerminate();
        std::cerr << "GLEW 初始化失败" << std::endl;
        return -1;
    }

    // 创建 VAO
    GLuint VAO;
    glGenVertexArrays(1, &VAO);
    // 绑定 VAO
    glBindVertexArray(VAO);

    // 这里可以进行 VBO 和 EBO 的绑定与设置

    // 解绑 VAO
    glBindVertexArray(0);

    // 主循环
    while (!glfwWindowShouldClose(window)) {
        // 处理事件
        glfwPollEvents();

        // 绑定 VAO
        glBindVertexArray(VAO);
        // 绘制操作
        // glDrawArrays(GL_TRIANGLES, 0, 3);
        // 解绑 VAO
        glBindVertexArray(0);

        // 交换缓冲区
        glfwSwapBuffers(window);
    }

    // 清理 VAO
    glDeleteVertexArrays(1, &VAO);

    // 终止 GLFW
    glfwTerminate();
    return 0;
}

2. 顶点缓冲区对象(Vertex Buffer Object, VBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "VBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 顶点数据
    float vertices[] = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
    };

    // 创建 VBO
    GLuint VBO;
    glGenBuffers(1, &VBO);
    // 绑定 VBO
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // 填充数据
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 解绑 VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glfwTerminate();
    // 清理 VBO
    glDeleteBuffers(1, &VBO);
    return 0;
}

3. 索引缓冲区对象(Element Buffer Object, EBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "EBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 顶点数据
    float vertices[] = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
    };
    // 索引数据
    unsigned int indices[] = {
        0, 1, 2
    };

    // 创建 EBO
    GLuint EBO;
    glGenBuffers(1, &EBO);
    // 绑定 EBO
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    // 填充数据
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    // 解绑 EBO
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    glfwTerminate();
    // 清理 EBO
    glDeleteBuffers(1, &EBO);
    return 0;
}

4. 统一缓冲区对象(Uniform Buffer Object, UBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

const GLuint UBO_BINDING_POINT = 0;

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "UBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建 UBO
    GLuint UBO;
    glGenBuffers(1, &UBO);
    // 绑定 UBO
    glBindBuffer(GL_UNIFORM_BUFFER, UBO);
    // 分配内存
    glBufferData(GL_UNIFORM_BUFFER, 16 * sizeof(float), nullptr, GL_STATIC_DRAW);
    // 绑定到指定绑定点
    glBindBufferBase(GL_UNIFORM_BUFFER, UBO_BINDING_POINT, UBO);

    // 解绑 UBO
    glBindBuffer(GL_UNIFORM_BUFFER, 0);

    glfwTerminate();
    // 清理 UBO
    glDeleteBuffers(1, &UBO);
    return 0;
}

5. 着色器存储缓冲区对象(Shader Storage Buffer Object, SSBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "SSBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 数据
    float data[] = {1.0f, 2.0f, 3.0f, 4.0f};

    // 创建 SSBO
    GLuint SSBO;
    glGenBuffers(1, &SSBO);
    // 绑定 SSBO
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);
    // 填充数据
    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
    // 绑定到指定绑定点
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, SSBO);

    // 解绑 SSBO
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

    glfwTerminate();
    // 清理 SSBO
    glDeleteBuffers(1, &SSBO);
    return 0;
}

6. 像素缓冲区对象(Pixel Buffer Object, PBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "PBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建 PBO
    GLuint PBO;
    glGenBuffers(1, &PBO);
    // 绑定 PBO
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, PBO);
    // 分配内存
    glBufferData(GL_PIXEL_UNPACK_BUFFER, 800 * 600 * 4, nullptr, GL_STREAM_DRAW);

    // 解绑 PBO
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

    glfwTerminate();
    // 清理 PBO
    glDeleteBuffers(1, &PBO);
    return 0;
}

7. 变换反馈缓冲区对象(Transform Feedback Buffer Object, TFBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "TFBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建 TFBO
    GLuint TFBO;
    glGenBuffers(1, &TFBO);
    // 绑定 TFBO
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, TFBO);
    // 分配内存
    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
    // 绑定到变换反馈绑定点
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, TFBO);

    // 解绑 TFBO
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);

    glfwTerminate();
    // 清理 TFBO
    glDeleteBuffers(1, &TFBO);
    return 0;
}

8. 原子计数器缓冲区对象(Atomic Counter Buffer Object, ACBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "ACBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建 ACBO
    GLuint ACBO;
    glGenBuffers(1, &ACBO);
    // 绑定 ACBO
    glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, ACBO);
    // 分配内存
    glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), nullptr, GL_DYNAMIC_DRAW);
    // 绑定到指定绑定点
    glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, ACBO);

    // 解绑 ACBO
    glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);

    glfwTerminate();
    // 清理 ACBO
    glDeleteBuffers(1, &ACBO);
    return 0;
}

9. 纹理缓冲区对象(Texture Buffer Object, TBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "TBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 数据
    float data[] = {1.0f, 2.0f, 3.0f, 4.0f};

    // 创建 TBO
    GLuint TBO;
    glGenBuffers(1, &TBO);
    // 绑定 TBO
    glBindBuffer(GL_TEXTURE_BUFFER, TBO);
    // 填充数据
    glBufferData(GL_TEXTURE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);

    // 创建纹理
    GLuint texture;
    glGenTextures(1, &texture);
    // 绑定纹理
    glBindTexture(GL_TEXTURE_BUFFER, texture);
    // 将 TBO 关联到纹理
    glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, TBO);

    // 解绑 TBO 和纹理
    glBindBuffer(GL_TEXTURE_BUFFER, 0);
    glBindTexture(GL_TEXTURE_BUFFER, 0);

    glfwTerminate();
    // 清理 TBO 和纹理
    glDeleteBuffers(1, &TBO);
    glDeleteTextures(1, &texture);
    return 0;
}

10. 查询对象(Query Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "查询对象示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建查询对象
    GLuint query;
    glGenQueries(1, &query);

    // 开始查询
    glBeginQuery(GL_SAMPLES_PASSED, query);

    // 这里进行绘制操作
    // glDrawArrays(GL_TRIANGLES, 0, 3);

    // 结束查询
    glEndQuery(GL_SAMPLES_PASSED);

    // 获取查询结果
    GLuint result;
    glGetQueryObjectuiv(query, GL_QUERY_RESULT, &result);
    std::cout << "采样通过数量: " << result << std::endl;

    // 清理查询对象
    glDeleteQueries(1, &query);

    glfwTerminate();
    return 0;
}

11. 帧缓冲区对象(Framebuffer Object, FBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "FBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建 FBO
    GLuint FBO;
    glGenFramebuffers(1, &FBO);
    // 绑定 FBO
    glBindFramebuffer(GL_FRAMEBUFFER, FBO);

    // 这里可以创建并附加纹理或渲染缓冲区

    // 检查 FBO 是否完整
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        std::cerr << "FBO 不完整" << std::endl;

    // 解绑 FBO
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    glfwTerminate();
    // 清理 FBO
    glDeleteFramebuffers(1, &FBO);
    return 0;
}

12. 渲染缓冲区对象(Renderbuffer Object, RBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "RBO 示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    // 创建 RBO
    GLuint RBO;
    glGenRenderbuffers(1, &RBO);
    // 绑定 RBO
    glBindRenderbuffer(GL_RENDERBUFFER, RBO);
    // 分配内存
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);

    // 解绑 RBO
    glBindRenderbuffer(GL_RENDERBUFFER, 0);

    glfwTerminate();
    // 清理 RBO
    glDeleteRenderbuffers(1, &RBO);
    return 0;
}

13. 命令缓冲区(Command Buffer)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>

// 模拟命令结构体
struct Command {
    enum Type { DRAW_ARRAYS } type;
    GLenum mode;
    GLint first;
    GLsizei count;
};

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "命令缓冲区示例", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();

    std::vector<Command> commandBuffer;

    // 添加命令到缓冲区
    Command cmd;
    cmd.type = Command::DRAW_ARRAYS;
    cmd.mode = GL_TRIANGLES;
    cmd.first = 0;
    cmd.count = 3;
    commandBuffer.push_back(cmd);

    // 执行命令缓冲区中的命令
    for (const auto& cmd : commandBuffer) {
        if (cmd.type == Command::DRAW_ARRAYS) {
            glDrawArrays(cmd.mode, cmd.first, cmd.count);
        }
    }

    glfwTerminate();
    return 0;
}

稀疏纹理(Sparse Texture)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

const int WIDTH = 800;
const int HEIGHT = 600;

int main() {
    // 初始化 GLFW
    if (!glfwInit()) {
        std::cerr << "GLFW 初始化失败" << std::endl;
        return -1;
    }

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Sparse Texture Example", nullptr, nullptr);
    if (!window) {
        glfwTerminate();
        std::cerr << "窗口创建失败" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    // 初始化 GLEW
    if (glewInit() != GLEW_OK) {
        glfwTerminate();
        std::cerr << "GLEW 初始化失败" << std::endl;
        return -1;
    }

    // 检查是否支持稀疏纹理扩展
    if (!GLEW_ARB_sparse_texture) {
        std::cerr << "不支持 ARB_sparse_texture 扩展" << std::endl;
        glfwTerminate();
        return -1;
    }

    // 创建纹理对象
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    // 设置纹理参数
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // 分配稀疏纹理存储
    GLint alignment;
    glGetInternalformativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_SPARSE_ARB, 1, &alignment);
    glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, WIDTH, HEIGHT, GL_TRUE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SPARSE_ARB, GL_TRUE);

    // 定义一个稀疏纹理的子区域
    GLint x = 0, y = 0, z = 0;
    GLint width = WIDTH / 2, height = HEIGHT / 2, depth = 1;
    GLint level = 0;
    glTexPageCommitmentARB(GL_TEXTURE_2D, level, x, y, z, width, height, depth, GL_TRUE);

    // 主循环
    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();

        // 清屏
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 这里可以进行纹理绘制操作

        glfwSwapBuffers(window);
    }

    // 清理资源
    glDeleteTextures(1, &texture);
    glfwTerminate();
    return 0;
}

采样器缓冲区对象(Sampler Buffer Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

const int WIDTH = 800;
const int HEIGHT = 600;

int main() {
    // 初始化 GLFW
    if (!glfwInit()) {
        std::cerr << "GLFW 初始化失败" << std::endl;
        return -1;
    }

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Sampler Buffer Object Example", nullptr, nullptr);
    if (!window) {
        glfwTerminate();
        std::cerr << "窗口创建失败" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    // 初始化 GLEW
    if (glewInit() != GLEW_OK) {
        glfwTerminate();
        std::cerr << "GLEW 初始化失败" << std::endl;
        return -1;
    }

    // 创建缓冲区对象
    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_TEXTURE_BUFFER, buffer);

    // 分配缓冲区数据
    const int bufferSize = 1024;
    float* data = new float[bufferSize];
    for (int i = 0; i < bufferSize; ++i) {
        data[i] = static_cast<float>(i);
    }
    glBufferData(GL_TEXTURE_BUFFER, bufferSize * sizeof(float), data, GL_STATIC_DRAW);
    delete[] data;

    // 创建纹理对象并绑定到缓冲区
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_BUFFER, texture);
    glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer);

    // 主循环
    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();

        // 清屏
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 这里可以在着色器中使用采样器缓冲区对象进行采样操作

        glfwSwapBuffers(window);
    }

    // 清理资源
    glDeleteTextures(1, &texture);
    glDeleteBuffers(1, &buffer);
    glfwTerminate();
    return 0;
}

多视图帧缓冲区对象(Multiview Framebuffer Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

const int WIDTH = 800;
const int HEIGHT = 600;

int main() {
    // 初始化 GLFW
    if (!glfwInit()) {
        std::cerr << "GLFW 初始化失败" << std::endl;
        return -1;
    }

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Multiview Framebuffer Object Example", nullptr, nullptr);
    if (!window) {
        glfwTerminate();
        std::cerr << "窗口创建失败" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    // 初始化 GLEW
    if (glewInit() != GLEW_OK) {
        glfwTerminate();
        std::cerr << "GLEW 初始化失败" << std::endl;
        return -1;
    }

    // 检查是否支持多视图扩展
    if (!GLEW_NV_multiview) {
        std::cerr << "不支持 NV_multiview 扩展" << std::endl;
        glfwTerminate();
        return -1;
    }

    // 创建帧缓冲区对象
    GLuint fbo;
    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);

    // 创建纹理附件
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
    glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, WIDTH, HEIGHT, 2); // 2 个视图

    // 将纹理附件附加到帧缓冲区
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);

    // 设置多视图
    GLuint views[] = {0, 1};
    glNamedFramebufferMultiviewOVR(fbo, GL_COLOR_ATTACHMENT0, texture, 0, 0, 2, 2, views);

    // 主循环
    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();

        // 清屏
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 这里可以进行多视图渲染操作

        glfwSwapBuffers(window);
    }

    // 清理资源
    glDeleteTextures(1, &texture);
    glDeleteFramebuffers(1, &fbo);
    glfwTerminate();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch实现论文:基于多尺度融合生成对抗网络的水下图像增强

简介 简介:提出了一种新型的水下图像增强算法,基于多尺度融合生成对抗网络,名为UMSGAN,以解决低对比度和颜色失真的问题。首先经过亮度的处理,将处理后的图像输入设计的MFFEM模块和RM模块生成图像。该算法旨在适应各种水下场景,提供颜色校正和细节增强。 论文题目:Und…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

基于大语言模型的推荐系统(1)

推荐系统&#xff08;recommendation system&#xff09;非常重要。事实上&#xff0c;搜索引擎&#xff0c;电子商务&#xff0c;视频&#xff0c;音乐平台&#xff0c;社交网络等等&#xff0c;几乎所有互联网应用的核心就是向用户推荐内容&#xff0c;商品&#xff0c;电影&…

计算机毕业设计SpringBoot+Vue.js新闻推荐系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Android 布局系列(一):LinearLayout 使用指南

引言 在 Android 开发中&#xff0c;布局是每个应用的基础&#xff0c;而 LinearLayout 无疑是最常见、最简单的布局之一。它允许我们将多个视图按顺序排列&#xff0c;可以选择水平方向&#xff08;horizontal&#xff09;或垂直方向&#xff08;vertical&#xff09;。 Line…

Android级联选择器,下拉菜单

近期android开发&#xff0c;遇到的需求&#xff0c;分享二个android可能用到的小组件 下拉选择器&#xff1a;它的实现&#xff0c;主要是需要监听它依附的组件当前距离屏幕顶端的位置。 在显示下拉菜单中&#xff0c;如果需要点击上面有响应。可通过activity拿到decorview(ac…

【每日八股】MySQL篇(一):概述

关系的三个范式是什么&#xff1f; 第一范式&#xff08;1NF&#xff09;&#xff1a;用来确保每列的原子性&#xff0c;要求每列都是不可再分的最小数据单元。 概括&#xff1a;表中的每一列都是不可分割的最小原子值&#xff0c;且每一行都是唯一的。 第二范式&#xff08…

Remainder Problem CF1207F

题目&#xff1a;题目链接 题目大意 题目描述 给你一个长度为 500000 的序列&#xff0c;初值为 0 &#xff0c;你要完成 q 次操作&#xff0c;操作有如下两种&#xff1a; 1 x y : 将下标为 x 的位置的值加上 y2 x y : 询问所有下标模 x 的结果为 y 的位置的值之和 输入格…

SpringBoot之自定义简单的注解和AOP

1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…

自由学习记录(38)

python语法 def def print_receipt (store_name, items, total_price, cashier"Self-Checkout", payment_method"Credit Card"): Python 的 函数定义 语法 def print_receipt(...) → 定义了一个名为 print_receipt 的函数。store_name, items, total_…

【SQL实验】触发器

下载素材文件”tsgl”、“成绩管理”,将tsgl.bak和成绩管理.bak数据库还原到库中【导入操作在之前的文章中详细讲过】 触发器 1、为图书表设置更新触发器&#xff0c;根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录&#xff0c;然后更新书名、作者…

CPU多级缓存机制

目录 一、前置知识 ---- CPU的核心 1.1. 单核与多核CPU 二、CPU多级缓存机制 三. 缓存的基本结构/缓存的存储结构 四、CPU缓存的运作流程/工作原理 五、CPU多级缓存机制的工作原理【简化版】 5.1. 缓存访问的过程 (5.1.1) L1缓存&#xff08;一级缓存&#xff09;访问 …

神经网络八股(3)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小&#xff0c;最终趋近于零&#xff0c;这会导致靠前层的神经网络层权重参数更新缓慢&#xff0c;甚至不更新&#xff0c;学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大&#xff0c;…

SmartMediakit之音视频直播技术的极致体验与广泛应用

引言 在数字化时代&#xff0c;音视频直播技术已经深入到各个行业和领域&#xff0c;成为信息传递和交流的重要手段。视沃科技自2015年成立以来&#xff0c;一直致力于为传统行业提供极致体验的音视频直播技术解决方案&#xff0c;其旗下的大牛直播SDK凭借强大的功能和卓越的性…

【R包】tidyplots----取代ggplot2的科研绘图利器

文章目录 介绍安装Usage文档参考 介绍 tidyplots----取代ggplot2的科研绘图利器。tidyplots的目标是简化为科学论文准备出版的情节的创建。它允许使用一致和直观的语法逐渐添加&#xff0c;删除和调整情节组件。 安装 You can install the released version of tidyplots fro…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

微信小程序实现拉卡拉支付

功能需求&#xff1a;拉卡拉支付&#xff08;通过跳转拉卡拉平台进行支付&#xff09;&#xff0c;他人支付&#xff08;通过链接进行平台跳转支付&#xff09; 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…

Unity 第三人称人物切动画时人物莫名旋转

前提: 使用Starter Asset包中的第三人称插件包. 在给3D角色的动画器增加新动画时, 发现进入新动画会让角色莫名转动. 观察后发现是动画强行将朝向掰"正", 人物动画在进行时朝向会一直变化, 这使得动作非常的怪异. 对系动画进行以下处理后, 将可以解决这种不自然: 选…

启动Redis报错记录

突然启动Redis就报了个错&#xff1a;‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案&#xff0c;应该是6379端口已绑定&#xff0c;服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…

自然语言处理NLP 04案例——苏宁易购优质评论与差评分析

上一篇文章&#xff0c;我们爬取了苏宁易购平台某产品的优质评价和差评&#xff0c;今天我们对优质评价与差评进行分析 selenium爬取苏宁易购平台某产品的评论-CSDN博客 目录 1. 数据加载 2. 中文分词 3. 停用词处理 4. 数据标注与合并 5. 数据集划分 6. 文本特征提取 …