Opengl常用缓冲对象功能介绍及使用示例(C++实现)
本文整理了常用的opengl缓冲区对象并安排了使用示例
1. 顶点数组对象(Vertex Array Object, VAO)
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {// 初始化 GLFWif (!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);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 创建 VAOGLuint VAO;glGenVertexArrays(1, &VAO);// 绑定 VAOglBindVertexArray(VAO);// 这里可以进行 VBO 和 EBO 的绑定与设置// 解绑 VAOglBindVertexArray(0);// 主循环while (!glfwWindowShouldClose(window)) {// 处理事件glfwPollEvents();// 绑定 VAOglBindVertexArray(VAO);// 绘制操作// glDrawArrays(GL_TRIANGLES, 0, 3);// 解绑 VAOglBindVertexArray(0);// 交换缓冲区glfwSwapBuffers(window);}// 清理 VAOglDeleteVertexArrays(1, &VAO);// 终止 GLFWglfwTerminate();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};// 创建 VBOGLuint VBO;glGenBuffers(1, &VBO);// 绑定 VBOglBindBuffer(GL_ARRAY_BUFFER, VBO);// 填充数据glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 解绑 VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glfwTerminate();// 清理 VBOglDeleteBuffers(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};// 创建 EBOGLuint EBO;glGenBuffers(1, &EBO);// 绑定 EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);// 填充数据glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);// 解绑 EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glfwTerminate();// 清理 EBOglDeleteBuffers(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();// 创建 UBOGLuint UBO;glGenBuffers(1, &UBO);// 绑定 UBOglBindBuffer(GL_UNIFORM_BUFFER, UBO);// 分配内存glBufferData(GL_UNIFORM_BUFFER, 16 * sizeof(float), nullptr, GL_STATIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_UNIFORM_BUFFER, UBO_BINDING_POINT, UBO);// 解绑 UBOglBindBuffer(GL_UNIFORM_BUFFER, 0);glfwTerminate();// 清理 UBOglDeleteBuffers(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};// 创建 SSBOGLuint SSBO;glGenBuffers(1, &SSBO);// 绑定 SSBOglBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);// 填充数据glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, SSBO);// 解绑 SSBOglBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);glfwTerminate();// 清理 SSBOglDeleteBuffers(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();// 创建 PBOGLuint PBO;glGenBuffers(1, &PBO);// 绑定 PBOglBindBuffer(GL_PIXEL_UNPACK_BUFFER, PBO);// 分配内存glBufferData(GL_PIXEL_UNPACK_BUFFER, 800 * 600 * 4, nullptr, GL_STREAM_DRAW);// 解绑 PBOglBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);glfwTerminate();// 清理 PBOglDeleteBuffers(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();// 创建 TFBOGLuint TFBO;glGenBuffers(1, &TFBO);// 绑定 TFBOglBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, TFBO);// 分配内存glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, nullptr, GL_STATIC_DRAW);// 绑定到变换反馈绑定点glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, TFBO);// 解绑 TFBOglBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);glfwTerminate();// 清理 TFBOglDeleteBuffers(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();// 创建 ACBOGLuint ACBO;glGenBuffers(1, &ACBO);// 绑定 ACBOglBindBuffer(GL_ATOMIC_COUNTER_BUFFER, ACBO);// 分配内存glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), nullptr, GL_DYNAMIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, ACBO);// 解绑 ACBOglBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);glfwTerminate();// 清理 ACBOglDeleteBuffers(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};// 创建 TBOGLuint TBO;glGenBuffers(1, &TBO);// 绑定 TBOglBindBuffer(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();// 创建 FBOGLuint FBO;glGenFramebuffers(1, &FBO);// 绑定 FBOglBindFramebuffer(GL_FRAMEBUFFER, FBO);// 这里可以创建并附加纹理或渲染缓冲区// 检查 FBO 是否完整if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)std::cerr << "FBO 不完整" << std::endl;// 解绑 FBOglBindFramebuffer(GL_FRAMEBUFFER, 0);glfwTerminate();// 清理 FBOglDeleteFramebuffers(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();// 创建 RBOGLuint RBO;glGenRenderbuffers(1, &RBO);// 绑定 RBOglBindRenderbuffer(GL_RENDERBUFFER, RBO);// 分配内存glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);// 解绑 RBOglBindRenderbuffer(GL_RENDERBUFFER, 0);glfwTerminate();// 清理 RBOglDeleteRenderbuffers(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() {// 初始化 GLFWif (!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);// 初始化 GLEWif (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() {// 初始化 GLFWif (!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);// 初始化 GLEWif (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() {// 初始化 GLFWif (!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);// 初始化 GLEWif (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;
}
相关文章:
Opengl常用缓冲对象功能介绍及使用示例(C++实现)
本文整理了常用的opengl缓冲区对象并安排了使用示例 名称英文全称作用简述顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置,存储顶点属性设置,简化渲染流程,避免重复设置状态顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点…...

docker独立部署milvus向量数据库
milvus镜像:国外封锁,国内源也不好用。基本上所有源都不能用 首先想到阿里云服务,但是阿里云国外服务器便宜的300~400呢。 基于成本考虑终于装上心心念念的milvus(*^▽^*) 安装 Milvus 安装 Milvus 独立版 wget https://raw.githubuserco…...

【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编码转换网站 )
文章目录 一、消息头 数据1、消息头拼接2、消息 ID 字段3、消息体属性 字段4、终端手机号 字段5、终端流水号 字段 二、消息体 数据三、校验码计算四、最终计算结果五、终端注册应答1、分解终端应答数据2、终端应答 消息体 数据 六、字符编码转换网站 一、消息头 数据 1、消息头…...

github配置sshkey
使用命令生成sshkey ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 依此会要求输入以下信息,可以使用默认值 设置保存密钥的路径 设置SSH密钥密码(备注:空内容表示不设置SSH密钥密码) 再次确认SSH密钥密…...

Java数据结构第十二期:走进二叉树的奇妙世界(一)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…...
Web的增删改查
准备环境 1. 添加web 点击项目右键——>选择**添加框架**选择**web应用程序** 2.创建lib目录 在web应用程序的**WEB-INF目录下**创建lib目录添加jar包(5个)解压:右键——>选择**添加库** 3.创建Dao层 在src目录下创建包com.zmq在该包下创建dao层添加工具…...
Java 前后端时间格式转换
在 Web 开发里,时间格式处理既常见又关键。由于前端和后端对时间的表示、处理方式存在差异,熟练掌握时间格式的转换方法就显得尤为重要。这篇文章会深入探讨 Java 前后端时间格式转换的相关知识,特别是 Java 时间转换的多种方式,其…...

【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5
往期 【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_0:介绍了题目和背景【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_1:题目输入的格式说明,选择了邻接表…...
C++ 互斥锁的使用
mutex std::mutex 是C标准库中用于线程同步的互斥锁机制,主要用于保护共享资源,避免多个线程同时访问导致的竞态条件。 它提供了以下功能: 加锁(lock):阻塞当前线程,直到获取锁。 解锁&#…...
【Elasticsearch】Retrieve inner hits获取嵌套查询的具体的嵌套文档来源,以及父子文档的来源
Retrieve inner hits 是 Elasticsearch 中的一个功能,用于在嵌套查询或父子查询中,返回导致主文档匹配的具体嵌套对象或子/父文档的详细信息,帮助用户更直观地理解查询结果的来源。 在 Elasticsearch 中,Retrieve inner hits是一…...
C语言中的typedef关键字详解
C语言中的typedef关键字详解 在C语言编程中,typedef 关键字是一个非常实用的特性,它可以帮助我们创建新的类型名,从而简化代码,提高可读性。本文将详细解析typedef的使用方法、场景以及注意事项。 1. typedef简介 typedef 是Ty…...
怎麼利用靜態ISP住宅代理在指紋流覽器中管理社媒帳號?
靜態ISP住宅代理是一種基於真實住宅IP的代理服務。這類代理IP通常由互聯網服務提供商(ISP)分配,具有非常高的真實性,與普通數據中心代理相比,更不容易被平臺檢測到為“虛假IP”或“代理IP”,靜態ISP住宅代理…...
【多语言生态篇一】【DeepSeek×Java:Spring Boot微服务集成全栈指南 】
(手把手带你从零实现AI能力调用,万字长文预警,建议收藏实操) 一、环境准备:别输在起跑线上 1.1 硬件软件全家桶 JDK版本:必须 ≥17(Spring Boot 3.2+强制要求,低版本直接报错)IDE推荐:IntelliJ IDEA终极版(社区版缺Spring AI插件支持)构建工具:Maven 3.9+ / Grad…...

IOS UITextField 无法隐藏键盘问题
设置UITextField 键盘按钮返回键为“完成”,即return key 设置done .m代码设置代理 //设置代理协议 UITextFieldDelegate, self.mobileTextField.delegate self; ///点击完成键隐藏键盘 - (BOOL)textFieldShouldReturn:(UITextField *)textField{//取…...

einops测试
文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库,让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…...

25轻化工程研究生复试面试问题汇总 轻化工程专业知识问题很全! 轻化工程复试全流程攻略 轻化工程考研复试真题汇总
轻化工程复试心里没谱?学姐带你玩转面试准备! 是不是总觉得老师会问些刁钻问题?别焦虑!其实轻化工程复试套路就那些,看完这篇攻略直接掌握复试通关密码!文中有重点面试题可直接背~ 目录 一、这些行为赶紧避…...

小米路由器 AX3000T 降级后无法正常使用,解决办法
问题描述 买了个 AX3000T 路由器,想安装 OpenWRT 或者 安装 Clash 使用,看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了,一直黄灯亮,中间灭一下,又是黄灯长亮,没有 WIFI 没有连接。以…...

qt5实现表盘的旋转效果,通过提升QLabel类
因为工作需要,需要实现温度的表盘展示效果 实现思路: 通过提示声QLabel控价类,实现报盘的旋转和展示效果 1. 编写一个QLabel的类MyQLabel,实现两个方法 1. void paintEvent(QPaintEvent *event); //重绘函数 2. void valueChanged(int va…...

【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!
命令模式:封装请求,轻松实现解耦! 大家好!今天我们来聊聊设计模式中的命令模式(Command Pattern)。如果你曾经需要将请求封装成对象,或者希望实现请求的撤销、重做等功能,那么命令模…...
HTTPS(下)
主要讲加密算法RSA,ECDHE TLS的握手涉及四次通信,根据不同的密钥交换算法,TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA 算法和 ECDHE 算法 正常情况下,需要先TCP三次握手后进行TLS四次握手…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...