openGL高级光照部分目录 见 openGL高级光照部分目录

阴影是由于遮挡而缺少灯光的结果。当一个光源的光线没有击中一个物体,因为它被其他物体挡住了,这个物体就处于阴影中。阴影为照亮的场景添加了大量的真实感,使观看者更容易观察对象之间的空间关系。它们给我们的场景和物体以更大的深度感。例如,请查看具有和不包含阴影的场景的以下图像:

你可以看到,有了阴影,物体之间的关系变得更加明显。例如,一个立方体漂浮在其他立方体之上的事实,只有当我们有阴影时才真正明显。

阴影的实现有点棘手,特别是在当前的实时(光栅化图形)研究中,还没有一个完美的阴影算法被开发出来。有几种很好的阴影近似技术,但它们都有一些我们必须考虑到的小怪癖和烦恼。

大多数视频游戏使用的一种技术是阴影映射,这种技术可以产生不错的效果,并且相对容易实现。阴影映射不太难理解,在性能上不需要太多成本,而且很容易扩展到更高级的算法中(如全向阴影贴图和级联阴影贴图)。

阴影映射

阴影贴图背后的想法非常简单:我们从灯光的角度渲染场景,我们从灯光透视看到的所有东西都被照亮了,我们看不到的东西必须在阴影中。想象一个地板部分,在它和光源之间有一个大盒子。因为光源会看到这个盒子,而不是地板部分,当朝它的方向看时,特定的地板部分应该在阴影中。

里所有的蓝线代表光源可以看到的碎片。被遮挡的碎片显示为黑线:这些线被渲染为阴影。如果我们能在光线击中容器之前,先从容器上画出一条光线。结果,浮动容器的碎片被照亮,最右边的容器碎片没有被照亮,因此处于阴影中。

我们要得到光线上第一次击中物体的点,并将这个最近的点与光线上的其他点进行比较。然后我们做一个基本测试,看看测试点的光线位置是否比最近的点更靠近光线,如果是,测试点必须在阴影中。迭代来自这样一个光源的数千条光线是一种非常低效的方法,并且不适合实时渲染。我们可以做类似的事情,但不需要投射光线。相反,我们使用我们非常熟悉的东西:深度缓冲。

您可能记得在深度测试一章中,深度缓冲区中的一个值对应于从相机角度钳制到[0,1]的碎片的深度。如果我们要从灯光的角度渲染场景并将结果深度值存储在纹理中会怎么样?这样,我们可以从灯光的透视图上采样最近的深度值。毕竟,深度值显示从灯光透视图可见的第一个片段。我们将所有这些深度值存储在一个称为深度贴图或阴影贴图的纹理中。

左图显示了一个平行光源(所有光线平行),在立方体下方的曲面上投射阴影。使用存储在深度图中的深度值,我们找到最近的点,并用它来确定碎片是否在阴影中。我们通过使用特定于该光源的视图和投影矩阵渲染场景(从灯光的透视图)来创建深度贴图。这个投影和视图矩阵一起形成了一个变换T,它将任何3D位置转换为灯光的(可见)坐标空间

平行光没有一个位置,因为它的模型是无限远的。但是,为了进行阴影贴图,我们需要从灯光的角度渲染场景,从而从沿着灯光方向的某个位置渲染场景。

在右图中,我们看到了相同的平行光和观察者。我们在点渲染一个片段,我们必须确定它是否在阴影中。为此,我们首先使用T将点转换为灯光的坐标空间。由于点现在可以从灯光的角度看到,因此其z坐标对应于其深度,在本例中为0.9。使用点我们还可以索引深度/阴影贴图,以从灯光的透视图获得最近的可见深度,即在采样深度为0.4的点C。由于索引深度贴图返回的深度小于点处的深度,我们可以得出结论:点被遮挡,因此处于阴影中。

因此,阴影贴图由两个过程组成:首先我们渲染深度贴图,在第二个过程中,我们将场景渲染为法线,并使用生成的深度贴图来计算碎片是否处于阴影中。这听起来有点复杂,但只要我们一步一步地走完这项技术,它就可能开始有意义了。

深度图

第一个过程需要我们生成一个深度图。深度贴图是从灯光透视图渲染的深度纹理,我们将使用它来测试阴影。因为我们需要将场景的渲染结果存储到纹理中,所以我们将再次需要帧缓冲区

首先,我们将创建用于渲染深度贴图的帧缓冲区对象:

unsigned int depthMapFBO;
glGenFramebuffers(1, &depthMapFBO); 

接下来,我们将创建一个2D纹理,用作帧缓冲区的深度缓冲区:

const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024;unsigned int depthMap;
glGenTextures(1, &depthMap);
glBindTexture(GL_TEXTURE_2D, depthMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

生成深度图看起来不应该太复杂。因为我们只关心深度值,所以我们将纹理的格式指定为GL_depth_COMPONENT。我们还为纹理指定1024的宽度和高度:这是深度贴图的分辨率。

使用生成的深度纹理,我们可以将其附加为帧缓冲区的深度缓冲区:

glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);  

我们只需要深度信息时,从灯光的角度渲染场景,因此不需要颜色缓冲区。但是,没有颜色缓冲区的帧缓冲区对象是不完整的,因此我们需要明确地告诉OpenGL我们不会渲染任何颜色数据。我们通过使用glDrawBuffer和glReadbuffer将read和draw buffer设置为GL_NONE。

使用正确配置的帧缓冲区将深度值渲染到纹理,我们可以开始第一个过程:生成深度贴图。当与第二个过程结合时,完整的渲染阶段看起来像这样:

// 1. first render to depth map
glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);glClear(GL_DEPTH_BUFFER_BIT);ConfigureShaderAndMatrices();RenderScene();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// 2. then render scene as normal with shadow mapping (using depth map)
glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ConfigureShaderAndMatrices();
glBindTexture(GL_TEXTURE_2D, depthMap);
RenderScene();

这段代码省略了一些细节,但是它将提供阴影映射的一般概念。这里需要注意的是对glViewport的调用。因为阴影贴图的分辨率通常与我们最初渲染场景的分辨率(通常是窗口分辨率)不同,所以我们需要更改视口参数以适应阴影贴图的大小。如果我们忘记更新视口参数,生成的深度贴图将不完整或太小。

光空间变换

前面代码片段中的一个未知项是ConfigureShaderAndMatrices函数。在第二个步骤中,一切照旧:确保设置了正确的投影和视图矩阵,并为每个对象设置了相关的模型矩阵。但是,在第一个过程中,我们需要使用不同的投影和视图矩阵从灯光的角度渲染场景。

因为我们要模拟一个定向光源,它所有的光线都是平行的。因此,我们将对没有透视变形的光源使用正交投影矩阵:

float near_plane = 1.0f, far_plane = 7.5f;
glm::mat4 lightProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane); 

这是本章演示场景中使用的正交投影矩阵示例。因为投影矩阵间接地决定了可见对象的范围(例如,未剪裁的对象),所以您需要确保投影视锥的大小正确地包含您希望在深度贴图中的对象。当对象或碎片不在深度贴图中时,它们不会产生阴影。

要创建一个视图矩阵来变换每个对象,使它们从灯光的角度可见,我们将使用臭名昭著的glm::lookAt函数;这一次,光源的位置指向场景的中心。

glm::mat4 lightView = glm::lookAt(glm::vec3(-2.0f, 4.0f, -1.0f), glm::vec3( 0.0f, 0.0f,  0.0f), glm::vec3( 0.0f, 1.0f,  0.0f));

将这两者结合起来,我们就得到了一个光空间变换矩阵,它将每个世界空间向量转换成从光源可见的空间;这正是我们渲染深度贴图所需的。

glm::mat4 lightSpaceMatrix = lightProjection * lightView;

glm::mat4 lightSpaceMatrix = lightProjection * lightView;

这个光空间矩阵是我们之前用T表示的变换矩阵。有了这个光空间矩阵,只要我们给每个着色器投影矩阵和视图矩阵的光空间等价物,我们就可以照常渲染场景。然而,我们只关心深度值,而不是所有昂贵的碎片(光照)计算。为了节省性能,我们将使用另一种更简单的着色器来渲染深度贴图。

渲染到深度贴图

当我们从灯光的角度渲染场景时,我们更希望使用一个简单的着色器,它只将顶点变换到灯光空间,而不是其他元素。对于这样一个名为simpleDepthShader的简单着色器,我们将使用以下顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;uniform mat4 lightSpaceMatrix;
uniform mat4 model;void main()
{gl_Position = lightSpaceMatrix * model * vec4(aPos, 1.0);
} 

该顶点着色器采用每对象模型、一个顶点,并使用lightSpaceMatrix将所有顶点变换为灯光空间。

由于我们没有颜色缓冲区并禁用了绘制和读取缓冲区,因此生成的片段不需要任何处理,因此我们可以简单地使用空片段着色器:

#version 330 corevoid main()
{             // gl_FragDepth = gl_FragCoord.z;
} 

此空片段着色器不进行任何处理,并且在其运行结束时更新深度缓冲区。我们可以通过取消注释它的一行来显式地设置深度,但无论如何,这实际上就是场景后面发生的事情。

渲染深度/阴影贴图现在有效地变成:

simpleDepthShader.use();
glUniformMatrix4fv(lightSpaceMatrixLocation, 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix));glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);glClear(GL_DEPTH_BUFFER_BIT);RenderScene(simpleDepthShader);
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

这里RenderScene函数接受一个着色器程序,调用所有相关的绘图函数,并在必要时设置相应的模型矩阵。

结果是一个很好填充的深度缓冲区,从灯光的角度保存每个可见片段的最近深度。通过将该纹理渲染到填充屏幕的2D四边形(类似于我们在帧缓冲区一章末尾的“后处理”部分中所做的操作),我们得到如下结果:

为了将深度贴图渲染到四边形上,我们使用了以下片段着色器:

#version 330 core
out vec4 FragColor;in vec2 TexCoords;uniform sampler2D depthMap;void main()
{             float depthValue = texture(depthMap, TexCoords).r;FragColor = vec4(vec3(depthValue), 1.0);
}  

请注意,使用透视投影矩阵而不是正交投影矩阵显示深度时会有一些细微的变化,因为使用透视投影时深度是非线性的。在本章的最后,我们将讨论这些细微的差异。

您可以在这里找到将场景渲染为深度贴图的源代码。

渲染阴影

使用正确生成的深度贴图,我们可以开始渲染实际的阴影。检查片段是否处于阴影中的代码(很明显)在片段着色器中执行,但我们在顶点着色器中执行灯光空间变换:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;out VS_OUT {vec3 FragPos;vec3 Normal;vec2 TexCoords;vec4 FragPosLightSpace;
} vs_out;uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform mat4 lightSpaceMatrix;void main()
{    vs_out.FragPos = vec3(model * vec4(aPos, 1.0));vs_out.Normal = transpose(inverse(mat3(model))) * aNormal;vs_out.TexCoords = aTexCoords;vs_out.FragPosLightSpace = lightSpaceMatrix * vec4(vs_out.FragPos, 1.0);gl_Position = projection * view * vec4(vs_out.FragPos, 1.0);
}

这里新增的是额外的输出向量FragPosLightSpace。我们使用相同的lightSpaceMatrix(用于在深度贴图阶段将顶点转换为灯光空间)并将世界空间顶点位置转换为灯光空间,以便在片段着色器中使用。

我们将用于渲染场景的主片段着色器使用Blinn Phong照明模型。然后在片段着色器中计算阴影值,该值在片段处于阴影时为1.0,而在不处于阴影中时为0.0。然后,生成的漫反射和高光组件将乘以该阴影组件。因为阴影很少是完全黑暗的(由于光散射),我们将环境光分量排除在阴影倍增之外

#version 330 core
out vec4 FragColor;in VS_OUT {vec3 FragPos;vec3 Normal;vec2 TexCoords;vec4 FragPosLightSpace;
} fs_in;uniform sampler2D diffuseTexture;
uniform sampler2D shadowMap;uniform vec3 lightPos;
uniform vec3 viewPos;float ShadowCalculation(vec4 fragPosLightSpace)
{[...]
}void main()
{           vec3 color = texture(diffuseTexture, fs_in.TexCoords).rgb;vec3 normal = normalize(fs_in.Normal);vec3 lightColor = vec3(1.0);// ambientvec3 ambient = 0.15 * color;// diffusevec3 lightDir = normalize(lightPos - fs_in.FragPos);float diff = max(dot(lightDir, normal), 0.0);vec3 diffuse = diff * lightColor;// specularvec3 viewDir = normalize(viewPos - fs_in.FragPos);float spec = 0.0;vec3 halfwayDir = normalize(lightDir + viewDir);  spec = pow(max(dot(normal, halfwayDir), 0.0), 64.0);vec3 specular = spec * lightColor;    // calculate shadowfloat shadow = ShadowCalculation(fs_in.FragPosLightSpace);       vec3 lighting = (ambient + (1.0 - shadow) * (diffuse + specular)) * color;    FragColor = vec4(lighting, 1.0);
}

碎片着色器很大程度上是我们在“高级照明”一章中使用的副本,但添加了阴影计算。我们声明了一个函数ShadowCalculation来完成大部分的阴影工作。在片段着色器的末尾,我们将漫反射和高光贡献乘以阴影组件的倒数,例如碎片不在阴影中的程度。此片段着色器将灯光空间片段位置和从第一个渲染过程生成的深度贴图作为额外输入。

要检查片段是否处于阴影中,首先要将片段空间中的灯光空间片段位置转换为规范化的设备坐标。当我们在顶点着色器中将剪辑空间的顶点位置输出到gl_Position时,OpenGL会自动进行透视分割,例如通过将x、y和z分量除以向量的w分量,来转换[-w,w]到[-1,1]范围内的剪辑空间坐标。由于片段空间FragPosLightSpace没有通过gl_Position传递给片段着色器,因此我们必须执行以下透视划分:

float ShadowCalculation(vec4 fragPosLightSpace)
{// perform perspective dividevec3 projCoords = fragPosLightSpace.xyz / fragPosLightSpace.w;[...]
}

这将返回片段在[-1,1]范围内的光空间位置。

当使用正交投影矩阵时,顶点的w分量保持不变,所以这一步实际上是毫无意义的。然而,当使用透视投影时,它是必要的,所以保持这条线可以确保它与两个投影矩阵一起工作。

因为深度图的深度在[0,1]范围内,而且我们还希望使用projCoords从深度图中采样,所以我们将NDC坐标转换为范围[0,1]:

projCoords = projCoords * 0.5 + 0.5;

使用这些投影坐标,我们可以采样深度贴图,因为projCoords生成的[0,1]坐标直接对应于第一次渲染过程中转换的NDC坐标。这给我们提供了从灯光角度看最接近的深度:

float closestDepth = texture(shadowMap, projCoords.xy).r;

为了得到这个碎片的当前深度,我们只需检索投影向量的z坐标,从灯光的角度来看,这个坐标等于碎片的深度。

float currentDepth = projCoords.z;

实际的比较只是检查currentDepth是否高于closestDepth,如果是,则片段处于阴影中:

float shadow = currentDepth > closestDepth  ? 1.0 : 0.0;  

然后,完整的ShadowCalculation 函数变为:

float ShadowCalculation(vec4 fragPosLightSpace)
{// perform perspective dividevec3 projCoords = fragPosLightSpace.xyz / fragPosLightSpace.w;// transform to [0,1] rangeprojCoords = projCoords * 0.5 + 0.5;// get closest depth value from light's perspective (using [0,1] range fragPosLight as coords)float closestDepth = texture(shadowMap, projCoords.xy).r; // get depth of current fragment from light's perspectivefloat currentDepth = projCoords.z;// check whether current frag pos is in shadowfloat shadow = currentDepth > closestDepth  ? 1.0 : 0.0;return shadow;
}  

在第二个渲染过程中激活此着色器、绑定正确的纹理以及激活默认投影和视图矩阵,将得到与下图类似的结果:

如果你做得对的话,你确实应该看到地板和立方体上的阴影(尽管有很多人工制品)。您可以在这里找到演示应用程序的源代码。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 怎样做可以使电动自行车锂电池使用更久?

    怎样做可以使电动自行车锂电池使用更久? 这样给电动自行车电池充电和维护是帮助电动车锂电池获得更长的寿命的正确方法。 哪些因素能够缩短期限呢?以及怎么在未来几年内如何保持电池的最佳状况? 一,充电 电动自行车电池及其充电方法因品牌而异。可是,正确的充电习惯可以更…...

    2024/4/28 4:02:07
  2. BIOS Architecture 学习笔记06 - PCI Basics and Bus Enumeration

    each funciton will have it`s config registersPCI: 256 Byte config spacePCIe: 4K Byte config spaceType 0 Header: for end point deviceType 1 Header: for bridge deviceBus: 8bit, 0~255Device: 5bit, 0~31Function: 3bit, 0~7...

    2024/4/16 1:43:05
  3. 『杭电1306』String Matching

    Problem DescriptionIts easy to tell if two words are identical - just check the letters. But how do you tell if two words are almost identical? And how close is "almost"? There are lots of techniques for approximate word matching. One is to det…...

    2024/4/16 1:43:10
  4. C++ 万年历 查找年、月、日、星期数以及节日等信息

    C++ 万年历显示公历的万年历,输入的年份在1800-2100年之间。功能要求如下:(1)输入一个年份,输出是在屏幕上显示该年的日历。(2)输入年、月,输出该月的日历。(3)输入年月日,输出距今天还有多少天,星期几,是否是为公历节日。部分算法程序主要分为四个部分:菜单,年…...

    2024/4/16 1:44:01
  5. 英语六级仔细阅读技巧

    英语六级仔细阅读技巧 1.做题方法2.划题干关键词3.题文同序4.六级主要题型5.细节题6.主旨题注意转折句 7.例证题8.推断题9.因果题10.观点态度题...

    2024/4/18 19:08:05
  6. 【Java语言】剑指offer系列之树、递归、DFS、回溯----矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 矩阵中包含一条字…...

    2024/4/1 3:24:31
  7. jquery自定义对话框alert、confirm和prompt

    jQuery Alert Dialogs,又一个基于jQuery的提示框插件,主要包括Alert、Confirm、prompt这三种,还有一个高级范例,可以在提示框内嵌入HTML语言,可以自定义风格样式。jQuery的提示框插件有很多种,每一款都是出自不同的高人之手,因此都比较有自己的特点,包括风格和使用方法…...

    2024/4/18 5:29:50
  8. 微信小程序如何直接分享到朋友圈?

    近日微信终于公开了小程序分享到朋友圈,下面就分享一下技术上如何将小程序分享到朋友圈吧。官方技术文档如下:分享到朋友圈(Beta)从基础库 2.11.3 开始支持此功能为beta版,暂仅在Android平台支持可将小程序页面分享到朋友圈。适用于内容型页面的分享,不适用于有较多交互的…...

    2024/4/24 13:37:03
  9. 反编译android的apk

    jadxhttps://github.com/skylot/jadx直接将apk文件将其拖入.可得到如下信息:签名的详细信息(类型,版本,主题,签名算法,MD5,SHA-1,SHA-256等等)所有资源文件(比如layout布局文件都是反编译了的,可以直接查看)所有class对应的java代码(未加壳的才行),java代码对应的smali代码也能…...

    2024/3/28 18:10:15
  10. 复合数据类型

    目录1. 引用2. 指针3. const限定符 数据类型 + 声明符 + 变量列表。 1. 引用 数据类型 &引用名 = 原变量名;注意:引用必须被初始化。 引用的过程是两者值的绑定,而不是拷贝。 只能引用对象,不能定义引用的引用。 对引用的操作即对原变量得操作2. 指针 理解复合类型的声明…...

    2024/4/16 1:42:09
  11. STM32微控制器综合实训6 外部中断

    实验6 外部中断 用STM32的外部中断来实现LED灯的闪烁。 文章目录代码讲解main.cexti.ckey.c修改代码led.cled.h编译仿真总结 代码讲解 main.c 打开工程,进入main.c #include "led.h" #include "delay.h" #include "key.h" #include "sys.…...

    2024/4/16 1:42:09
  12. [实例分割] Single Stage Instance Segmentation — A Review

    转载请注明作者和出处: http://blog.csdn.net/john_bh/ 文章链接: Single Stage Instance Segmentation — A Review 会议及时间:2020.6 实例分割一直是计算机视觉中很热门的课题,这几年发展的很快,从 two stage 到 single stage , 从MaskRCNN 到SOLO,不断涌现出一些优秀…...

    2024/4/16 1:42:04
  13. Ubuntu上djangorestframe已经安装,启动后端仍显示no module

    ImportError: No module named rest_framework这里ubuntu默认使用python 2.7的版本, 查看环境是否使用正确: 我使用的是虚拟环境,django 版本是1.11.11 因此需要在命令行输入:workon dj_1.11再去启动后端:成功 如果没有安装 pip install djangorestframework...

    2024/4/16 23:34:14
  14. 大数据高频面试题【目录】

    大数据高频面试题【目录】(小标题既超链接,点击可直接跳转)手写代码Linux & ShellHadoopFlumeKafkaHiveHBaseSqoopScalaSpark项目中的常见问题JavaSERedisMySQLJVM必会手写代码用心学习、用心做事、注意细节。...

    2024/4/16 3:02:56
  15. 一个简单的Excel导入导出工具类

    一个简单的Excel导入导出工具类1. 接口描述Excel导入导出工具类说明:类名:ExcelUtil主要功能:实现Excel导出下载及导入解析功能导入解析Excel接口方法名:readExcel输入参数:参数类型说明MultipartFile接收到前台传递的Excel文件信息IntegerSheet页序号返回值返回值类型说明…...

    2024/4/16 1:43:56
  16. 网络安全-sqlmap实战之sqlilabs-Less13

    类型双层-单引号及括号获取数据库python sqlmap.py -u "http://192.168.31.12/sqli-labs_1/Less-13/" --forms --dbms mysql --answers="extending=N" --threads 8 -dbs --batch发现参数结果--forms参数还是比较快的,针对POST表单有三种方式,可以查看网络…...

    2024/4/17 22:13:43
  17. 题315. 计算右侧小于当前元素的个数

    C++class Solution { public:vector<int> countSmaller(vector<int>& nums) {vector<int> t, res(nums.size());for (int i =...

    2024/4/16 1:44:11
  18. PTA乙级 1048 数字加密 (20分)-水题

    题目原文 本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结…...

    2024/4/18 9:44:07
  19. MySQL怎么学习?年薪近百万架构师送“满级“笔记,封神之路重燃

    数据库是一个综合系统,其背后是发展了几十年的数据库理论。也许你会觉得数据库并不难,因为你可以熟练地写出SQL,也可以在各个客户端里玩得游刃有余。但就以最常见的MySQL为例,作为程序员,你在使用MySQL的过程中,是不是曾经遇到过类似的问题:为什么我的count(*)这么慢?为…...

    2024/4/17 23:38:29
  20. jquery图片播放器插件

    相册在线查看http://keleyi.com/keleyi/phtml/image/6.htm可全屏,可拖动,可自动播放的jquery图片展示插件 使用说明:1.引用css文件:<link href="http://keleyi.com/keleyi/phtml/image/6/fotorama.css" rel="stylesheet">2.引用js文件:<scri…...

    2024/4/4 20:05:42

最新文章

  1. 校车车载4G视频智能监控系统方案

    一、项目背景 随着社会的快速发展&#xff0c;校车安全问题日益受到人们的关注。为了提高校车运营的安全性&#xff0c;保障学生的生命安全&#xff0c;我们提出了一套校车车载4G视频智能监控系统方案。该系统能够实时监控校车内部和外部环境&#xff0c;及时发现并处理潜在的…...

    2024/4/28 9:19:52
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. docker进行jenkins接口自动化测试持续集成实战

    文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk&#xff0c;maven&#xff0c;git&#xff0c;allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…...

    2024/4/27 15:40:21
  4. 不重复数字

    map就感觉很舒服 题目描述 给定 n 个数&#xff0c;要求把其中重复的去掉&#xff0c;只保留第一次出现的数。 输入格式 本题有多组数据。 第一行一个整数 T&#xff0c;表示数据组数。 对于每组数据&#xff1a; 第一行一个整数 n。 第二行 n 个数&#xff0c;表示给定的数。…...

    2024/4/26 2:40:13
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57