GLSL(OpenGL 着色器语言)基础语法
GLSL(OpenGL 着色器语言)基础语法
GLSL(OpenGL Shading Language)是 OpenGL 计算着色器的语言,语法类似于 C 语言,但提供了针对 GPU 的特殊功能,如向量运算和矩阵运算。
着色器的开头总是要声明版本,接着是输入和输出变量、uniform 和 main 函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。
#version version_number
in type in_variable_name;
out type out_variable_name;
uniform type uniform_name;void main()
{// 处理输入并进行一些图形操作...// 输出处理过的结果到输出变量out_variable_name = weird_stuff_we_processed;
}
基本语法
版本声明
每个 GLSL 着色器的第一行通常需要指定版本号:
#version 330 core // 330 core 表示使用 OpenGL 3.3 及以上的核心模式
#version 120 // OpenGL 2.1
#version 450 core(OpenGL 4.5 // OpenGL 4.5
变量声明
类型 变量名;
常见的基本数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| int | 整数 | int a = 5; |
| float | 浮点数 | float b = 3.14; |
| bool | 布尔类型 | bool flag = true; |
| vec2 | 2D向量 (x, y) | vec2 v = vec2(1.0, 2.0); |
| vec3 | 3D向量 (x, y, z) | vec3 color = vec3(1.0, 0.5, 0.2); |
| vec4 | 4D向量 (x, y, z, w) | vec4 position = vec4(1.0, 2.0, 3.0, 1.0); |
| mat4 | 4×4 矩阵 | mat4 transform; |
纹理类型(Texture Types)
纹理类型用于表示不同的纹理对象,它们在图形渲染中用于存储图片或纹理数据
| 类型 | 说明 |
|---|---|
| sampler2D | 2D纹理采样器,通常用于访问2D纹理图像 |
| sampler3D | 3D纹理采样器,用于访问3D纹理 |
| samplerCube | 立方体纹理采样器,用于访问立方体贴图(环境映射) |
| sampler2DArray | 2D纹理数组采样器,访问多个2D纹理层 |
| sampler2DShadow | 用于阴影映射的2D纹理采样器 |
| samplerCubeShadow | 用于阴影映射的立方体纹理采样器 |
纹理采样示例
#version 330 corein vec2 TexCoords; // 传入的纹理坐标
out vec4 FragColor;// 输出的颜色uniform sampler2D texture1; // 纹理变量,代表 GPU 采样的 2D 贴图void main()
{FragColor = texture(texture1, TexCoords); // 从纹理中获取颜色,并输出
}
uniform关键字:uniform 变量用于在 C++ 代码和 Shader 之间传递数据。
与 in/out 不同,uniform 是全局变量,在着色器的所有调用中都保持相同的值。
聚合类型(Aggregate Types)
这些类型可以用来组合多个基本类型,提供更复杂的数据结构。
(1)数组类型(Array types):
float arr[10]; // 一个包含 10 个 float 的数组。
vec3 arr[5]; // 一个包含 5 个 vec3 向量的数组。
(2)结构体类型(Structure types):
sstruct Light {vec3 position;vec3 color;float intensity;
};
内置变量类型(Built-in Variables)
OpenGL着色器程序中预定义的变量,用于接收从应用程序传递的状态或传递给其他着色器阶段的值。
(1)顶点着色器中常见的内建变量
| 变量 | 说明 |
|---|---|
| gl_Position | 指定当前顶点的屏幕空间位置。它是 vec4 类型,必须在顶点着色器中设置 |
| gl_PointSize | 指定绘制点的大小(只有在 GL_POINTS 绘制模式时有效) |
| gl_VertexID | 当前顶点的索引 |
(2)片元着色器中常见的内建变量
| 变量 | 说明 |
|---|---|
| gl_FragColor | 最终输出的颜色。片元着色器必须设置它来确定每个像素的颜色 |
| gl_FragDepth | 指定片元的深度值 |
(3)全局变量
| 变量 | 说明 |
|---|---|
| gl_FragCoord | 片元着色器中的当前片元坐标 |
| gl_TexCoord | 纹理坐标,用于在片元着色器中进行纹理采样 |
向量操作
GLSL 提供了一些专门用于向量操作的语法
vec3 v1 = vec3(1.0, 2.0, 3.0);
vec3 v2 = vec3(0.5, 0.5, 0.5);vec3 sum = v1 + v2; // 向量加法
vec3 diff = v1 - v2; // 向量减法
vec3 scale = v1 * 2.0; // 向量数乘
float dotProduct = dot(v1, v2); // 点积
vec3 crossProduct = cross(v1, v2); // 叉积
向量分量访问
vec4 color = vec4(1.0, 0.5, 0.2, 1.0);
float red = color.r; // red = 1.0
float green = color.g; // green = 0.5
float blue = color.b; // blue = 0.2
float alpha = color.a; // alpha = 1.0
xyzw 和 rgba 可以混用
vec3 rgb = color.rgb; // 取前三个分量
vec2 xy = color.xy; // 取前两个分量
矩阵运算
mat4 transform = mat4(1.0); // 4×4 单位矩阵
vec4 position = vec4(1.0, 2.0, 3.0, 1.0);
vec4 result = transform * position; // 矩阵-向量乘法
GLSL 变量限定符
GLSL 提供了不同的变量限定符,决定变量的作用范围和生命周期
(1)变量存储限定符(Storage Qualifiers)
| 限定符 | 作用 | 适用着色器 |
|---|---|---|
| in | 输入变量,从上一阶段着色器传入的数据 | 顶点、片元着色器 |
| out | 输出变量,传递给下一阶段着色器 | 顶点、片元着色器 |
| inout | 既可作为输入,也可作为输出 | |
| uniform | 全局变量,供 CPU 传入着色器,所有着色器阶段共享 | 顶点、片元着色器 |
| attribute | 旧版 GLSL(< 3.3),用于顶点着色器的输入变量,已被 in 取代 | 顶点着色器 |
| varying | 旧版 GLSL(< 3.3),用于顶点着色器和片元着色器之间传递数据,已被 in 和 out 取代 | 顶点、片元着色器 |
| const | 常量,在编译时确定,不能修改 | |
| buffer | 访问 Shader Storage Buffer Object(SSBO),用于计算着色器 |
uniform
首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。
代码示范
(1)在着色器中使用 uniform 关键字,并带上类型和名称。
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor;void main() {FragColor = ourColor;
}
(2)在OpenGL程序代码中设置这个变量
float timeValue = glfwGetTime();
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;// 利用时间动态计算颜色或效果
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");// 查询uniform ourColor的位置值
glUseProgram(shaderProgram);// 激活指定的着色器程序
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);// 设置uniform值
QT代码示范
Qt 封装了glGetUniformLocation(),提供了uniformLocation()。
// 获取 uniform 变量的位置
int location = shaderProgram.uniformLocation("ourColor");
if (location != -1) {shaderProgram.setUniformValue(location, QVector4D(0.0f, 1.0f, 0.0f, 1.0f));// 设置uniform值
}
或者,在QOpenGLShaderProgram中,甚至不需要手动获取Location,可以直接使用setUniformValue(),它会自动查找uniformLocation()并设置值😃:
shaderProgram.setUniformValue("ourColor", QVector4D(0.0f, 1.0f, 0.0f, 1.0f));
总结
uniform变量用于在 程序(CPU)和 着色器(GPU)之间传递数据。uniform变量的值在渲染迭代中保持不变,直到显式地更新。可以用于传递光照、变换、时间等不随顶点或片段变化的参数。
“渲染迭代”是指每次绘制调用,每次调用glDrawArrays或 glDrawElements等函数时,都会渲染一批图形。在一次渲染调用中,uniform变量的值是固定的,直到显式地改变它。
(2)变量布局限定符(Layout Qualifiers)
| 关键字 | 作用 |
|---|---|
| layout(location = N) | 指定变量的绑定位置(常用于 in/out 变量) |
| layout(binding = N) | 指定 uniform buffer、采样器的绑定点 |
| layout(origin_upper_left) | 设定坐标原点在左上角(用于片元着色器) |
| layout(pixel_center_integer) | 指定像素中心对齐规则 |
(3)变量精度限定符(Precision Qualifiers)
| 关键字 | 作用 |
|---|---|
| highp | 高精度(32 位浮点数) |
| mediump | 中精度(16 位浮点数) |
| lowp | 低精度(10 位或 8 位浮点数) |
在 OpenGL ES(移动端)上,必须显式声明精度,但桌面版 GLSL 默认 highp。
(4)插值限定符(Interpolation Qualifiers)
| 关键字 | 作用 |
|---|---|
| smooth | 默认插值方式(透视校正插值) |
| flat | 禁用插值,所有片元使用同一顶点的值 |
| noperspective | 线性插值(无透视校正) |
(5)片元着色器输出限定符(Fragment Shader Output Qualifiers)
| 关键字 | 作用 |
|---|---|
| discard | 丢弃当前片元,不进行颜色写入 |
| depth_any | 允许片元写入任何深度值 |
| depth_greater | 片元只能写入更大的深度值 |
| depth_less | 片元只能写入更小的深度值 |
渲染管线的基本流程
OpenGL 渲染管线是一个从顶点数据到最终像素颜色输出的流水线处理过程,主要分为以下几个阶段:

(1)应用阶段(CPU端)
1️⃣ 准备数据(VAO、VBO、EBO、Shader、Texture)
2️⃣设置状态(glEnable(GL_DEPTH_TEST) 等)
3️⃣执行绘制(glDrawArrays() / glDrawElements())
👉GPU 端(渲染管线)
(2)顶点着色器(Vertex Shader)
运行在 GPU 上,对每个顶点执行一次。
关键任务
处理顶点数据(如顶点坐标、颜色、法线、纹理坐标) 。
计算 顶点的最终位置(gl_Position),将物体坐标系转换为相机坐标系(裁剪空间),渲染相机范围内的物体。
计算并输出其他顶点属性:颜色、纹理坐标等数据,以传递给下一阶段。
输入:
(1)顶点数据:顶点的位置、法线、颜色、纹理坐标等,这些数据通常保存在顶点缓冲对象(VBO)中。
(2)顶点着色器的输入变量:包括位置、法线、颜色等,通过layout关键字来指定。
处理:
(1)顶点坐标变换:
使用 模型矩阵(Model Matrix):将顶点从模型空间转换到世界空间。
使用 视图矩阵(View Matrix):将顶点从世界空间转换到相机空间,通常相当于相机的视图矩阵。
使用投影矩阵(Projection Matrix):将顶点从相机空间转换到裁剪空间,通常有两种类型的投影:
1)正交投影(Orthographic projection)
2)透视投影(Perspective projection)
| 特性 | 正交投影(Orthographic Projection) | 透视投影Perspective Projection) |
|---|---|---|
| 投影线 | 平行 | 收敛(有消失点) |
| 物体大小 | 不受视距影响,距离远近无关 | 物体距离远,投影变小;距离近,投影变大 |
| 深度感 | 无深度感,所有物体看起来是平的 | 有深度感,远近物体具有明显的大小差异 |
| 常见应用 | 2D 游戏、CAD、技术图纸 | 3D 游戏、虚拟现实、电影动画 |
| 适用场景 | 精确的比例和尺寸绘制(如建筑图纸、设计图纸) | 创建真实的场景深度感,模拟人眼视角 |
| 投影效果 | 所有物体大小一致,不会变形 | 物体随着距离远近而缩小或放大,产生透视效果 |
(2)法线变换:
法线需要从模型空间变换到世界空间或视图空间,通常要用到模型矩阵的逆转置矩阵来正确处理缩放等非线性变换,以防止模型缩放影响法线的方向。
(3)顶点属性计算:
顶点着色器可以根据顶点的其他属性(如法线、颜色、纹理坐标)来计算光照、颜色等值,传递给片段着色器。
输出:
(1)gl_Position:这是裁剪空间中的顶点位置,是后续阶段(如光栅化)裁剪的基础。
(2)gl_PointSize:在绘制点时,控制点的大小。
(3)gl_ClipDistance:用于顶点裁剪的距离参数。
(4)其他顶点属性(如颜色、法线、纹理坐标等)可以输出到后续的片段着色器。
代码示例
#version 330 corelayout (location = 0) in vec3 aPos; // 传入顶点位置(绑定顶点位置到 location = 0)
layout (location = 1) in vec3 aColor; // 传入顶点颜色
layout (location = 2) in vec3 inNormal; // 顶点法线out vec3 vColor; // 传递给片元着色器的颜色
out vec3 fragNormal; // 法线,传递给片段着色器uniform mat4 model; // 模型矩阵
uniform mat4 view; // 视图矩阵
uniform mat4 projection; // 投影矩阵void main()
{// 将法线从模型空间变换到世界空间fragNormal = mat3(transpose(inverse(model))) * inNormal;gl_Position = projection * view * model * vec4(aPos, 1.0); // 计算最终的顶点位置,并赋值给 gl_PositionvColor = aColor; // 颜色传递给片元着色器
}
layout(location = n) 解释
layout(location = n) 用来指定顶点属性的绑定位置 n。这个 n 位置是在OpenGL中通过glVertexAttribPointer或glVertexAttribPointer函数指定的。
(1)为了明确匹配顶点数据和着色器变量
顶点着色器需要使用 特定位置的属性 来获得顶点数据,例如顶点位置、颜色或纹理坐标。通过 layout(location = n),可以明确告诉 OpenGL 每个顶点属性的输入顺序和位置索引。避免因顺序错误或不一致导致数据混乱的问题。
(2) 对于多属性的支持
当你顶点数据包含多个属性时,如:位置、颜色、法线、纹理坐标等,需要为每个属性指定一个独立的 location,确保 OpenGL 正确地将数据传递给着色器。
在QT中写法如下:
👉 顶点数据的位置索引(n)必须和着色器中声明的 layout(location = n) 对应。
gl_Position的解释
gl_Position是OpenGL中一个非常特殊的内部变量,其类型是 vec4(四维向量),包含了顶点在三维空间中的位置以及齐次坐标的 w 分量。
vec4 gl_Position = vec4(x, y, z, w);
gl_Position定义了 顶点在裁剪空间中的位置,位于投影变换后的空间。
gl_Position作用: 当顶点着色器的输出 gl_Position 被送入裁剪阶段和光栅化阶段后,OpenGL 会进行裁剪和透视除法:
- 裁剪:将视野外的顶点丢弃,只保留视野内的顶点。
- 透视除法:通过除以 gl_Position.w 来将顶点从裁剪空间转换为屏幕空间,得到最终的窗口坐标。
注:裁剪阶段和光栅化阶段是OpenGL渲染管线中的固定阶段,由OpenGL内部自动处理。
在上面的示例中,aPos 是传入的顶点坐标。我们将模型矩阵、视图矩阵和投影矩阵与 aPos 相乘,最终得到顶点的位置,并赋值给 gl_Position。
(3)图元装配
将顶点组合成 点(Point)、线(Line)、三角形(Triangle)。
(4)细分着色器(Tessellation Shader,可选)
用于将少量控制点细分成更多的几何数据,以生成更精细的模型(如地形细节)。
细分控制着色器(Tessellation Control Shader, TCS)
细分评估着色器(Tessellation Evaluation Shader, TES)
细分曲面,提高模型精度
(5)几何着色器(Geometry Shader,可选)
运行在 GPU 上,以整个图元(如点、线段、三角形)为单位进行处理,而不是单独处理每个顶点。
关键任务
修改或生成新的顶点(如扩展为线段或面)。
可以输出多个顶点来生成新的几何形状。
继续传递颜色、纹理坐标等数据。
代码示例
#version 330 core
layout(triangles) in; // 输入图元类型(三角形)
layout(triangle_strip, max_vertices = 3) out; // 输出图元类型(三角形条带)in vec3 vColor[]; // 从顶点着色器接收颜色数据
out vec3 fColor; // 传递给片元着色器void main()
{for (int i = 0; i < 3; i++) // 处理每个输入顶点{gl_Position = gl_in[i].gl_Position; // 继承输入顶点的位置信息fColor = vColor[i]; // 继承颜色信息EmitVertex(); // 输出该顶点}EndPrimitive(); // 结束当前图元
}
(6)光栅化(Rasterization)
将顶点数据转换为像素点(片元),并决定哪些像素应该被绘制填充。以顶点为边界,中间做插值运算,填充像素点。
(7)片元着色器(Fragment Shader)
运行在 GPU 上,对每个片元(像素)执行一次。
关键任务
纹理采样:从纹理的像素 赋值给上一阶段产生的像素点上;
计算最终颜色(纹理、光照、阴影、颜色混合计算);
输出颜色给帧缓冲
【注】假若,顶点着色器4个,到了光栅化,插值后为100 100,那么到了片段着色器,则会进行100 * 100次运算。所以,在这个阶段的运算量是指数级增长。故能在顶点着色器运算的,就不要放到片段着色器中运算,大大影响效率。
代码示例
#version 330 core
in vec3 vColor; // 从顶点着色器传入的颜色
//in vec3 fColor; // 从几何着色器接收颜色
out vec4 FragColor; // 输出最终颜色void main()
{FragColor = vec4(vColor, 1.0); // 计算最终颜色// FragColor = vec4(fColor, 1.0); // 计算最终颜色
}
注意:顶点着色器输出的变量和片元着色器输入的变量的名称必须一致!
顶点着色器的输出变量(out 变量)会作为输入传递给片元着色器(in 变量)。OpenGL会自动匹配具有相同名称的变量,从而使得顶点着色器的输出可以作为片元着色器的输入。
在OpenGL渲染管线中,着色器阶段之间的数据传递是通过 变量名称、类型和顺序 来确保一致性的。通常,顶点着色器的输出(out 变量)会作为下游阶段(如片元着色器或几何着色器)的输入(in 变量)。确保变量名称、类型和顺序一致是实现数据正确传递的关键。
(8)测试与混合
深度测试(Depth Test) → 确保正确的遮挡关系。
模板测试(Stencil Test) → 实现裁剪效果。
混合(Blending) → 处理透明度,如 glEnable(GL_BLEND)。
(9)Framebuffer帧缓冲
最终颜色数据被写入帧缓冲区(Framebuffer),并显示到屏幕上。帧缓冲有个地址,是在内存里。我们通过不停的向Framebuffer中写入数据, 显示控制器就自动的从Framebuffer中取数据并显示出来。
多个着色器都可以输出颜色?
顶点着色器:负责处理每个顶点的颜色,并传递给几何着色器或片元着色器。
几何着色器:(如果存在) 可以修改顶点的颜色并重新输出给片元着色器。
片元着色器: 计算最终的像素颜色,并写入帧缓冲区。
总结
✅GLSL语法类似C语言,但更适合GPU并行计算。
✅顶点着色器主要进行坐标变换。
✅片元着色器主要计算像素颜色。
✅变量修饰符 in、out、uniform 控制数据流。
✅向量、矩阵 计算是GLSL 的核心,优化GPU性能。
相关文章:
GLSL(OpenGL 着色器语言)基础语法
GLSL(OpenGL 着色器语言)基础语法 GLSL(OpenGL Shading Language)是 OpenGL 计算着色器的语言,语法类似于 C 语言,但提供了针对 GPU 的特殊功能,如向量运算和矩阵运算。 着色器的开头总是要声明…...
Redis基础知识-3
RedisTemplate对多种数据结构的操作 1. String类型 示例代码: // 保存数据 redisTemplate.opsForValue().set("user:1001", "John Doe"); // 设置键值对,无过期时间 redisTemplate.opsForValue().set("user:1002", &qu…...
Git Rebase 操作中丢失提交的恢复方法
背景介绍 在团队协作中,使用 Git 进行版本控制是常见实践。然而,有时在执行 git rebase 或者其他操作后,我们可能会发现自己的提交记录"消失"了,这往往让开发者感到恐慌。本文将介绍几种在 rebase 后恢复丢失提交的方法。 问题描述 当我们执行以下操作时,可能…...
【diffusers 进阶(十五)】dataset 工具,Parquet和Arrow 数据文件格式,load dataset 方法
系列文章目录 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数【diffusers极速入门࿰…...
unity各个面板说明
游戏开发,unity各个面板说明 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介-unity基础…...
游戏引擎学习第199天
回顾并发现我们可能破坏了某些东西 目前,我们的调试 UI 运行得相对顺利,可以创建可修改的调试变量,也可以插入分析器(profiler)等特殊视图组件,并进行一些交互操作。然而,在上一次结束时&#…...
Linux红帽:RHCSA认证知识讲解(十)使用 tar创建归档和压缩文件
Linux红帽:RHCSA认证知识讲解(十)使用 tar创建归档和压缩文件 前言一、归档与压缩的基本概念1.1 归档与压缩的区别 二、使用tar创建归档文件2.1 tar命令格式2.2 示例操作 三、使用tar进行压缩3.2 命令格式3.3 示例操作 前言 在红帽 Linux 系…...
端到端机器学习流水线(MLflow跟踪实验)
目录 端到端机器学习流水线(MLflow跟踪实验)1. 引言2. 项目背景与意义2.1 端到端机器学习流水线的重要性2.2 MLflow的作用2.3 工业级数据处理需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 机器学习流水线与MLflow跟踪4.1 端到端机器学习流水线4.2 MLflow跟踪实验…...
相平面案例分析爱情故事
动态系统的分析可以分为三个步骤:第一步描述系统,通过语言来描述系统的特性,第一步描述系统,即通过语言来描述系统的特性;第二步数学分析,即使用数学工具对系统进行量化解析;第三步结果与讨论&a…...
《2024年全球DDoS攻击态势分析》
从攻击态势来看,2024年DDoS攻击频次继续呈增长趋势,2024年同步增加1.3倍;超大规模攻击激增,超800Gbps同比增长3.1倍,累计高达771次,且互联网史上最大带宽和最大包速率攻击均被刷新;瞬时泛洪攻击…...
RTC实时时钟M41T11M6F国产替代FRTC4111S
由NYFEA徕飞公司制造的FRTC4111S是一种低功耗的串行实时时钟(RTC),国产直接替代ST的M41T11M6F,其具有56字节的NVRAM,32.768 kHz振荡器(由外部晶体控制)和RAM的前8字节用于时钟/日历功能并以二进制编码十进制(BCD)格式配置。地址和数据通过两行双向总线串…...
Uni-app PDF Annotation plugin library online API examples
This article introduces the online version of the ElasticPDF API tutorial for the PDF annotation plug-in library in Uni-app projects. The API includes ① Export edited PDF data; ② Export annotations json data; ③ Reload old annotations; ④ Change files; ⑤…...
SpringKafka消息发布:KafkaTemplate与事务支持
文章目录 引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优化总结 引言 在现代分布式系统架构中,Apache Kafka作为高吞吐量的消息系统,被广泛应用于事件驱动应用开发。Spring Kafka为Java开发者提供了与Kafka交互…...
进行性核上性麻痹护理指南,助患者安稳生活
生活细致照料 安全保障:进行性核上性麻痹患者易出现平衡障碍、步态不稳,居家环境需格外留意安全。移除地面障碍物,保持通道畅通,在卫生间、走廊安装扶手,防止患者摔倒受伤。 饮食协助:患者常伴有吞咽困难&…...
提取嘉立创3D封装
嘉立创上元器件基本都有3D封装,当用AD或其他软件画PCB时,需要用到的3D封装可以从嘉立创EDA中提取。 首先新建工程,然后放置要提取3D封装的器件 导出-》3D文件 因为导出的文件中包含器件的3D封装和PCB板,需要把PCB板删除才能使用…...
工作记录 2017-03-24
工作记录 2017-03-24 序号 工作 相关人员 1 修改了邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了New User时 init的保存。 2、文件的查询加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的处理。 识别引擎监控 Ps (iCDA LOG :剔除…...
chromium魔改——修改 navigator.webdriver 检测
chromium源码官网 https://source.chromium.org/chromium/chromium/src 说下修改的chromium源码思路: 首先在修改源码过检测之前,我们要知道它是怎么检测的,找到他通过哪个JS的API来做的检测,只有知道了如何检测,我们…...
Qt 信号量使用方法
Qt 信号量使用方法 QSemaphore 类 常用函数介绍 函数名称函数功能QSemaphore()构造并初始化对象acquire()尝试获取n个资源,如果没有那么多资源,线程将阻塞直到有n个资源可用available()返回当前信号量可用的资源个数,这个数永远不可能为负…...
训练或微调以生成新组合结构
能通过训练或者微调,产生其它没有的组合的结构,比如有化学组成和空年组,想要生成指定化学成分指定空间组的结构,以下是针对需求的详细分析与实现思路,同时给出相应的 Python 代码示例。 1. 训练或微调以生成新组合结构…...
【通俗易懂说模型】生成对抗网络·GAN
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…...
容器适配器-stack栈
C标准库不只是包含了顺序容器,还包含一些为满足特殊需求而设计的容器,它们提供简单的接口。 这些容器可被归类为容器适配器(container adapter),它们是改造别的标准顺序容器,使之满足特殊需求的新容器。 适配器:也称配置器,把一…...
7-6 混合类型数据格式化输入
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。 输入格式: 输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。 输出格式: 在一行中…...
【UE5 C++课程系列笔记】31——创建Json并保存为文件
目录 方式一(不推荐) 方式二(推荐) 一、生成普通Json对象 二、对象嵌套对象 三、对象嵌套数组 四、对象嵌套数组再嵌套对象 方式一(不推荐) 如下代码实现了把JSON字符串保存到文件中 #include &qu…...
Photoshop 2025 Mac中文 Ps图像编辑软件
Photoshop 2025 Mac中文 Ps图像编辑软件 文章目录 Photoshop 2025 Mac中文 Ps图像编辑软件一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用,通过智能抠图、自动修复、图像…...
linux文件上传下载lrzsz
lrzsz 是一个在 Linux 系统中用于通过串行端口(如 ZMODEM、XMODEM、YMODEM 等协议)进行文件上传和下载的工具集。它通常用于在终端环境中通过串口或 SSH 连接传输文件。 安装 lrzsz 在大多数 Linux 发行版中,你可以使用包管理器来安装 lrzsz。 Debian/Ubuntu: sudo apt-ge…...
MySQL超全笔记
1、初识SQL 什么是数据库 数据库 ( DataBase , 简称DB ) 概念 : 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库” 作用 : 保存,并能安全管理数据(如:增删改查等),减少冗余… 数据库总览 : 关系型数据库 ( SQL ) MySQL , Oracle , SQL Server , SQ…...
使用Redis构架你自己的私有大模型
使用Redis构架你自己的私有大模型--楼兰 Redis你通常用来做什么?缓存?分布式锁?数据过滤器?不够不够,这远远不够。之前给大家分享过基于Redis Stack提供的一系列插件,完全可以把Redis作为一个类似于Elastic Search的JSON数据库使用。不光可以存储并操作JSON格式的数据…...
2.4路径问题专题:LeeCode 931.下降路径最小和
动态规划解决最小下降路径和问题 1. 题目链接 LeetCode 931. 最小下降路径和 2. 题目描述 给定一个 n x n 的整数矩阵 matrix,找到一条从第一行到最后一行的下降路径,使得路径上的数字和最小。下降路径可以从第一行的任意元素出发,每一步…...
从内核到应用层:Linux缓冲机制与语言缓冲区的协同解析
系列文章目录 文章目录 系列文章目录前言一、缓冲区1.1 示例11.2 缓冲区的概念 二、缓冲区刷新方案三、缓冲区的作用及存储 前言 上篇我们介绍了,文件的重定向操作以及文件描述符的概念,今天我们再来学习一个和文件相关的知识-----------用户缓冲区。 在…...
【AI News | 20250403】每日AI进展
AI Repos 1、llm-server-docs 项目提供了一份基于Debian系统的本地语言模型服务器搭建指南,适用于Linux初学者。教程涵盖驱动安装、GPU功耗设置、自动登录配置及开机自启脚本部署等关键步骤,支持Ollama/vLLM等多种OpenAI兼容方案。方案设计强调四大原则…...
