【OpenGL】Shader实例分析(九)- AngryBots中的主角受伤特效

2023-10-27

AngryBots是Unity官方的一个非常棒的例子,很有研究价值。以前研究的时候,由于其内容丰富,一时间不知道从哪入手写文章分析。这一段时间研究shader技术比较多一些,就从shader的这一方面开始吧。首先分析其中的一个屏幕特效:当主角受到攻击时会出现的全屏效果(postScreenEffect),效果如下:

  

其实这是一种的Bloom效果,相关文件有:MobileBloom.js 和 MobileBloom.shader;关于如何查看这两个文件,请参考下图:

JS代码分析
MobileBloom.js部分代码如下:

function OnRenderImage (source : RenderTexture, destination : RenderTexture) {        
#if UNITY_EDITOR
    FindShaders ();
    CheckSupport ();
    CreateMaterials ();    
#endif
 
    agonyTint = Mathf.Clamp01 (agonyTint - Time.deltaTime * 2.75f);
        
    var tempRtLowA : RenderTexture = RenderTexture.GetTemporary (source.width / 4, source.height / 4, rtFormat);
    var tempRtLowB : RenderTexture = RenderTexture.GetTemporary (source.width / 4, source.height / 4, rtFormat);
    
    // prepare data
    
    apply.SetColor ("_ColorMix", colorMix);
    apply.SetVector ("_Parameter", Vector4 (colorMixBlend * 0.25f,  0.0f, 0.0f, 1.0f - intensity - agonyTint));    
    
    // downsample & blur
    
    Graphics.Blit (source, tempRtLowA, apply, agonyTint < 0.5f ? 1 : 5);
    Graphics.Blit (tempRtLowA, tempRtLowB, apply, 2);
    Graphics.Blit (tempRtLowB, tempRtLowA, apply, 3);
    
    // apply
    
    apply.SetTexture ("_Bloom", tempRtLowA);
    Graphics.Blit (source, destination, apply, QualityManager.quality > Quality.Medium ? 4 : 0);
    
    RenderTexture.ReleaseTemporary (tempRtLowA);
    RenderTexture.ReleaseTemporary (tempRtLowB);
}
知识点准备
1)OnRenderImage函数
这是一个回调函数,是MonoBehaviour的生命周期的一部分,每一帧都会被调用;当这个函数被调用时,所有的3d渲染已经完成,渲染结果以参数source传入到函数中,后期效果的实现就是对source的处理,并把结果整合到destination中。这个函数所在的脚本一般绑定在Camera上。此函数只有在Unity Pro版本中才能够使用。

2)Graphics.Blit函数
static void Blit(Texture source, RenderTexture dest);
static void Blit(Texture source, RenderTexture dest, Material mat, int pass = -1);
static void Blit(Texture source, Material mat, int pass = -1);
这个函数就像过转化器一样,source图片经过它的处理变成了dest图片,其中材质对象mat负责算法实施(更准确的说法:算法是绑定到该mat上的shader来实现的。shader可以有多个pass,可以通过pass参数指定特定的shader,-1表示执行这个shader上所有的pass)。

3)RenderTexture.GetTemporary函数 和RenderTexture.ReleaseTemporary函数
GetTemporary获取临时的RenderTexture。ReleaseTemporary用来释放指定的RenderTexture;

RenderTexture一般在GPU中实现,速度快但资源稀缺。unity内部对RenderTexture做了池化操作,以便复用之。对GetTemporary函数的调用其实就是获取unity中RenderTexture的引用;当处理完之后,使用ReleaseTemporary来释放对此RenderTexture的引用,达到复用的目的,提高性能。

JS代码分析
了解了三个知识点,上面代码的功能就非常清晰了,分析如下:

a)获取两个渲染贴图tempRtLowA和tempRtLowB(长宽都是原图的1/4,用以加快渲染速度)
b)设置Mat中Shader的参数
c)通过Mat来处理贴图,最终渲染到destination贴图中,用来显示
d)释放临时的贴图。
这里先解释a和c; 

【步骤a】,获取两个贴图,并缩小到原来的1/16(长宽都缩小为原来的1/4,面积为原来的1/16),节约了GPU内存,同时提高渲染速度;由于接下来的步骤是对图片进行模糊处理(对质量要求不高),这样做是可行的。

【步骤c】(注:调用Blit函数来过滤贴图,其中最后一个数字参数是用来指代shader的pass的)

pass1 或者 pass5, 提取颜色中最亮的部分;pass2 对高亮图片进行纵向模糊;pass3 对高亮图片进行横向模糊;pass0或pass4;把模糊的图片叠加到原图片上。

一个亮点,先经过横向模糊,再经过纵向模糊的过程,如下图所示(可以把这理解为“使一个点向周围扩散的算法”):

图解算法
现在的重点是【步骤c】中的shader算法是怎么实现的了,先图解一下算法:

图1 原图

图2【初始化】原图缩放成原来的1/16

图3【步骤1】扩大高亮区域

图4 【步骤2】纵向模糊

图5 【步骤3】横向模糊

图6 【步骤4a】(原图 + 步骤3的效果)最终叠加的效果,这个效果称之为glow或者bloom。

图7 【步骤4b】(原图 + 步骤3的效果)最终叠加的效果 《===(注意:这个效果需要在步骤1中添加红色成份)

调节步骤1中的图片颜色强度,可以形成相应的动画,如下图所示:

Shader分析
接下来,我将按照上图的序列来分析shader开始。

图3【步骤1】扩大高亮区域
js代码:

 Graphics.Blit (source, tempRtLowA, apply, 1);  
shader代码:
struct v2f_withMaxCoords {
    half4 pos : SV_POSITION;
    half2 uv : TEXCOORD0;
    half2 uv2[4] : TEXCOORD1;
};    
 
v2f_withMaxCoords vertMax (appdata_img v)
{
    v2f_withMaxCoords o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
    o.uv = v.texcoord;
    o.uv2[0] = v.texcoord + _MainTex_TexelSize.xy * half2(1.5,1.5);                    
    o.uv2[1] = v.texcoord + _MainTex_TexelSize.xy * half2(-1.5,1.5);
    o.uv2[2] = v.texcoord + _MainTex_TexelSize.xy * half2(-1.5,-1.5);
    o.uv2[3] = v.texcoord + _MainTex_TexelSize.xy * half2(1.5,-1.5);
    return o; 
}    
 
fixed4 fragMax ( v2f_withMaxCoords i ) : COLOR
{                
    fixed4 color = tex2D(_MainTex, i.uv.xy);
    color = max(color, tex2D (_MainTex, i.uv2[0]));    
    color = max(color, tex2D (_MainTex, i.uv2[1]));    
    color = max(color, tex2D (_MainTex, i.uv2[2]));    
    color = max(color, tex2D (_MainTex, i.uv2[3]));    
    return saturate(color - ONE_MINUS_INTENSITY);

 
// 1
Pass { 
    CGPROGRAM
    
    #pragma vertex vertMax
    #pragma fragment fragMax
    #pragma fragmentoption ARB_precision_hint_fastest 
    
    ENDCG     
}    
这段代码的作用可以描述为:当渲染某一点时,在这一点及其周围四点(左上、右上、左下、右下)中,选取最亮的一点作为该点的颜色。具体解释为:在vertMax的代码中,构造了向四个方向偏移的uv坐标,结合本身uv,共5个uv,一起提交给openGL,光栅化后传给fragmentShader使用。在fragMax中从5个uv所对应的像素中,选取其中最大的作为颜色输出。结果如图3所示。
图4 【步骤2】纵向模糊
js端

Graphics.Blit (tempRtLowA, tempRtLowB, apply, 2);
Shader端代码:
struct v2f_withBlurCoords {
    half4 pos : SV_POSITION;
    half2 uv2[4] : TEXCOORD0;
};        
 
v2f_withBlurCoords vertBlurVertical (appdata_img v)
{
    v2f_withBlurCoords o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
    o.uv2[0] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, -1.5);            
    o.uv2[1] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, -0.5);    
    o.uv2[2] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, 0.5);    
    o.uv2[3] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, 1.5);    
    return o; 
}            
 
fixed4 fragBlurForFlares ( v2f_withBlurCoords i ) : COLOR
{                
    fixed4 color = tex2D (_MainTex, i.uv2[0]);
    color += tex2D (_MainTex, i.uv2[1]);
    color += tex2D (_MainTex, i.uv2[2]);
    color += tex2D (_MainTex, i.uv2[3]);
    return color * 0.25;
}
 
// 2
Pass {
    CGPROGRAM
    
    #pragma vertex vertBlurVertical
    #pragma fragment fragBlurForFlares
    #pragma fragmentoption ARB_precision_hint_fastest 
    
    ENDCG 
    }            
这段代码的作用可以描述为:当渲染某一点时,在竖直方向上距其0.5和1.5个单位的四个点(上下各两个)的颜色叠加起来,作为该点的颜色。结果如图4所示。

图5 【步骤3】横向模糊 (同图四的描述)
图6 【步骤4a】最终叠加的效果
(原图 + 步骤3的效果)最终叠加的效果,这个效果称之为glow或者bloom。

js段代码:

apply.SetTexture ("_Bloom", tempRtLowA);
Graphics.Blit (source, destination, apply, 0);
Shader端代码:
struct v2f_simple {
    half4 pos : SV_POSITION;
    half4 uv : TEXCOORD0;
};    
 
v2f_simple vertBloom (appdata_img v)
{
    v2f_simple o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
    o.uv = v.texcoord.xyxy;            
#if SHADER_API_D3D9
    if (_MainTex_TexelSize.y < 0.0)
        o.uv.w = 1.0 - o.uv.w;
#endif
    return o; 
}        
 
fixed4 fragBloom ( v2f_simple i ) : COLOR
{    
    fixed4 color = tex2D(_MainTex, i.uv.xy);
    return color + tex2D(_Bloom, i.uv.zw);

 
// 0
Pass {
    CGPROGRAM
    
    #pragma vertex vertBloom
    #pragma fragment fragBloom
    #pragma fragmentoption ARB_precision_hint_fastest 
    
    ENDCG
    }        
这段代码的作用可以描述为:把图5的结果叠加到原图上。结果如图6所示。

Shader的完整代码
MobileBloom.shader:

Shader "Hidden/MobileBloom" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Bloom ("Bloom (RGB)", 2D) = "black" {}
    }
    
    CGINCLUDE
 
        #include "UnityCG.cginc"
 
        sampler2D _MainTex;
        sampler2D _Bloom;
        
        uniform fixed4 _ColorMix;    
        
        uniform half4 _MainTex_TexelSize;
        uniform fixed4 _Parameter;
        
        #define ONE_MINUS_INTENSITY _Parameter.w
 
        struct v2f_simple {
            half4 pos : SV_POSITION;
            half4 uv : TEXCOORD0;
        };
        
        struct v2f_withMaxCoords {
            half4 pos : SV_POSITION;
            half2 uv : TEXCOORD0;
            half2 uv2[4] : TEXCOORD1;
        };        
 
        struct v2f_withBlurCoords {
            half4 pos : SV_POSITION;
            half2 uv2[4] : TEXCOORD0;
        };    
        
        v2f_simple vertBloom (appdata_img v)
        {
            v2f_simple o;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.texcoord.xyxy;            
            #if SHADER_API_D3D9
                if (_MainTex_TexelSize.y < 0.0)
                    o.uv.w = 1.0 - o.uv.w;
            #endif
            return o; 
        }
 
        v2f_withMaxCoords vertMax (appdata_img v)
        {
            v2f_withMaxCoords o;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.texcoord;
            o.uv2[0] = v.texcoord + _MainTex_TexelSize.xy * half2(1.5,1.5);                    
            o.uv2[1] = v.texcoord + _MainTex_TexelSize.xy * half2(-1.5,1.5);
            o.uv2[2] = v.texcoord + _MainTex_TexelSize.xy * half2(-1.5,-1.5);
            o.uv2[3] = v.texcoord + _MainTex_TexelSize.xy * half2(1.5,-1.5);
            return o; 
        }            
 
        v2f_withBlurCoords vertBlurVertical (appdata_img v)
        {
            v2f_withBlurCoords o;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.uv2[0] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, -1.5);            
            o.uv2[1] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, -0.5);    
            o.uv2[2] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, 0.5);    
            o.uv2[3] = v.texcoord + _MainTex_TexelSize.xy * half2(0.0, 1.5);    
            return o; 
        }    
 
        v2f_withBlurCoords vertBlurHorizontal (appdata_img v)
        {
            v2f_withBlurCoords o;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.uv2[0] = v.texcoord + _MainTex_TexelSize.xy * half2(-1.5, 0.0);            
            o.uv2[1] = v.texcoord + _MainTex_TexelSize.xy * half2(-0.5, 0.0);    
            o.uv2[2] = v.texcoord + _MainTex_TexelSize.xy * half2(0.5, 0.0);    
            o.uv2[3] = v.texcoord + _MainTex_TexelSize.xy * half2(1.5, 0.0);    
            return o; 
        }    
                        
        fixed4 fragBloom ( v2f_simple i ) : COLOR
        {    
            fixed4 color = tex2D(_MainTex, i.uv.xy);
            return color + tex2D(_Bloom, i.uv.zw);
        } 
        
        fixed4 fragBloomWithColorMix ( v2f_simple i ) : COLOR
        {    
            fixed4 color = tex2D(_MainTex, i.uv.xy);    
                    
            half colorDistance = Luminance(abs(color.rgb-_ColorMix.rgb));
            color = lerp(color, _ColorMix, (_Parameter.x*colorDistance));
            color += tex2D(_Bloom, i.uv.zw);            
                        
            return color;                    
        } 
        
        fixed4 fragMaxWithPain ( v2f_withMaxCoords i ) : COLOR
        {                
            fixed4 color = tex2D(_MainTex, i.uv.xy);
            color = max(color, tex2D (_MainTex, i.uv2[0]));    
            color = max(color, tex2D (_MainTex, i.uv2[1]));    
            color = max(color, tex2D (_MainTex, i.uv2[2]));    
            color = max(color, tex2D (_MainTex, i.uv2[3]));    
            return saturate(color + half4(0.25,0,0,0) - ONE_MINUS_INTENSITY);
        } 
        
        fixed4 fragMax ( v2f_withMaxCoords i ) : COLOR
        {                
            fixed4 color = tex2D(_MainTex, i.uv.xy);
            color = max(color, tex2D (_MainTex, i.uv2[0]));    
            color = max(color, tex2D (_MainTex, i.uv2[1]));    
            color = max(color, tex2D (_MainTex, i.uv2[2]));    
            color = max(color, tex2D (_MainTex, i.uv2[3]));    
            return saturate(color - ONE_MINUS_INTENSITY);
        } 
 
        fixed4 fragBlurForFlares ( v2f_withBlurCoords i ) : COLOR
        {                
            fixed4 color = tex2D (_MainTex, i.uv2[0]);
            color += tex2D (_MainTex, i.uv2[1]);
            color += tex2D (_MainTex, i.uv2[2]);
            color += tex2D (_MainTex, i.uv2[3]);
            return color * 0.25;
        }
            
    ENDCG
    
    SubShader {
      ZTest Always Cull Off ZWrite Off Blend Off
      Fog { Mode off }  
      
    // 0
    Pass {
        CGPROGRAM
        
        #pragma vertex vertBloom
        #pragma fragment fragBloom
        #pragma fragmentoption ARB_precision_hint_fastest 
        
        ENDCG
        }
    // 1
    Pass { 
        CGPROGRAM
        
        #pragma vertex vertMax
        #pragma fragment fragMax
        #pragma fragmentoption ARB_precision_hint_fastest 
        
        ENDCG     
        }    
    // 2
    Pass {
        CGPROGRAM
        
        #pragma vertex vertBlurVertical
        #pragma fragment fragBlurForFlares
        #pragma fragmentoption ARB_precision_hint_fastest 
        
        ENDCG 
        }    
    // 3            
    Pass {
        CGPROGRAM
        
        #pragma vertex vertBlurHorizontal
        #pragma fragment fragBlurForFlares
        #pragma fragmentoption ARB_precision_hint_fastest 
        
        ENDCG
        }
    // 4            
    Pass {
        CGPROGRAM
        
        #pragma vertex vertBloom
        #pragma fragment fragBloomWithColorMix
        #pragma fragmentoption ARB_precision_hint_fastest 
        
        ENDCG
        }
    // 5            
    Pass {
        CGPROGRAM
        
        #pragma vertex vertMax
        #pragma fragment fragMaxWithPain
        #pragma fragmentoption ARB_precision_hint_fastest 
        
        ENDCG
        }
    }
    FallBack Off
}


参考文献
官方例子AngryBots的链接地址:http://u3d.as/content/unity-technologies/angry-bots/5CF

《Unity Shaders and Effects Cookbook》的章节:

Chapter 10 Screen Effects with Unity Render Textures

Chapter 11 Gameplay and Screen Effects

[GPU Gems] Real-Time Glow:http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html

Unity Shader-Command Buffer的使用(景深与描边效果重置版)
1.6万

CommandBuffer是Unity5新增的一个灰常灰常强大的功能。先祭出官方介绍和文档。我们在渲染的时候,给OpenGL或者DX的就是一系列的指令,比如glDrawElement,glClear等...
--------------------- 
作者:stalendp 
来源:CSDN 
原文:https://blog.csdn.net/stalendp/article/details/40859441 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenGL】Shader实例分析(九)- AngryBots中的主角受伤特效 的相关文章

  • 带有 OpenGL 的 Qt MDI 应用程序:如何获取有效的屏幕截图?

    我有一个MDI http en wikipedia org wiki Multiple document interface用 Qt 编写的应用程序 一些子窗口包括QGLWidgets 即 OpenGL 上下文 其中最突出的是使用 Open
  • QML 将纹理应用于网格

    我正在尝试将图像纹理应用到 QML Qt 5 6 2 中的网格 我从示例 Shadow Map QML 开始 我想对 GroundPlane 进行纹理处理 材质和效果 qml 类应用于该 GroundPlane 网格 但我看不到如何应用图像
  • 在 SceneKit 中使用 Metal 着色器

    我想用一个Metal着色器将卡通 单元着色应用于场景中使用的材质 我试图实现的着色器是苹果自己的AAPLCelShader发现于金属着色器展示柜 https developer apple com library ios samplecod
  • 为 webgl 中的每个对象使用不同的顶点和片段着色器

    我在 webgl 中有一个包含多个对象的场景 对于每个对象 我想使用不同的顶点和片段着色器 我的第一个问题是 是否可以为每个对象都有一个着色器 我知道在 opengl 中这是可能的 这是与我的想法类似的伪代码 任何例子将不胜感激 glena
  • LibGDX 网格高度图法线和灯光

    我正在尝试让网格法线和灯光在 LibGDX 项目中工作 我已经有了从高度图纹理像素生成的纹理网格 问题是我无法正确点亮法线 另外 我不能 100 确定我在 TerrainChunk 类中正确设置了法线顶点 这是主类代码 package co
  • OpenGL 中着色器的问题

    我正在尝试在 C 中使用像 glShaderSource 这样的东西 Visual Studio 表示像 glCompileShader 或 glCreateProgram 这样的函数不存在 我使用 FreeGLUT 来包含 OpenGL
  • 是否可以在Unity的HDRP中创建DepthMask效果?

    我已经为此努力了一段时间 但我不知道是否有可能创建一个深度掩模着色器HDRP 如此处所述 http wiki unity3d com index php DepthMask 对于我的确切用途 我试图在应用了材质的任何形状上创建一个 洞 以显
  • Directx 11,将多个纹理发送到着色器

    使用此代码我可以将一个纹理发送到着色器 devcon gt PSSetShaderResources 0 1 pTexture 当然 我通过以下方式制作了 pTexture D3DX11CreateShaderResourceViewFro
  • 如何绘制存储在 SSBO 中的顶点?

    这是下面的一个问题OpenGL 和加载 读取 AoSoA 混合 SoA 格式的数据 https stackoverflow com questions 59616117 opengl and loading reading data in
  • 在Unity中如何使两个精灵的重叠区域透明?

    在Unity中如何使两个精灵的重叠区域透明 你能写一个关于它的着色器吗 经过一些研究 我了解到我应该使用模板缓冲区 但我不知道如何使用 这对我来说至关重要 我必须在 6 天内完成这个学校项目 请帮忙 示例图片 就这样 请记住这是我第一次使用
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • 如何使着色器淡入某种颜色?

    这是我当前使用的着色器 它通过缓慢降低不透明度来淡化对象 我想褪成紫色 如何才能做到这一点 着色器 frag uniform sampler2D texture uniform float opacity void main vec4 pi
  • OpenGL:多个顶点的单个顶点属性?

    我有一个接受以下属性的顶点着色器 a posCoord 顶点位置 a texCoord 纹理坐标 传递给片段着色器 a alpha 透明度因子 传递给片段着色器 我正在渲染的对象都是 广告牌 一对直角三角形组成一个矩形 我正在使用一次调用g
  • Unity 后处理 PostProcessEffectRenderer 在编辑器中显示,但在构建中不显示

    将 PostProcessEffectRenderer 的实现添加到 Unity 后处理堆栈后 效果在 Unity 编辑器中完美运行 但不会在构建的游戏中显示 对构建质量的更改没有效果 使用针对 Windows x86 64 构建的最高质量
  • CPU 到 GPU 法线映射

    我正在创建一个地形网格 然后这个答案 https stackoverflow com a 5284527 1356106我正在尝试将 CPU 计算法线迁移到基于着色器的版本 以便通过降低网格分辨率并使用在片段着色器中计算的法线贴图来提高性能
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 将自己的结构传递到 opengl es 2.0 着色器中

    我想尝试 OpenGL ES 2 0 编程指南 一书中的照明示例 在着色器中他们制作了两种结构 struct directional light vec3 direction normalized light direction in ey

随机推荐

  • linux中脚本监测nginx状态并重启

    首先要确定nginx的安装位置 如果自定义安装则需要自己去找到nginx运行程序所在的位置 下面的编写和执行都是nginx通过源代码编译安装 运行程序所在的位置为 usr local nginx sbin nginx 确定nginx的使用端
  • mmsegmentation 之修改输入通道

    open mmlab有许多非常实用的框架 其中目标检测的话mmdetection确实很实用 但语义分割的话当属mmsegmentation 这篇博客介绍mmsegmentation如何将输入图像通道数修改为单通道 1 默认你自己已经用mms
  • Stable Diffusion核心算法DDPM解析

    DDPM Denoising Diffusion Probabilistic Model 去噪扩散概率模型 本文参考 一个视频看懂扩散模型DDPM原理推导 AI绘画底层模型 哔哩哔哩 bilibili 1 大概原理 从右往左为正向加噪过程
  • 完美数的算法设计(C语言)

    完全数 Perfect number 又称完美数或完备数 是一些特殊的自然数 它所有的真因子 即除了自身以外的约数 的和 即因子函数 恰好等于它本身 如果一个数恰好等于它的因子之和 则称该数为 完全数 寻找完美的数 题目描述 所谓完美的数是
  • 机器学习——卷积神经网络基础

    卷积神经网络 Convolutional Neural Network CNN 卷积神经网络是人工神经网络的一种 是一种前馈神经网络 最早提出时的灵感来源于人类的神经元 通俗来讲 其主要的操作就是 接受输入层的输入信息 通过卷积层 激活层
  • Pinia刷新会丢失数据 应该怎么解决

    Pinia pinia官网 pinia plugin persistedstate pinia plugin persistedstate官网 Pinia 是一个 Vue js 状态管理库 它允许你创建一个全局的 store 和多个模块化的
  • 不同页面参数值传递localStorage

    不同页面参数值传递localStorage 介绍 localStorage 和 sessionStorage 属性允许在浏览器中存储 key value 对的数据 localStorage 用于长久保存整个网站的数据 保存的数据没有过期时间
  • C语言-qsort函数详解

    一 qsort函数是什么 qsort 函数 快速排序的函数 引用stdlib h头文件 参数说明 void qsort void base 要排序的目标数组 size t num 待排序的元素个数 size t width 一个元素的大小
  • Java最小栈

    Java中的栈是一种后进先出 Last In First Out LIFO 的数据结构 它具有如下几个基本操作 将一个元素压入栈中 称为 入栈 push 将栈顶元素弹出 称为 出栈 pop 查看栈顶元素 称为 查看栈顶元素 peek 判断栈
  • Jenkins详细教程

    最近接触了jenkins这个东西 所以花点时间了解了下 它可以在代码上传仓库 如github gitee gitlab 后 在jenkins 一个网站界面 中通过获取代码仓库中最新代码 进行自动化部署 而省去手动打包 上传服务器 部署这一系
  • 多线程实现TCP的服务器,客户端随时收发信息

    1 作业需求 完成TCP的服务器 客户端 上交 服务器 客户端需要做到随时收发 多进程多线程实现 2 实现过程 1 服务器代码 include
  • 手机影像ISP流程:AWB(1)

    目录 AWB简介 AWB算法 灰度世界算法 灰度世界法的代码 灰度世界法的优点 灰度世界法的缺点 镜面反射法 镜面反射法的代码 镜面反射法的优点 镜面反射法的缺点 总结 AWB简介 AWB是Automatic white balance的英
  • 微信小程序中wx:for语法及其使用

    微信小程序官方文档中wx for 是用来做列表渲染 在组件上使用wx for绑定一个数组 数组的下标变量名默认为index 数组当前项的变量名默认为item 在Wxml中可以使用for循环获取数组数据 记住for循环后面跟的是数组 当然数组
  • 语义分割的常用指标详解

    1 混淆矩阵 假设有6个类别 L为10个真实标签的取值 P为对应的预测的标签值 先计算对应的n 类别数 这里假设为6 xL P bin的值一定是分类数的平方 混淆矩阵先将真实标签和预测标签抻成一维向量 做一个对应关系 nxL P 再将这个对
  • Linux必杀(十六):打包命令tar

    题记 tar 的参数非常多 挑重点的讲几个 tar j z cv f 新建的文件名 filename lt 打包与压缩 tar j z tv f 新建的文件名 lt 查看文件名 tar j z xv f 新建的文件名 c目录 lt 解压缩
  • JPA @MappedSuperclass注解的使用说明

    原文地址 http hi baidu com danghj item 507d7bdcee3ac052d63aaedf 基于代码复用和模型分离的思想 在项目开发中使用JPA的 MappedSuperclass注解将实体类的多个属性分别封装到
  • win7安装linux子系统,win7系统安装Version 1607中的Linux子系统的方法介绍

    win7系统使用久了 好多网友反馈说win7系统安装Version 1607中的Linux子系统的问题 非常不方便 有什么办法可以永久解决win7系统安装Version 1607中的Linux子系统的问题 面对win7系统安装Version
  • 大数据:Storm集成Kafka

    一 整合说明 Storm 官方对 Kafka 的整合分为两个版本 官方说明文档分别如下 Storm Kafka Integration 主要是针对 0 8 x 版本的 Kafka 提供整合支持 Storm Kafka Integration
  • WinDump使用资料

    WinDump使用提示 基本用法 windump aBdDeflnNOpqRStvxX c count F file i interface m module r file s snaplen T type w file E algo se
  • 【OpenGL】Shader实例分析(九)- AngryBots中的主角受伤特效

    AngryBots是Unity官方的一个非常棒的例子 很有研究价值 以前研究的时候 由于其内容丰富 一时间不知道从哪入手写文章分析 这一段时间研究shader技术比较多一些 就从shader的这一方面开始吧 首先分析其中的一个屏幕特效 当主