当前位置: 首页 > news >正文

【OpenGL学习】(二)OpenGL渲染简单图形

文章目录

  • 【OpenGL学习】(二)OpenGL渲染简单图形
    • OpenGL渲染图形流程
    • 顶点,图元和片元
    • VAO,VBO ,EBO
    • 着色器
    • 示例:使用OpenGL渲染三角形

【OpenGL学习】(二)OpenGL渲染简单图形

OpenGL渲染图形流程

CPU(中央处理器)↓
初始化窗口与OpenGL上下文↓
编译并链接着色器程序 ↓
准备顶点数据(顶点位置、颜色、法线、纹理坐标等)↓
创建并绑定:- VAO(顶点数组对象)← 用于记录 VBO/EBO 的绑定状态和顶点属性配置↓创建并绑定:- VBO(顶点缓冲对象)← 存储所有顶点属性数据(位置信息、颜色、纹理坐标等)- EBO(索引缓冲对象,可选)← 存储索引数据,减少冗余顶点设置顶点属性指针(glVertexAttribPointer)← 告诉 OpenGL 如何解析 VBO 中的顶点数据启用顶点属性数组(glEnableVertexAttribArray)↑(这些设置会被 VAO 记录下来)调用:- glBufferData → 将顶点数据或索引数据从 CPU 传输到 GPU 显存中(显卡缓冲区)↓
====================  GPU 开始接管渲染流程 ====================
顶点着色器(Vertex Shader)- 每个顶点执行一次- 坐标变换:模型矩阵 × 视图矩阵 × 投影矩阵- 传出数据供后续阶段使用(如颜色、纹理坐标)↓
图元装配(Primitive Assembly)- 将一组顶点组装为图元(如三角形、线段)↓
(可选)几何着色器(Geometry Shader)- 每个图元执行一次- 可动态生成新的顶点或图元↓
光栅化(Rasterization)- 将图元转换为片元(像素候选)- 生成每个片元的屏幕位置↓
片段着色器(Fragment Shader)- 每个片元执行一次- 计算颜色值(光照、纹理采样、颜色混合等)↓
测试与混合阶段(由固定功能单元执行)- 深度测试、模板测试- α混合、遮挡判断↓
帧缓冲(Framebuffer)- 最终图像写入帧缓冲 → 显示在屏幕

在这里插入图片描述
图片来源:https://geekdaxue.co/read/Learn-OpenGL-CN/01-Getting-Started-04-Hello-Triangle.md

顶点,图元和片元

顶点(Vertex)是图形的基本构建单位,表示图形的一个顶点,通常包括:

  • 位置坐标(Position):如三维空间中的 (x, y, z)
  • 颜色信息(Color)
  • 纹理坐标(UV)
  • 法向量(Normal)
  • 其他自定义属性(如切线、位移等)

图元(Primitive)是由多个顶点组成的几何形状单元,比如:

  • 点(GL_POINTS)→ 每个顶点单独成图元
  • 线段(GL_LINES)→ 每两个顶点组成一条线
  • 三角形(GL_TRIANGLES)→ 每三个顶点组成一个三角形
  • 更多复合图元(如 GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN)

片元(Fragment)是每个图元经过光栅化后生成的像素候选者,这些片元会传入片段着色器进行着色计算(颜色、纹理、光照等)。在经过深度测试、模板测试、混合等处理之后,部分片元会变成屏幕上的像素。

VAO,VBO ,EBO

VAO(顶点数组对象,Vertex Array Object)用于 存储顶点属性配置状态,如顶点属性指针、VBO绑定状态、EBO绑定状态等。每次绘制时只需绑定一次 VAO,而不用重复设置顶点属性。

VBO(顶点缓冲对象,Vertex Buffer Object)用于在 GPU 显存中存储顶点数据(如位置、颜色、法线、纹理坐标等),避免每次绘制时从 CPU 向 GPU 频繁传输数据,提升效率。

EBO(元素缓冲对象,Element Buffer Object)用于在 绘制图形时按照索引重用顶点数据。节省存储空间,避免重复顶点。

着色器

着色器(Shader)是运行在 GPU 上的小程序,用于控制图形渲染的每个阶段。它是实现可编程渲染管线的核心。

着色器的主要类型:

着色器类型作用
顶点着色器 (Vertex Shader)处理每个顶点的位置变换、法线、纹理坐标等
片段着色器 (Fragment Shader)处理每个像素(片元)的颜色计算、纹理映射、光照等
几何着色器(可选) (Geometry Shader)处理图元(点、线、三角形),可生成新图元
曲面细分控制/评估着色器(可选)用于对几何细分
计算着色器(Compute Shader)用于并行计算任务,不用于图形绘制

着色器使用的语言是GLSL(OpenGL Shading Language)。GLSL的语法类似于 C 语言,且可以运行于 GPU 上。我们需要在 C++ 中编写 GLSL 代码(字符串形式),然后使用 OpenGL API 编译和链接着色器。

示例:使用OpenGL渲染三角形

#include <glad/glad.h>  // 加载 OpenGL 函数指针
#include <GLFW/glfw3.h> // GLFW 用于创建窗口和处理输入#include <iostream>     // C++ 标准输入输出库// 回调函数声明:当窗口大小发生改变时调用
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
// 处理输入的函数声明
void processInput(GLFWwindow* window);// 设置窗口宽高
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;// 顶点着色器GLSL源码
const char* vertexShaderSource = "#version 330 core\n" // 使用 OpenGL 3.3 对应的 GLSL 版本(即 GLSL 3.30)
"layout (location = 0) in vec3 aPos;\n"  // 顶点位置属性,位置值为0
"void main()\n"
"{\n"
"   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"  // 设置顶点位置
"}\0";// 片段着色器GLSL源码
const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"  // 片段输出颜色
"void main()\n"
"{\n"
"   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"  // 设置输出颜色为橙色
"}\n\0";int main()
{// 初始化并配置 GLFWglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // OpenGL 主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // OpenGL 次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用核心模式#ifdef __APPLE__glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // MacOS 需要加这句
#endif// 创建 GLFW 窗口GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate(); // 初始化失败,退出程序return -1;}glfwMakeContextCurrent(window); // 将窗口上下文设为当前线程上下文glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 设置窗口大小改变时的回调// 初始化 GLAD,用于加载 OpenGL 函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// ------------------构建并编译着色器程序------------------// 顶点着色器unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); // 创建着色器对象glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);   // 附加源码glCompileShader(vertexShader);                                // 编译着色器// 检查编译错误int success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// 片段着色器unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);// 创建一个片段着色器对象glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); // 将片段着色器源码附加到着色器对象上glCompileShader(fragmentShader);   // 编译片段着色器源码// 检查编译错误glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}// 着色器程序unsigned int shaderProgram = glCreateProgram();           // 创建程序对象glAttachShader(shaderProgram, vertexShader);              // 附加着色器glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);                             // 链接程序// 检查链接错误glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}// 删除已编译的着色器对象,已链接到程序中不再需要glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// --------------------------------------------------------// 设置顶点数据和缓冲,并配置顶点属性float vertices[] = {-0.5f, -0.5f, 0.0f, // 左下角0.5f, -0.5f, 0.0f, // 右下角0.0f,  0.5f, 0.0f  // 顶部};// unsigned int VBO, VAO;glGenVertexArrays(1, &VAO); // 创建顶点数组对象glGenBuffers(1, &VBO);      // 创建顶点缓冲对象glBindVertexArray(VAO);     // 绑定 VAOglBindBuffer(GL_ARRAY_BUFFER, VBO); // 绑定 VBO glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 传入数据// 设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0); // 启用顶点属性glBindBuffer(GL_ARRAY_BUFFER, 0); // 解绑 VBO,为了安全,非必须glBindVertexArray(0);            // 解绑 VAO// 可以取消注释以使用线框模式绘制:也就是不填充图形,只画出边框线// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);// 渲染循环while (!glfwWindowShouldClose(window)){// 处理输入processInput(window);// 清屏并设置背景颜色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 绘制三角形glUseProgram(shaderProgram); // 使用着色器程序glBindVertexArray(VAO);      // 绑定 VAOglDrawArrays(GL_TRIANGLES, 0, 3); // 从第0个顶点绘制3个顶点构成的三角形// 交换缓冲区并查询IO事件glfwSwapBuffers(window);glfwPollEvents();}// 可选:释放所有资源glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);// 释放 GLFW 资源glfwTerminate();return 0;
}// 处理输入:如果按下 ESC 键,则关闭窗口
void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}// 当窗口大小发生改变时,自动调整视口大小
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height); // 设置 OpenGL 视口大小
}

在这里插入图片描述
只画边框线:

参考:
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

相关文章:

【OpenGL学习】(二)OpenGL渲染简单图形

文章目录 【OpenGL学习】&#xff08;二&#xff09;OpenGL渲染简单图形OpenGL渲染图形流程顶点&#xff0c;图元和片元VAO&#xff0c;VBO &#xff0c;EBO着色器示例&#xff1a;使用OpenGL渲染三角形 【OpenGL学习】&#xff08;二&#xff09;OpenGL渲染简单图形 OpenGL渲…...

学习深度学习是否要先学习机器学习?

有小伙伴问我&#xff0c;最近做毕设要做一个神经网络的课题&#xff0c;想请教一下需不需要把机器学习也都学习一遍&#xff1f; 永远正确的回答是&#xff1a;建议先学机器学习&#xff0c;再学深度学习。 上面那句你从哪都挑不出毛病&#xff0c;毕竟机器学习是深度学习的基…...

六、绘制图片

文章目录 1.创建一个红色图片2.加载bmp图片3.加载png、jpg图片 前面的几个示例&#xff0c;我们已经展示过如果在Linux系统下使用xlib接口向窗口中绘制文本、线、矩形&#xff1b;并设置文本、线条的颜色。并利用xlib提供的接口结合事件处理机制完成了一个自绘按钮控件功能。有…...

【OpenCV】基本数据类型及常见图像模式

是什么&#xff1f;能做什么&#xff1f;解决什么问题&#xff1f;为什么用它&#xff1f; OpenCV:是一个基于开源发行的跨平台计算机视觉库&#xff0c;实现 一、应用场景&#xff1a; 目标识别&#xff1a;人脸、车辆、车牌...自动驾驶医学影像分析视频内容理解与分析&…...

C# WPF .NET Core和.NET5之后引用System.Windows.Forms的解决方案

双击项目名称打开工程文件&#xff08;.csporj&#xff09;添加“Microsoft.WindowsDesktop.App.WindowsForms”引用&#xff1b; <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework&g…...

Mysql 8.0.32 union all 创建视图后中文模糊查询失效

记录问题,最近在使用union all聚合了三张表的数据,创建视图作为查询主表,发现字段值为中文的筛选无法生效.......... sql示例: CREATE OR REPLACE VIEW test_view AS SELECTid,name,location_address AS address,type,"1" AS data_type,COALESCE ( update_time, cr…...

PYTHON训练营DAY28

类 &#xff08;一&#xff09;题目1&#xff1a;定义圆&#xff08;Circle&#xff09;类 要求&#xff1a; 包含属性&#xff1a;半径 radius。包含方法&#xff1a; calculate_area()&#xff1a;计算圆的面积&#xff08;公式&#xff1a;πr&#xff09;。calculate_circ…...

pytorch小记(二十一):PyTorch 中的 torch.randn 全面指南

pytorch小记&#xff08;二十一&#xff09;&#xff1a;PyTorch 中的 torch.randn 全面指南 PyTorch 中的 torch.randn 全面指南一、接口定义二、参数详解三、常见使用场景四、位置参数 vs. Tuple 传参 —— 数值示例五、必须用关键字传入小结 PyTorch 中的 torch.randn 全面指…...

LeetCode 第 45 题“跳跃游戏 II”

好的&#xff0c;我来帮你解释一下 LeetCode 第 45 题“跳跃游戏 II”&#xff0c;这是一道经典的贪心算法题目。 题目描述&#xff1a; 给你一个非负整数数组 nums&#xff0c;你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用…...

【leetcode】逐层探索:BFS求解最短路的原理与实践

前言 &#x1f31f;&#x1f31f;本期讲解关于力扣的几篇题解的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…...

副业小程序YUERGS,从开发到变现

文章目录 我为什么写这个小程序网站转小程序有什么坑有什么推广渠道个人开发者如何变现简单介绍YUERGS小程序给独立开发者一点小建议 我为什么写这个小程序 关注我的粉丝应该知道&#xff0c;我在硕士阶段就已经掌握了小程序开发技能&#xff0c;并写了一个名为“约球online”…...

Vue-键盘事件

键盘事件 回车事件 回车输出Input控件输入的内容 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>键盘事件</title><!-- 引入Vue --><script type"text/javascript&quo…...

区块链可投会议CCF C--IPCCC 2025 截止6.7 附录用率

Conference&#xff1a;44th IEEE -- International Performance Computing and Communications Conference CCF level&#xff1a;CCF C Categories&#xff1a;计算机网络 Year&#xff1a;2025 Conference time&#xff1a;Nov 21 – 23, 2025 Austin, Texas, USA 录用率…...

Linux `mkdir` 命令深度解析与高阶应用指南

Linux `mkdir` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似工具对比二、选项系统详解1. 常用基础选项2. 高级选项组合三、高阶应用场景1. 自动化部署系统2. 安全审计合规3. 容器环境初始化4. 多用户协作体系四、特殊文件处理1. 符号链接处理2. 挂载点管理…...

JVM 调优实战入门:从 GC 日志分析到参数调优

手把手教你理解 GC 日志、识别性能瓶颈并合理配置 JVM 参数&#xff01; 你是否曾遇到线上系统莫名卡顿、内存暴涨甚至频繁 Full GC&#xff1f; 本篇文章将带你从实际 GC 日志出发&#xff0c;深入剖析 JVM 性能问题&#xff0c;并学会如何通过参数调优提升系统稳定性和吞吐能…...

论文解读:ICLR2025 | D-FINE

[2410.13842] D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement D-FINE 是一款功能强大的实时物体检测器&#xff0c;它将 DETRs 中的边界框回归任务重新定义为细粒度分布细化&#xff08;FDR&#xff09;&#xff0c;并引入了全局最优定位…...

Kafka 生产者工作流程详解

以下是 Kafka 生产者工作流程的清晰分步解释&#xff0c;结合关键机制与用户数据&#xff1a; 1. 生产者初始化与数据发送 主线程创建生产者对象&#xff0c;调用 send(ProducerRecord) 发送消息。 拦截器&#xff08;可选&#xff09;&#xff1a;可添加自定义逻辑&#xff08…...

leetcode 239. 滑动窗口最大值

暴力解法是一种简单直接的方法&#xff0c;虽然效率较低&#xff0c;但可以帮助你更好地理解问题的逻辑。以下是使用暴力解法解决“滑动窗口最大值”问题的 C 实现。 暴力解法的思路 遍历每个滑动窗口&#xff1a; 使用一个外层循环&#xff0c;从数组的起始位置开始&#xff…...

第3章 自动化测试:从单元测试到硬件在环(HIL)

在前两章中,我们已完成从环境搭建到流水线编译的自动化配置。为了真正保障软件质量、降低回归风险,本章将聚焦测试自动化,涵盖从最基础的单元测试,到集成测试,再到硬件在环(Hardware-in-the-Loop, HIL)测试的全流程。通过脚本驱动、测试报告可视化和与 CI 平台深度集成,…...

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…...

实验八 基于Python的数字图像问题处理

一、实验目的  培养利用图像处理技术解决实际问题的能力。  培养利用图像处理技术综合设计实现的能力。  掌握在Python环境下解决实际问题的能力。  熟练掌握使用cv2库对图像进行处理  熟练掌握使用区域生长法提取图片中感兴趣的区域 二、实验内容 本次实验内容为…...

Dockerfile学习指南

目录 一、Dockerfile 本质与价值 二、基础语法结构 1. 指令格式 2. 核心指令详解 三、构建流程解析 1. 典型构建过程 2. 分层构建原理 四、高级特性 1. 多阶段构建 2. 环境变量管理 3. 健康检查 五、最佳实践指南 1. 优化建议 2. 安全实践 六、典型应用场景 1. …...

数据库原理及其应用 第六次作业

题目 参考答案 题目1. 教材P148第1题 问题&#xff1a;什么是数据库的安全性&#xff1f; 答案&#xff1a;数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏 。它通过用户身份鉴别、存取控制&#xff08;包括自主存取控制和强制存取控制&#x…...

c/c++的opencv的轮廓匹配初识

OpenCV 轮廓匹配&#xff1a;形状识别与比较 &#x1f4d0;✨ 轮廓匹配是计算机视觉中一个重要的技术&#xff0c;它允许我们比较两个形状的相似度。OpenCV 提供了强大的函数来实现这一功能&#xff0c;核心是 cv::matchShapes()。本文将引导你了解轮廓匹配的基本原理、OpenCV…...

Oracle APEX IR报表下载CSV文件的方法

目录 0. 准备工作 1. 下载--自定义SQL 2. 下载--检索结果 0. 准备工作 -- 建表 CREATE TABLE T_DL_EMP(EMPNO NUMBER(4) NOT NULL -- 雇员编号&#xff0c;由四个数字组成。, ENAME VARCHAR2(10) -- 雇员姓名&#xff0c;由10个字符组成。, JOB …...

JVM 双亲委派机制

一、从 JDK 到 JVM&#xff1a;Java 运行环境的基石 在 Java 开发领域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是开发者的核心工具包。它不仅包含了编译 Java 代码的工具&#xff08;如 javac&#xff09;&#xff0c;还内置了 JRE&#xff08;Java Run…...

shell脚本之条件判断,循环控制,exit详解

if条件语句的语法及案例 一、基本语法结构 1. 单条件判断 if [ 条件 ]; then命令1命令2... fi2. 双分支&#xff08;if-else&#xff09; if [ 条件 ]; then条件为真时执行的命令 else条件为假时执行的命令 fi3. 多分支&#xff08;if-elif-else&#xff09; if [ 条件1 ]…...

什么是私有IP地址?如何判断是不是私有ip地址

在互联网的世界中&#xff0c;IP地址是设备之间通信的基础标识。无论是浏览网页、发送邮件还是在线游戏&#xff0c;IP地址都扮演着至关重要的角色。然而&#xff0c;并非所有的IP地址都是公开的&#xff0c;有些IP地址被保留用于内部网络&#xff0c;这就是我们所说的私有IP地…...

BGP路由策略 基础实验

要求: 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2.用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保R1通过R2到达192.168.1.0/24 …...

Java 原生网络编程(BIO | NIO | Reactor 模式)

1、基本常识 Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;是一组接口&#xff0c;使用了门面模式对应用层隐藏了传输层以下的实现细节。TCP 用主机的 IP 地址加上主机端口号作为 TCP 连接的端点&#xff0c;该端点叫做套接字 Socket。 比如三次握手&…...

大语言模型 11 - 从0开始训练GPT 0.25B参数量 MiniMind2 准备数据与训练模型 DPO直接偏好优化

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

【Java ee初阶】HTTP(4)

构造HTTP请求 1&#xff09;开发中&#xff0c;前后端交互。浏览器运行的网页中&#xff0c;构造出HTTP请求 2&#xff09;调试阶段&#xff0c;通过构造HTTP请求测试服务器 朴素的方案&#xff1a; 通过tcp socket 的方式构造HTTP请求 按照HTTP请求格式&#xff0c;往TCP…...

永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!

作为全球领先的开源实时数据仓库&#xff0c; Apache Doris Github Stars 已超过 13.6k&#xff0c;并在 5000 余家中大型企业生产环境得到广泛应用&#xff0c;支撑业务核心场景&#xff0c;成为众多企业数据分析基础设施不可或缺的重要基座。过去&#xff0c;Apache Doris 用…...

React中useDeferredValue与useTransition终极对比。

文章目录 前言一、核心差异对比二、代码示例对比1. useDeferredValue&#xff1a;延迟搜索结果更新2. useTransition&#xff1a;延迟路由切换 三、应用场景总结四、注意事项五、原理剖析1. 核心机制对比2. 关键差异3. 代码实现原理 总结 前言 在React的并发模式下&#xff0c…...

Git 项目切换到新的远程仓库地址

已存在的 Git 项目切换到新的远程仓库地址&#xff0c;比如你要换成&#xff1a; gitgithub.com:baoing/test-app.git步骤如下&#xff1a; 查看当前的远程仓库地址&#xff08;可选&#xff09; git remote -v你会看到类似&#xff1a; origin gitgithub.com:old-user/old…...

科技晚报 AI 速递:今日科技热点一览 丨 2025 年 5 月 17 日

科技晚报AI速递:今日科技热点一览 丨2025年5月17日 我们为您汇总今日的科技领域最新动向&#xff0c;带您快速了解前沿技术、突破性研究及行业趋势。 黄仁勋劝特朗普&#xff1a;AI 芯片出口规则得改&#xff0c;中国紧追其后&#xff1a;英伟达 CEO 黄仁勋在华盛顿 “山与谷论…...

基于OpenCV的SIFT特征和FLANN匹配器的指纹认证

文章目录 引言一、概述二、代码解析1. 图像显示函数2. 核心认证函数3. 匹配点筛选4. 认证判断 三、主程序四、技术要点五、总结 引言 在计算机视觉领域&#xff0c;图像特征匹配是一个非常重要的技术&#xff0c;广泛应用于物体识别、图像拼接、运动跟踪等场景。今天将介绍一个…...

【Linux】共享内存

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 ☃️共享内存 &#x1fa84; shmget函数 用来创建共享内存 ✨共享内存的管理指令&#xff1a; &#x1f320; shmid VS key ✨共享内存函数 &#x1f354; shmget() 创建共享内存 &a…...

Cookie、Session、Token

Cookie 1. 什么是cookie? Cookie 是一种由服务器发送到客户端浏览器的小数据片段&#xff0c;用于存储用户的状态信息。例如&#xff0c;用户登录状态或用户偏好设置可以通过Cookie进行管理。计算机cookie更正式地称为 HTTP cookie、网络 cookie、互联网 cookie 或浏览器 coo…...

设计模式Java

UML类图 概述 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。 类图的作用 在软件工程中&#xff0c;类图是一种静态的结构图&#xff0c…...

Word文档图片排版与批量处理工具推荐

先放下载链接:夸克网盘下载 前几天给大家推荐了 Excel 图片调整软件&#xff0c;当时好多小伙伴问有没有 Word 相关的软件。我在网上找了一圈都没找到合适的&#xff0c;最后在我好久之前记录的一个文档里发现了&#xff0c;这不&#xff0c;马上就来给大家推荐&#xff0c;有…...

[案例五] 实体——赋值质量

最近翻阅了实验室其他人编写的一个“质量赋值”功能,能够直接为实体或组件设定质量。出于好奇,我对其进行了分析。由于自己平时没有用到该功能,所以也借此机会学习一下。 在分析过程中,我发现NX 官方其实并没有提供直接修改质量的功能。一般来说,质量是通过“密度 体积”…...

手撕四种常用设计模式(工厂,策略,代理,单例)

工厂模式 一、工厂模式的总体好处 解耦&#xff1a;客户端与具体实现类解耦&#xff0c;符合“开闭原则”。统一创建&#xff1a;对象创建交由工厂处理&#xff0c;便于集中控制。增强可维护性&#xff1a;新增对象种类时不需要大改动调用代码。便于扩展&#xff1a;易于管理…...

C# 深入理解类(静态函数成员)

静态函数成员 除了静态字段&#xff0c;还有静态函数成员。 如同静态字段&#xff0c;静态函数成员独立于任何类实例。即使没有类的实例&#xff0c;仍然可以调用静 态方法。静态函数成员不能访问实例成员&#xff0c;但能访问其他静态成员。 例如&#xff0c;下面的类包含一…...

数据类型转换

文章目录 基本数据类型&#xff08;primitive type&#xff09;整数类型&#xff1a;浮点类型字符类型boolean类型 类型转换类型转换注意点 基本数据类型&#xff08;primitive type&#xff09; 整数类型&#xff1a; ​ byte占1个字节范围&#xff1a;-128-127 ​ short占…...

深入理解 TypeScript 中的 unknown 类型:安全处理未知数据的最佳实践

在 TypeScript 的类型体系中&#xff0c;unknown 是一个极具特色的类型。它与 any 看似相似&#xff0c;却在安全性上有着本质差异。本文将从设计理念、核心特性、使用场景及最佳实践等方面深入剖析 unknown&#xff0c;帮助开发者在处理动态数据时既能保持灵活性&#xff0c;又…...

AI:人形机器人的应用场景以及商业化落地潜力分析

应用场景分析 人形机器人的设计使其能够适应人类环境&#xff0c;执行多样化任务。以下是未来主要的应用场景及其详细分析&#xff1a; 医疗与护理 具体应用&#xff1a; 老年护理&#xff1a;协助老年人穿衣、洗澡、喂食&#xff0c;或提供情感陪伴。康复辅助&#xff1a;帮助…...

JavaScript入门【3】面向对象

1.对象: 1.概述: 在js中除了5中基本类型之外,剩下得都是对象Object类型(引用类型),他们的顶级父类是Object;2.形式: 在js中,对象类型的格式为key-value形式,key表示属性,value表示属性的值3.创建对象的方式: 方式1:通过new关键字创建(不常用) let person new Object();// 添…...

亲测有效!OGG 创建抽取进程报错 OGG-08241,如何解决?

前言 今天在测试 OGG 一个功能的时候&#xff0c;需要重新初始化 oggca&#xff0c;所以重装了一下 OGG。重建完之后重新添加抽取进程报错&#xff0c;一直无法添加成功&#xff1a; 经过一翻分析&#xff0c;找到了解决方案&#xff0c;本文记录一下解决过程。 问题描述 OG…...

【第二篇】 初步解析Spring Boot

简介 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是为了用来简化Spring应用的初始搭建以及开发过程的。本文章将详细介绍SpringBoot为什么能够简化项目的搭建以及普通的Spring程序的开发。文章内容若存在错误或需改进的地方&#xff0c;欢迎大家指正&#…...