计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 12.曲面细分
1. 曲面细分
曲面细分着色器(Tessellation Shader)是OpenGL 4.0及以上版本引入的一种可编程着色器阶段,用于在GPU上对几何体进行细分,将粗糙的多边形网格自动细分为更平滑、更精细的曲面。它主要用于实现高质量的曲面渲染,如贝塞尔曲面、NURBS曲面等。
曲面细分着色器由两个部分组成:
-
细分控制着色器(Tessellation Control Shader, TCS)
决定每个patch(补丁)的细分程度,可以动态调整细分级别,实现自适应细分。 -
细分评估着色器(Tessellation Evaluation Shader, TES)
根据细分后的顶点坐标,计算每个新生成顶点的具体位置,实现曲面插值和变形。
曲面细分着色器的优点是可以在不增加原始模型数据的情况下,动态生成高精度的曲面,提高渲染质量,广泛应用于角色建模、地形渲染等领域。
从顶点着色器中获取顶点位置后,曲面细分着色器会根据细分控制着色器输出的细分因子,对每个顶点进行细分,生成新的顶点。这些新生成的顶点会传递给细分评估着色器,由细分评估着色器计算每个顶点的位置,实现曲面插值和变形。最后,曲面细分着色器会将新的顶点传递给片段着色器,进行最后的渲染。
注意:顶点着色器中输出的顶点不会用于最后渲染,其只是做为细分控制着色器输入的顶点,用于计算细分因子。
1.0.1. 细分控制着色器(TCS)
TCS(细分控制着色器)中的主要任务就是设置外层细分等级(gl_TessLevelOuter)和内层细分等级(gl_TessLevelInner)。这是曲面细分着色器中用于控制patch(补丁)细分精度的参数。
-
外层细分等级(gl_TessLevelOuter)
控制patch边界(如四边形的四条边)被细分成多少段。每个外层等级对应patch的一条边,数值越大,边被细分得越细,生成的网格越密集。 -
内层细分等级(gl_TessLevelInner)
控制patch内部的细分程度。对于四边形patch,有两个内层等级,分别控制u和v方向内部的细分密度。数值越大,patch内部被细分得越细,曲面越平滑。
简单理解:
- 外层细分等级决定边界的分段数,影响轮廓的精细度。
- 内层细分等级决定内部网格的密度,影响曲面内部的平滑度。
gl_TessLevelOuter
和 gl_TessLevelInner
这两个数组的元素个数取决于 patch 的类型:
-
对于 四边形 patch(quads):
gl_TessLevelOuter
有 4 个元素(分别对应四条边)。gl_TessLevelInner
有 2 个元素(分别对应 u 和 v 两个方向的内部细分)。
-
对于 三角形 patch(triangles):
gl_TessLevelOuter
有 3 个元素(分别对应三条边)。gl_TessLevelInner
有 1 个元素(对应内部细分)。
1.0.2. 内部网格新生成的顶点数量
生成的顶点数主要由内层细分等级决定,与外层细分等级无关。
- 内层细分等级(gl_TessLevelInner) 决定了 patch 内部网格的密度,也就是细分后生成的顶点数量。
- 外层细分等级(gl_TessLevelOuter) 决定 patch 边界的分段数,影响边界的平滑度,但不会直接影响整个 patch 内部生成的顶点总数。
1.0.2.1. 三角形patch
对于三角形 patch(triangles):
gl_TessLevelOuter
有 3 个元素,分别对应三角形的三条边,每个值决定对应边被细分成多少段。gl_TessLevelInner
有 1 个元素,决定三角形内部的细分密度。
生成的顶点数量
三角形 patch 细分后,生成的顶点数为:
(内层细分等级 + 1) × (内层细分等级 + 2) / 2
例如,内层细分等级为 N,则顶点数为 (N+1) × (N+2) / 2。
示例:
如果 gl_TessLevelInner[0] = 4
,则生成的顶点数为 (4+1) × (4+2) / 2 = 5 × 6 / 2 = 15 个顶点。
总结:
- 三角形 patch:
gl_TessLevelOuter[3]
,gl_TessLevelInner[1]
- 顶点数 = (内层细分等级 + 1) × (内层细分等级 + 2) / 2
1.0.2.2. 四边形patch
对于四边形 patch(quads):
gl_TessLevelOuter
有 4 个元素,分别对应四条边,每个值决定对应边被细分成多少段。gl_TessLevelInner
有 2 个元素,分别对应 u 和 v 两个方向的内部细分密度。
生成的顶点数量
四边形 patch 细分后,生成的顶点数为:
(内层细分等级[0] + 1) × (内层细分等级[1] + 1)
例如,若 gl_TessLevelInner[0] = M
,gl_TessLevelInner[1] = N
,则顶点数为 (M+1) × (N+1)。
示例:
如果 gl_TessLevelInner[0] = 12
,gl_TessLevelInner[1] = 12
,则生成的顶点数为 (12+1) × (12+1) = 169 个顶点。
总结:
- 四边形 patch:
gl_TessLevelOuter[4]
,gl_TessLevelInner[2]
- 顶点数 = (内层细分等级[0] + 1) × (内层细分等级[1] + 1)
1.1. 细分评估着色器(TES)
细分评估着色器(Tessellation Evaluation Shader,简称 TES)是 OpenGL 曲面细分管线中的一个阶段。它的主要作用是:
在细分控制着色器(TCS)设置好细分等级并生成了新的细分点后,TES 会根据每个细分点的参数(如 u、v 坐标),结合 patch 的控制点,计算出每个新顶点的具体位置,实现曲面的插值和变形。
主要特点:
- TES 的输入是细分后的参数坐标(如 gl_TessCoord),以及 patch 的控制点数据。
- TES 负责根据细分参数和控制点,计算每个新生成顶点的最终位置(如贝塞尔曲面插值)。
- TES 的输出会传递给后续的几何着色器或片段着色器,参与最终渲染。
常见用法:
- 在 TES 中可以实现贝塞尔曲面、NURBS 曲面等高质量曲面插值。
- 也可以在 TES 中进行法线、纹理坐标等属性的插值计算。
示例代码:
#version 430
layout (quads, equal_spacing, ccw) in;
uniform mat4 mvp_matrix;
void main(void) {float u = gl_TessCoord.x;float v = gl_TessCoord.y;gl_Position = mvp_matrix * vec4(u, 0, v, 1);
}
TES 是实现高质量曲面细分和渲染的关键阶段。
1.2. 常用变量
TCS(细分控制着色器)和 TES(细分评估着色器)的常用全局变量如下:
1.2.1. TCS(Tessellation Control Shader)常用全局变量
-
gl_in[]
输入顶点数组,包含从顶点着色器传递过来的每个控制点的数据(如位置、属性等)。 -
gl_out[]
输出顶点数组,传递给 TES 的每个控制点的数据。 -
gl_InvocationID
当前 TCS 实例的索引(0 ~ patch顶点数-1),用于区分每个控制点。 -
gl_PatchVerticesIn
当前 patch 包含的控制点数量。 -
gl_TessLevelOuter[]
外层细分等级数组,用于设置 patch 边界的细分密度。 -
gl_TessLevelInner[]
内层细分等级数组,用于设置 patch 内部的细分密度。
1.2.2. TES(Tessellation Evaluation Shader)常用全局变量
-
gl_in[]
输入 patch 的控制点数据(由 TCS 输出)。 -
gl_TessCoord
当前细分点在 patch 内的参数坐标(如(u, v)或(barycentric)),范围通常为[0,1]。 -
gl_PatchVerticesIn
当前 patch 包含的控制点数量。 -
gl_PrimitiveID
当前 patch 的索引(用于实例化渲染时区分不同 patch)。
曲面细分控制着色器中的输入和输出控制点顶点和顶点属性是数组。不同的是,曲面细分评估着色器中的输入控制点顶点和顶点属性是数组,但输出顶点是标量
1.3. 基本曲面细分器网格
运行结果
1.3.1. 思路
- cpp 中指定曲面细分着色器,设置相关参数
- 顶点着色器中输出顶点位置,用于计算细分因子
- 细分控制着色器中计算细分因子
- 细分评估着色器中计算每个顶点的位置
- 片段着色器中渲染顶点
1.3.2. main.cpp: display()
glPatchParameteri(GL_PATCH_VERTICES, 1);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // FILL or LINEglDrawArrays(GL_PATCHES, 0, 1);
glPatchParameteri
是 OpenGL 4.0 及以上版本用于曲面细分(Tessellation)的一条函数指令。它的作用是设置 patch(补丁)的相关参数,最常用的是指定每个 patch 包含的顶点数量。
常用语法:
glPatchParameteri(GLenum pname, GLint value);
pname
:参数名称,常用的是GL_PATCH_VERTICES
,表示设置每个 patch 的顶点数。value
:具体的数值,比如 1、3、4、16 等,取决于你的 patch 结构(如贝塞尔曲面常用 16)。
示例:
glPatchParameteri(GL_PATCH_VERTICES, 16); // 每个patch包含16个顶点
作用:
告诉 OpenGL 后续的 glDrawArrays(GL_PATCHES, ...)
或 glDrawElements(GL_PATCHES, ...)
绘制时,每多少个顶点为一组,作为一个 patch 送入细分着色器阶段。
注意:我们此处要调用glDrawArrays(GL_PATCHES, 0, 1);
,而不是glDrawArrays(GL_TRIANGLES, 0, 1);
,因为我们要绘制的是一个 patch,而不是一个三角形。
1.3.3. 顶点着色器
我们不用做任何事情
#version 430
void main(void)
{
}
1.3.4. 细分控制着色器(TCS)
#version 430uniform mat4 mvp_matrix;
layout (vertices = 1) out; // 每个patch包含1个顶点输出到下一个阶段void main(void)
{// 设置外层细分等级,决定patch边界被细分的段数gl_TessLevelOuter[0] = 6; // 第一条边细分为6段gl_TessLevelOuter[1] = 6; // 第二条边细分为6段gl_TessLevelOuter[2] = 6; // 第三条边细分为6段gl_TessLevelOuter[3] = 6; // 第四条边细分为6段// 设置内层细分等级,决定patch内部被细分的程度gl_TessLevelInner[0] = 12; // 第一组内层细分为12段gl_TessLevelInner[1] = 12; // 第二组内层细分为12段
}
1.3.5. 细分评估着色器(TES)
#version 430layout (quads, equal_spacing, ccw) in; // 使用四边形patch,均匀间隔,逆时针顺序uniform mat4 mvp_matrix; // 传入的MVP变换矩阵void main (void)
{float u = gl_TessCoord.x; // 获取当前细分点的u坐标float v = gl_TessCoord.y; // 获取当前细分点的v坐标gl_Position = mvp_matrix * vec4(u, 0, v, 1); // 计算变换后的位置,y为0表示在xz平面
}
1.4. 贝塞尔曲面细分
1.4.1. 思路
- 设置16个控制顶点 ,作为贝塞尔曲面的控制顶点
- 设置细分等级为32,决定patch边界被细分的段数
- 按照贝塞尔曲面公式计算每个细分点的位置
1.4.2. 顶点着色器
我们在顶点着色器中定义16个控制顶点,作为贝塞尔曲面的控制顶点。
#version 430uniform mat4 mvp_matrix;
out vec2 texCoord; // 纹理坐标输出void main(void)
{// 定义16个控制点,作为贝塞尔曲面的控制顶点const vec4 vertices[ ] = vec4[ ] (vec4(-1.0, 0.5, -1.0, 1.0), vec4(-0.5, 0.5, -1.0, 1.0), vec4( 0.5, 0.5, -1.0, 1.0), vec4( 1.0, 0.5, -1.0, 1.0), vec4(-1.0, 0.0, -0.5, 1.0), vec4(-0.5, 0.0, -0.5, 1.0), vec4( 0.5, 0.0, -0.5, 1.0), vec4( 1.0, 0.0, -0.5, 1.0), vec4(-1.0, 0.0, 0.5, 1.0), vec4(-0.5, 0.0, 0.5, 1.0), vec4( 0.5, 0.0, 0.5, 1.0), vec4( 1.0, 0.0, 0.5, 1.0), vec4(-1.0, -0.5, 1.0, 1.0), vec4(-0.5, 0.3, 1.0, 1.0), vec4( 0.5, 0.3, 1.0, 1.0), vec4( 1.0, 0.3, 1.0, 1.0));// 为当前顶点计算合适的纹理坐标,从[-1,+1]转换到[0,1]texCoord = vec2((vertices[gl_VertexID].x + 1.0) / 2.0, (vertices[gl_VertexID].z + 1.0) / 2.0); // 设置当前顶点的位置gl_Position = vertices[gl_VertexID];
}
1.4.3. 细分控制着色器(TCS)
#version 430
in vec2 texCoord[ ];
out vec2 texCoord_TCSout[ ]; // 以标量形式从顶点着色器传来的纹理坐标输出,以数组形式被接收,然后被发送给曲面细分评估着色器
uniform mat4 mvp_matrix;
layout (binding = 0) uniform sampler2D tex_color;
layout (vertices = 16) out; // 每个补丁有 16 个控制点
void main(void)
{ int TL = 32; // 曲面细分级别都被设置为 32 if (gl_InvocationID == 0) { gl_TessLevelOuter[0] = TL; gl_TessLevelOuter[2] = TL; gl_TessLevelOuter[1] = TL; gl_TessLevelOuter[3] = TL; gl_TessLevelInner[0] = TL; gl_TessLevelInner[1] = TL; } // 将纹理和控制点传递给曲面细分评估着色器texCoord_TCSout[gl_InvocationID] = texCoord[gl_InvocationID]; gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
1.4.4. 曲面细分评估着色器(TES)
#version 430
layout (quads, equal_spacing,ccw) in;
uniform mat4 mvp_matrix;
layout (binding = 0) uniform sampler2D tex_color;
in vec2 texCoord_TCSout[ ];
out vec2 texCoord_TESout; // 以标量形式传来的纹理坐标数组被一个个传出
void main (void)
{ vec3 p00 = (gl_in[0].gl_Position).xyz; vec3 p10 = (gl_in[1].gl_Position).xyz; vec3 p20 = (gl_in[2].gl_Position).xyz; vec3 p30 = (gl_in[3].gl_Position).xyz; vec3 p01 = (gl_in[4].gl_Position).xyz; vec3 p11 = (gl_in[5].gl_Position).xyz; vec3 p21 = (gl_in[6].gl_Position).xyz; vec3 p31 = (gl_in[7].gl_Position).xyz; vec3 p02 = (gl_in[8].gl_Position).xyz; vec3 p12 = (gl_in[9].gl_Position).xyz; vec3 p22 = (gl_in[10].gl_Position).xyz; vec3 p32 = (gl_in[11].gl_Position).xyz; vec3 p03 = (gl_in[12].gl_Position).xyz; vec3 p13 = (gl_in[13].gl_Position).xyz; vec3 p23 = (gl_in[14].gl_Position).xyz; vec3 p33 = (gl_in[15].gl_Position).xyz; float u = gl_TessCoord.x; float v = gl_TessCoord.y; // 立方贝塞尔基础函数float bu0 = (1.0-u) * (1.0-u) * (1.0-u); // (1-u)^3 float bu1 = 3.0 * u * (1.0-u) * (1.0-u); // 3u(1-u)^2 float bu2 = 3.0 * u * u * (1.0-u); // 3u^2(1-u)float bu3 = u * u * u; // u^3 float bv0 = (1.0-v) * (1.0-v) * (1.0-v); // (1-v)^3 float bv1 = 3.0 * v * (1.0-v) * (1.0-v); // 3v(1-v)^2 float bv2 = 3.0 * v * v * (1.0-v); // 3v^2(1-v) float bv3 = v * v * v; // v^3 // 输出曲面细分补丁中的顶点位置vec3 outputPosition = bu0 * ( bv0*p00 + bv1*p01 + bv2*p02 + bv3*p03 ) + bu1 * ( bv0*p10 + bv1*p11 + bv2*p12 + bv3*p13 ) + bu2 * ( bv0*p20 + bv1*p21 + bv2*p22 + bv3*p23 ) + bu3 * ( bv0*p30 + bv1*p31 + bv2*p32 + bv3*p33 ); gl_Position = mvp_matrix * vec4(outputPosition,1.0f); // 输出插值过的纹理坐标vec2 tc1 = mix(texCoord_TCSout[0], texCoord_TCSout[3], gl_TessCoord.x); vec2 tc2 = mix(texCoord_TCSout[12], texCoord_TCSout[15], gl_TessCoord.x); vec2 tc = mix(tc2, tc1, gl_TessCoord.y); texCoord_TESout = tc;
}
1.4.5. 片段着色器
// 片段着色器
#version 430
in vec2 texCoord_TESout;
out vec4 color;
uniform mat4 mvp_matrix;
layout (binding = 0) uniform sampler2D tex_color;
void main(void)
{ color = texture(tex_color, texCoord_TESout);
}
1.5. 参考
- 学习笔记完整代码下载
相关文章:
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 12.曲面细分
1. 曲面细分 曲面细分着色器(Tessellation Shader)是OpenGL 4.0及以上版本引入的一种可编程着色器阶段,用于在GPU上对几何体进行细分,将粗糙的多边形网格自动细分为更平滑、更精细的曲面。它主要用于实现高质量的曲面渲染&#x…...
8天Python从入门到精通【itheima】-14~16
目录 第二章学习内容总体预览: 14节-字面量: 1.学习目标:编辑 2.Python中6大常用数据类型: 3.实现:整数、浮点数、字符串类型的数据输出 4.字面量的定义: 5.小节总结 15节-注释: 1.le…...
Spring Boot 项目的计算机专业论文参考文献
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
linux线程基础
1. 什么是线程 进程是承担系统资源分配的基本实体,而线程(Thread)是进程内的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的地址空间和资源(如文件描述符、全局变量等&a…...
进阶-数据结构部分:3、常用查找算法
飞书文档https://x509p6c8to.feishu.cn/wiki/LRdnwfhNgihKeXka7DfcGuRPnZt 顺序查找 查找算法是指:从一些数据之中,找到一个特殊的数据的实现方法。查找算法与遍历有极高的相似性,唯一的不同就是查找算法可能并不一定会将每一个数据都进行访…...
JavaScript 中的 for...in 和 for...of 循环详解
在 JavaScript 中,for...in 和 for...of 是两种常用的循环结构,但它们有着不同的用途和行为。很多初学者容易混淆这两者,本文将详细解析它们的区别、适用场景以及注意事项。 目录 for…in 循环 基本用法遍历对象属性注意事项 for…of 循环 …...
【汇总】影视仓接口地址,影视仓最新配置接口【2025.5】
📦 TVBOX接口分类与制作加载指南 结合参考资料,整理TVBOX接口的核心分类、制作方法及加载技巧,助你快速上手! 🌐 一、接口分类 🌍 网络接口(远程URL) 特点:动态加载在线J…...
vue引用cesium,解决“Not allowed to load local resource”报错
vue引用cesium,解决“Not allowed to load local resource”报错TOC 工具 vscode node :v22.14.0npm :10.9.2vue:vue/cli 5.0.8 一、创建一个 Vue 3 项目 1.创建名为cesium_test的项目: vue create cesium_test2.…...
阿里云服务器跑模型教程
首先打开阿里云官网点击免费试用 选择250工时/月的免费仨月新人试用套餐 点击右上角主账号 选择人工智能平台PAI 然后选择交互式建模(DSW) 选择新建实例 起个名字 然后点击确定 点击打开 进入到命令行工具 下载MINIConda和对应的pytorch还有相关依赖库文件即可 然后上传…...
JavaScript入门【2】语法基础
1.JavaScript的引⼊⽅式(使用): 1.方式1:行内引用: 此种方式是将<font style"color:rgb(38,38,38);">JavaScript代码作为HTML标签的属性值使⽤,示例如下:</font><html lang"en"> <head><meta charset"UTF-8"><…...
调用DeepSeek系列模型问答时,输出只有</think>标签,而没有<think>标签
问题:调用DeepSeek系列模型问答时,输出结果缺少只有标签,而没有标签? DeepSeek官方有关说明 这里设置成这样是为了保证让模型的生成是以"<think>\n"开头的,然后开始思考过程,避免模型没…...
python:gimp 与 blender 两个软件如何协作?
GIMP(GNU Image Manipulation Program)和 Blender 是两个不同领域的开源工具,但它们在数字创作流程中常协同使用,以下是它们的主要联系和互补性: 1. 功能互补:2D 与 3D 的结合 GIMP 是专业的 2D 图像处理工…...
MMDetection环境安装配置
MMDetection 支持在 Linux,Windows 和 macOS 上运行。它需要 Python 3.7 以上,CUDA 9.2 以上和 PyTorch 1.8 及其以上。 MMDetection 至今也一直更新很多个版本了,但是对于最新的pytorch版本仍然不支持,我安装的时候仍然多次遇到m…...
【springboot+vue3的前后端分离项目实现支付宝的沙箱支付】
【springbootvue3的前后端分离项目实现支付宝的沙箱支付】 以下是基于SpringBoot Vue前后端分离项目实现支付宝沙箱支付的完整解决方案,包含关键代码和调试技巧 一、项目架构设计 二、后端实现(SpringBoot) 1. 添加依赖 <!-- pom.xml…...
基于Llama3的开发应用(二):大语言模型的工业部署
大语言模型的工业部署 0 前言1 ollama部署大模型1.1 ollama简介1.2 ollama的安装1.3 启动ollama服务1.4 下载模型1.5 通过API调用模型 2 vllm部署大模型2.1 vllm简介2.2 vllm的安装2.3 启动vllm模型服务2.4 API调用 3 LMDeploy部署大模型3.1 LMDeploy简介3.2 LMDeploy的安装3.3…...
MySQL只操作同一条记录也会死锁吗?
大家好,我是锋哥。今天分享关于【MySQL只操作同一条记录也会死锁吗?】面试题。希望对大家有帮助; MySQL里where条件的顺序影响索引使用吗? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中,死锁通常发生在多…...
Linux的静态库 共享库 进程 主函数的参数
1、库文件 库文件 库是一组预先编译好的方法的集合; Linux系统储存的位置一般在/lib和/usr/lib中 库的头文件放在/usr/include 库分类:静态库(libxxx.a)共享库(libxxx.so) 静态库 (1&#…...
软件设计师考试结构型设计模式考点全解析
结构型设计模式考点全解析 一、分值占比与考察趋势分析(75分制) 设计模式近5年平均分值考察频率趋势分析适配器模式3-5分高频保持稳定桥接模式2-3分中频略有上升组合模式4-6分高频持续重点装饰器模式3-4分高频稳定考察代理模式5-7分高频逐年增加外观模…...
Java-Objects类高效应用的全面指南
Java_Objects类高效应用的全面指南 前言一、Objects 类概述二、Objects 类的核心方法解析2.1 requireNonNull系列方法:空指针检查的利器2.2 equals方法:安全的对象比较2.3 hashCode方法:统一的哈希值生成2.4 toString方法:灵活的对…...
PostGIS实现栅格数据入库-raster2pgsql
raster2pgsql使用与最佳实践 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于将GDAL支持的栅格格式(如GeoTIFF、JPEG、PNG等)导入PostgreSQL数据库,支持批量加载、分块切片、创建空间索引及金字塔概览,是栅格数据入库的核心工具。 二、核心功能与典型用法 1…...
专题四:综合练习(组合问题的决策树与回溯算法)
以leetode77题为例 题目分析: 给一个数字n,你可以在1到n中选k个数字进行组合,注意包括1和n,而且通过观察实例 1,2和2,1是一样的,所以我们画决策树的时候,只需要从当前位置往后列举…...
从神经架构到万物自动化的 AI 革命:解码深度学习驱动的智能自动化新范式
目录 一、深度学习与 AI 自动化概述 二、深度学习核心技术解析 2.1 常见深度学习架构 2.2 关键算法 三、AI 自动化实践案例 3.1 图像分类自动化 3.2 自然语言处理自动化 —— 文本情感分析 编辑 五、自动化系统设计与实现 5.1 端到端自动化框架 5.2 自动化测试框架…...
3.5/Q1,GBD数据库最新文章解读
文章题目:Burden, trends, projections, and spatial patterns of lip and oral cavity cancer in Iran: a time-series analysis from 1990 to 2040 DOI:10.1186/s12889-025-22202-8 中文标题:伊朗唇癌和口腔癌的负担、趋势、预测和空间模式…...
智慧校园(含实验室)智能化专项汇报方案
该方案聚焦智慧校园(含实验室)智能化建设,针对传统实验室在运营监管、环境监测、安全管控、排课考勤等方面的问题,依据《智慧校园总体框架》等标准,设计数字孪生平台、实验室综合管理平台、消安电一体化平台三大核心平台,涵盖通信、安防、建筑设备管理等设施,涉及 395 个…...
玩转 AI · 思考过程可视化
玩转 AI 思考过程可视化 我们在开发 AI 的思维链 / 处理流时,难免遇到耗时较长的流程,如果遇到处理过慢的,用户什么也看不到可能丧失使用兴趣,对于这种情况,一个巧妙的产品思维就是呈现处理进度。 示例 其实完成这个页…...
hysAnalyser 从MPEG-TS导出ES功能说明
摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具。本文主要介绍了 hysAnalyser 从MPEG-TS 中导出选定的 ES 或 PES 功能(版本v1.0.003),以便用户知悉和掌握这些功能,帮助分析和解决各种遇到ES或PES相关的实际问题。hysAnalyser 支持主流的MP1/MP2/…...
[YOLO模型](4)YOLO V3的介绍
文章目录 YOLO V3一、模型思想二、模型性能三、改进的地方1. 三种scale2. scale变换经典方法3. 残差连接4. 核心网络架构(1) 结构(2) 输出与先验框关系 5. Logistic分类器替代Softmax 四、总结 YOLO V3 一、模型思想 作者 Redmon 又在 YOLOv2 的基础上做了一些改进:…...
期望是什么:(无数次的均值,结合概率)21/6=3.5
https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(无数次的均值,结合概率)21/6=3.5 一、期望(数学概念) 在概率论和统计学中,**期望(Expectation)**是一个核心概念,用于描述随机变量的长期平均取值,反映随机变量取值的集中趋势。 (一…...
Stacking(堆叠):集成学习中的“超级英雄团队”
在机器学习的世界里,如果要找一个类似漫威“复仇者联盟”的存在,那么**Stacking(堆叠)**无疑是最佳候选人。就像钢铁侠、美国队长和雷神各自拥有独特的能力,但只有当他们组队时才能发挥出惊人的战斗力,Stac…...
手写tomcat:基本功能实现(3)
TomcatRoute类 TomcatRoute类是Servlet容器,是Tomcat中最核心的部分,其本身是一个HashMap,其功能为:将路径和对象写入Servlet容器中。 package com.qcby.config;import com.qcby.Util.SearchClassUtil; import com.qcby.servlet…...
nt!MiRemovePageByColor函数分析之脱链和刷新颜色表
第0部分:背景 PFN_NUMBER FASTCALL MiRemoveZeroPage ( IN ULONG Color ) { ASSERT (Color < MmSecondaryColors); Page FreePagesByColor[Color].Flink; if (Page ! MM_EMPTY_LIST) { // // Remove the first entry on the zeroe…...
时间筛掉了不够坚定的东西
2025年5月17日,16~25℃,还好 待办: 《高等数学1》重修考试 《高等数学2》备课 《物理[2]》备课 《高等数学2》取消考试资格学生名单 《物理[2]》取消考试资格名单 职称申报材料 2024年税务申报 5月24日、25日监考报名 遇见:敲了一…...
3D个人简历网站 4.小岛
1.模型素材 在Sketchfab上下载狐狸岛模型,然后转换为素材资源asset,嫌麻烦直接在网盘链接下载素材, Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…...
第十一课 蜗牛爬树
上次作业 同学们课后可以尝试找一下30以内,哪个整数有最多的因数呢? 这个整数有多少个因数呢? 最好使用程序来进行判断哦 int main() {int max_num 1; // 记录因数最多的数int max_count 1; // 记录最大因数个数for (int num 2; num <…...
字体样式集合
根据您提供的字体样式列表,以下是分类整理后的完整字体样式名称(不含数量统计): 基础样式 • Regular • Normal • Plain • Medium • Bold • Black • Light • Thin • Heavy • Ultra • Extra • Semi • Hai…...
Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?
Spring MVC 处理文件上传主要依赖于 MultipartResolver 接口及其实现。最常用的实现是 CommonsMultipartResolver(基于 Apache Commons FileUpload)和 StandardServletMultipartResolver(基于 Servlet 3.0 API)。 以下是如何配置…...
探索C++对象模型:(拷贝构造、运算符重载)成员函数的深度解读(中篇)
前引:在C的面向对象编程中,对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据,还是资源管理如何自动化,其底层机制均围绕两个关键概念展开:拷贝复制、取地址重载成员函数。它们如同对象的“隐形守护者”&…...
[逆向工程]C++实现DLL注入:原理、实现与防御全解析(二十五)
[逆向工程]C实现DLL注入:原理、实现与防御全解析(二十五) 引言 DLL注入(DLL Injection)是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案&#x…...
gcc/g++常用参数
1.介绍 gcc用于编译c语言,g用于编译c 源代码生成可执行文件过程,预处理-编译-汇编-链接。https://zhuanlan.zhihu.com/p/476697014 2.常用参数说明 2.1编译过程控制 参数作用-oOutput,指定输出名字-cCompile,编译源文件生成对…...
51单片机课设基于GM65模块的二维码加条形码识别
系统组成 主控单元:51单片机(如STC89C52)作为核心控制器,协调各模块工作。 扫描模块:GM65条码扫描头,支持二维码/条形码识别,通过串口(UART)与单片机通信。 显示模块&a…...
物联网赋能7×24H无人值守共享自习室系统设计与实践!
随着"全民学习"浪潮的兴起,共享自习室市场也欣欣向荣,今天就带大家了解下在物联网的加持下,无人共享自习室系统的设计与实际方法。 一、物联网系统整体架构 1.1 系统分层设计 层级技术组成核心功能用户端微信小程序/H5预约选座、…...
基于多头自注意力机制(MHSA)增强的YOLOv11主干网络—面向高精度目标检测的结构创新与性能优化
深度学习在计算机视觉领域的快速发展推动了目标检测算法的持续进步。作为实时检测框架的典型代表,YOLO系列凭借其高效性与准确性备受关注。本文提出一种基于多头自注意力机制(Multi-Head Self-Attention, MHSA)增强的YOLOv11主干网络结构,旨在提升模型在…...
使用Spring Boot与Spring Security构建安全的RESTful API
使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中,安全性是不可忽视的重要环节。Spring Boot和Spring Security作为Java生态中的主流框架,为开发者提供了强大的工具来构建安全的RESTful API。本文将详细介绍如何结合S…...
小刚说C语言刷题—1230蝴蝶结
1.题目描述 请输出 n 行的蝴蝶结的形状,n 一定是一个奇数! 输入 一个整数 n ,代表图形的行数! 输出 n 行的图形。 样例 输入 9 输出 ***** **** *** ** * ** *** **** ***** 2.参考代码(C语言版)…...
利用SenseGlove触觉手套开发XR手术训练体验
VirtualiSurg和VR触觉 作为领先的培训平台,VirtualiSurg自2017年以来一直利用扩展现实 (XR) 和触觉技术,为全球医疗保健行业提供个性化、数据驱动的学习解决方案。该平台赋能医疗专业人员进行协作式学习和培训,提升他们的技能,使…...
CT重建笔记(五)—2D平行束投影公式
写的又回去了,因为我发现我理解不够透彻,反正想到啥写啥,尽量保证内容质量好简洁易懂 2D平行束投影公式 p ( s , θ ) ∫ ∫ f ( x , y ) δ ( x c o s θ y s i n θ − s ) d x d y p(s,\theta)\int \int f(x,y)\delta(x cos\theta ysi…...
【Java】应对高并发的思路
在Java中应对高并发场景需要结合多方面的技术手段和设计模式,从线程管理、数据结构、同步机制到异步处理、IO优化等,都需要合理设计和配置。以下是Java在高并发场景下的主要应对策略和最佳实践: 1. 线程管理 1.1 线程池(ThreadPo…...
从数据分析到数据可视化:揭开数据背后的故事
从数据分析到数据可视化:揭开数据背后的故事 大家好,今天咱们聊聊“从数据分析到数据可视化”的完整流程。说实话,数据分析和可视化这俩词听起来高大上,但咱们平时就是围绕这俩词打转——数据分析帮我们找故事,可视化则帮我们讲故事。没有它们,数据就是死的;有了它们,数…...
WPS JS宏实现去掉文档中的所有空行
WPS改造系列文章: 1.在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程:在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程_wps javascript-CSDN博客 2.在WPS中通过JavaScrip…...
【2025年软考中级】第一章1.6 安全性、可靠性、性能评价
文章目录 安全性、可靠性、性能评价计算机可靠性可靠性指标串并联系统可靠性并联系统可靠性N模元余系统 计算机系统性能评价信息安全加密技术对称(私钥)加密技术非对称加密技术(公钥)对称和非对称加密算法的区别数字信封原理数字签…...