【Unity】RenderFeature笔记

news2025/2/26 19:02:04

【Unity】RenderFeature笔记

RenderFeature是在urp中添加的额外渲染pass,并可以将这个pass插入到渲染列队中的任意位置。内置渲染管线中Graphics 的功能需要在RenderFeature里实现,常见的如DrawMesh和Blit

​ 可以实现的效果包括但不限于

  1. 后处理,可以编写shader对整个渲染画面进行修改。比如一些全局特效包括:场景描边,地形扫描;

  2. 创建网格,通过DrawMesh绘制定义的网格;

  3. 渲染画面,将场景渲染到纹理;

一、RanderFeature简介

1. 创建RanderFeature

在project中Create→Rendering→URPRenderFeature

2.RanderFeature结构
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{
    class CustomRenderPass : ScriptableRenderPass
    {
        // 在执行渲染通道之前调用
        // 创建临时渲染目标纹理。
        //为Execute提前准备需要的RenderTexture或者其它变量
        public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData){}
        //核心方法,实现这个renderPass的逻辑
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}
        //释放在OnCameraSetup里,声明的变量如TemporaryRenderTexture
        public override void OnCameraCleanup(CommandBuffer cmd) {}
    }
    CustomRenderPass m_ScriptablePass;

    /// <inheritdoc/>
    public override void Create()
    {
        m_ScriptablePass = new CustomRenderPass();
        //定义渲染的位置
        m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
    }

    // 这里你可以在渲染器中注入一个或多个渲染通道。
    //每一帧都执行
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        //把实例化的CustomRenderPass插入渲染管线
        renderer.EnqueuePass(m_ScriptablePass);
    }
}
3.RenderFeatrue使用

在Universal Render Pipeline Asset_Renderer直接Add RenderFeatrue

二、后处理效果

关键词
1、CommandBuffer.Blit

Blit是很常用的后期效果方法,在Build_in中常常是在OnRenderImage里被调用,与urp不同的是,在build_in里是通过Graphics.Blit调用。

Graphics.Blit

常用的接口: Blit(RenderTexturesource, RenderTexture dest, Material mat);

即使用着色器将源纹理复制到目标渲染纹理。

CommandBuffer.Blit

常用的接口:public void Blit (Rendering.RenderTargetIdentifier source, Rendering.RenderTargetIdentifier dest, Material mat);

这与 Graphics.Blit相似 - 主要用于从一个(渲染)纹理复制到其他纹理,可能使用自定义着色器;

源纹理或渲染目标将作为“_MainTex”属性传递给材质。

在shader中,_MainTex对应的是source,最后retrun对应的是dest

2、RenderTargetIdentifier

渲染目标标识符,标识 CommandBuffer的 RenderTexture;

使用 CommandBuffer.GetTemporaryRT 创建的具有名称的临时渲染纹理;

ScriptableRenderPass中有colorAttachment和depthAttachment是可以直接使用;

RenderTargetHandle.CameraTarget.Identifier()可以得到当前的渲染标识符

renderingData.cameraData.renderer.cameraColorTarget 也可以得到当前的渲染标识符

简单实现

实现脚本

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{
    //结构说明
    class CustomRenderPass : ScriptableRenderPass
    {
        // 在执行渲染通道之前调用
        // 创建临时渲染目标纹理。
        //为Execute提前准备需要的RenderTexture或者其它变量

        public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {}
      
        //核心方法,实现这个renderPass的逻辑
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}

        //释放在OnCameraSetup里,声明的变量如TemporaryRenderTexture
        public override void OnCameraCleanup(CommandBuffer cmd){}
    }
    //后处理效果
    class CustomRenderShaderPostPass : ScriptableRenderPass
    {  
        //定义渲染材质,通过Create方法赋值
        public Material _Material;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            //创建一个CommandBuffer
            CommandBuffer cmd = CommandBufferPool.Get("ShowShader");
            //这里有一个疑问,渲染标识符不管怎么传都不影响结果
            cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);
            //执行CommandBuffer
            context.ExecuteCommandBuffer(cmd);
            //回收CommandBuffer
            CommandBufferPool.Release(cmd);
        }
    }

    CustomRenderShaderPostPass m_ScriptablePassPost;
    public Shader shader;
    /// <inheritdoc/>
    public override void Create()
    {
        m_ScriptablePassPost = new CustomRenderShaderPostPass();
        //通过创建一个渲染材质
        m_ScriptablePassPost._Material = new Material(shader);
        //定义渲染的位置
        m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
    }
    // 这里你可以在渲染器中注入一个或多个渲染通道。
    //每一帧都执行
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        //把实例化的CustomRenderPass插入渲染管线
        renderer.EnqueuePass(m_ScriptablePassPost);
    }
}
1.实现饱和度和对比度调整

用shaderGraph实现

用shader实现

Shader "Unlit/SaturationContrastShader"
{
    SubShader
    {
        Pass
        {
           ZTest Always ZWrite Off
            CGPROGRAM

            #pragma vertex vert_img  // 使用内置的vert_img顶点着色器
            #pragma fragment frag

            #include "UnityCG.cginc"

            sampler2D _CameraColorTexture; 
            //饱和度
            fixed3   Saturation_float(float3 In, float Saturation)
            {
                float luma = dot(In, float3(0.2126729, 0.7151522, 0.0721750));
                return luma.xxx + Saturation.xxx * (In - luma.xxx);
            }
            //对比度
            fixed3  Contrast_float(float3 In, float Contrast)
            {
                float midpoint = pow(0.5, 2.2);
                return (In - midpoint) * Contrast + midpoint;
            }

            fixed4 frag (v2f_img i) : SV_Target
            {
                fixed4 col = tex2D(_CameraColorTexture, i.uv);
                fixed3  Saturation =  Saturation_float(col, 5);
                fixed3  Contrast = Saturation_float(Saturation, 5);
                return fixed4(Contrast.x, Contrast.y, Contrast.z,0.1);
            }
            ENDCG
        }
    }
   FallBack Off
}

使用前

使用后

三、创建网格

关键词
1、CommandBuffer.DrawMesh

常用的接口:DrawMesh(Mesh mesh, Matrix4x4 matrix, Material material);

这个接口相对简单,传入mesh,变换矩阵,和材质

简单实现

这里接着上一个CustomRenderPassFeatureTest写,同时实现后处理和网格创建


using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{
    //结构说明
    class CustomRenderPass : ScriptableRenderPass
    {
        // 在执行渲染通道之前调用
        // 创建临时渲染目标纹理。
        //为Execute提前准备需要的RenderTexture或者其它变量

        public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {}
      
        //核心方法,实现这个renderPass的逻辑
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}

        //释放在OnCameraSetup里,声明的变量如TemporaryRenderTexture
        public override void OnCameraCleanup(CommandBuffer cmd){}
    }
    //后处理效果
    class CustomRenderShaderPostPass : ScriptableRenderPass
    {  
        //定义渲染材质,通过Create方法赋值
        public Material _Material;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            //创建一个CommandBuffer
            CommandBuffer cmd = CommandBufferPool.Get("ShowShader");
            //这里有一个疑问,渲染标识符不管怎么传都不影响结果
            cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);
            //执行CommandBuffer
            context.ExecuteCommandBuffer(cmd);
            //回收CommandBuffer
            CommandBufferPool.Release(cmd);
        }
    }
    //绘制网格
    class CustomRenderPassCreateMesh : ScriptableRenderPass
    {
        public Material _Material;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CommandBuffer cmd = CommandBufferPool.Get("CreateMesh");
            cmd.DrawMesh(CreateMesh(), Matrix4x4.identity, _Material);
            //这里和后处理一样的操作
            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
        //创建网格
        Mesh CreateMesh()
        {
            Mesh mesh = new Mesh();
            mesh.vertices = new Vector3[4] { new Vector3(1, 1, 1), new Vector3(-1, 1, 1), new Vector3(-1, 1, -1), new Vector3(1, 1, -1) };
            int[] indices = new int[8] { 0, 1, 1, 2, 2, 3, 3, 0 };
            //创建简单的线网格
            mesh.SetIndices(indices, MeshTopology.Lines, 0);
            return mesh;
        }
    }

    CustomRenderShaderPostPass m_ScriptablePassPost;
    CustomRenderPassCreateMesh m_ScriptablePassCreateMesh;
    public Shader shaderPost;
    public Shader shaderMesh;
    /// <inheritdoc/>
    public override void Create()
    {
        m_ScriptablePassPost = new CustomRenderShaderPostPass();
        //通过创建一个渲染材质
        m_ScriptablePassPost._Material = new Material(shaderPost);
        //定义渲染的位置
        m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRendering;

        m_ScriptablePassCreateMesh = new CustomRenderPassCreateMesh();
        m_ScriptablePassCreateMesh._Material = new Material(shaderMesh);
        m_ScriptablePassCreateMesh.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
    }

    // 这里你可以在渲染器中注入一个或多个渲染通道。
    //每一帧都执行
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        //把实例化的CustomRenderPass插入渲染管线
        renderer.EnqueuePass(m_ScriptablePassPost);
        renderer.EnqueuePass(m_ScriptablePassCreateMesh);
    }
}

实现效果

知识点:RenderPassEvent控制渲染的顺序,上图我们可以看到,创建的线是可以被模型遮挡和遮挡模型的。但是如果把m_ScriptablePassCreateMesh.renderPassEvent=RenderPassEvent.AfterRendering 就会发现线完全遮挡模型,即线最后渲染

四、渲染画面到图片

关键词
1、GetTemporaryRT

获取临时渲染纹理

可使用给定参数创建临时渲染纹理,并使用 nameID 将其设置为全局着色器属性。使用 Shader.PropertyToID创建整数名称。

2、Shader.PropertyToID

获取着色器属性名称的唯一标识符。

static string RtName = "_TestRT";
static int RT_ID = Shader.PropertyToID(RtName);

简单实现

同样接着上一个CustomRenderPassFeatureTest写,同时实现后处理和网格创建


using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{
    //结构说明
    class CustomRenderPass : ScriptableRenderPass
    {
        // 在执行渲染通道之前调用
        // 创建临时渲染目标纹理。
        //为Execute提前准备需要的RenderTexture或者其它变量

        public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {}
      
        //核心方法,实现这个renderPass的逻辑
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){}

        //释放在OnCameraSetup里,声明的变量如TemporaryRenderTexture
        public override void OnCameraCleanup(CommandBuffer cmd){}
    }
    //后处理效果
    class CustomRenderShaderPostPass : ScriptableRenderPass
    {  
        //定义渲染材质,通过Create方法赋值
        public Material _Material;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            //创建一个CommandBuffer
            CommandBuffer cmd = CommandBufferPool.Get("ShowShader");
            //这里有一个疑问,渲染标识符不管怎么传都不影响结果
            cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);
            //执行CommandBuffer
            context.ExecuteCommandBuffer(cmd);
            //回收CommandBuffer
            CommandBufferPool.Release(cmd);
        }
    }
    //创建网格
    class CustomRenderPassCreateMesh : ScriptableRenderPass
    {
        public Material _Material;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CommandBuffer cmd = CommandBufferPool.Get("CreateMesh");
            cmd.DrawMesh(CreateMesh(), Matrix4x4.identity, _Material);
            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
        //创建网格
        Mesh CreateMesh()
        {
            Mesh mesh = new Mesh();
            mesh.vertices = new Vector3[4] { new Vector3(1, 1, 1), new Vector3(-1, 1, 1), new Vector3(-1, 1, -1), new Vector3(1, 1, -1) };
            int[] indices = new int[8] { 0, 1, 1, 2, 2, 3, 3, 0 };
            mesh.SetIndices(indices, MeshTopology.Lines, 0);
            return mesh;
        }
    }
    //渲染画面
    class CustomRenderPassRT : ScriptableRenderPass
    {
        static string RtName = "_TestRT";
        //获取着色器属性名称的唯一标识符。
        static int RT_ID = Shader.PropertyToID(RtName);
        public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
        {
            //新建一个RenderTextureDescriptor
            RenderTextureDescriptor textureDescriptor = new RenderTextureDescriptor(1920, 1080, RenderTextureFormat.Default, 0);
            //获取临时渲染纹理
            cmd.GetTemporaryRT(RT_ID, textureDescriptor);
        }
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            CommandBuffer cmd = CommandBufferPool.Get("ShowRT");
            //下面三段实现效果一样
            cmd.Blit(renderingData.cameraData.renderer.cameraColorTarget, RT_ID);
           // cmd.Blit(RenderTargetHandle.CameraTarget.Identifier(), RT_ID);
           // cmd.Blit(colorAttachment, RT_ID);
            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
        public override void OnCameraCleanup(CommandBuffer cmd)
        {
            cmd.ReleaseTemporaryRT(RT_ID);
        }
    }

    CustomRenderShaderPostPass m_ScriptablePassPost;
    CustomRenderPassCreateMesh m_ScriptablePassCreateMesh;
    CustomRenderPassRT m_ScriptablePassRenderTextrue;
    public Shader shaderPost;
    public Shader shaderMesh;
    /// <inheritdoc/>
    public override void Create()
    {
        #region 后处理效果
        m_ScriptablePassPost = new CustomRenderShaderPostPass();
        //通过创建一个渲染材质
        m_ScriptablePassPost._Material = new Material(shaderPost);
        //定义渲染的位置
        m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRendering;
        #endregion

        #region 创建网格
        m_ScriptablePassCreateMesh = new CustomRenderPassCreateMesh();
        m_ScriptablePassCreateMesh._Material = new Material(shaderMesh);
        m_ScriptablePassCreateMesh.renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
        #endregion

        #region 渲染画面
        m_ScriptablePassRenderTextrue = new CustomRenderPassRT();
        m_ScriptablePassRenderTextrue.renderPassEvent = RenderPassEvent.AfterRendering;
        #endregion

    }

    // 这里你可以在渲染器中注入一个或多个渲染通道。
    //每一帧都执行
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        //把实例化的CustomRenderPass插入渲染管线
        renderer.EnqueuePass(m_ScriptablePassRenderTextrue);
        renderer.EnqueuePass(m_ScriptablePassPost);
        renderer.EnqueuePass(m_ScriptablePassCreateMesh);

    }
}

五、RenderFeatrue参数赋值

1、VolumeComponent

在Volume中提供Render Feature读取参数数据,通过VolumeManager单列,拿到stack,可以直接取得Volume中的数据。

以修改上文后处理的饱和度和对比度为例

1)创建一个全局的Global Volume

右击Hierarchy面板空白处选择Volume→Global Volume

2)自定义一个VolumeComponent
using UnityEngine.Rendering;

public class VolumeComponentTest : VolumeComponent
{
    public ClampedFloatParameter Saturation = new ClampedFloatParameter(1f, 0, 3);
    public ClampedFloatParameter Contrast = new ClampedFloatParameter(1f, 0, 3);
}

可以在Volume中添加VolumeComponentTest组件

3)在shader中添加控制的参数

这添加了Saturation和Contrast两个控制参数

Shader "Unlit/SaturationContrastShader"
{
    Properties
    {
        _Saturation("Saturation", Range(0, 3)) = 1.0
        _Contrast("Contrast", Range(0, 3)) = 1.0
    }
    SubShader
    {
        Pass
        {
           ZTest Always ZWrite Off
            CGPROGRAM

            #pragma vertex vert_img  // 使用内置的vert_img顶点着色器
            #pragma fragment frag

            #include "UnityCG.cginc"

            float _Saturation;
            float _Contrast;
            sampler2D _CameraColorTexture; 
            //饱和度
            fixed3   Saturation_float(float3 In, float Saturation)
            {
                float luma = dot(In, float3(0.2126729, 0.7151522, 0.0721750));
                return luma.xxx + Saturation.xxx * (In - luma.xxx);
            }
            //对比度
            fixed3  Contrast_float(float3 In, float Contrast)
            {
                float midpoint = pow(0.5, 2.2);
                return (In - midpoint) * Contrast + midpoint;
            }

            fixed4 frag (v2f_img i) : SV_Target
            {
                fixed4 col = tex2D(_CameraColorTexture, i.uv);
                fixed3  Saturation =  Saturation_float(col, _Saturation);
                fixed3  Contrast = Saturation_float(Saturation, _Contrast);
                return fixed4(Contrast.x, Contrast.y, Contrast.z,0.1);
            }
            ENDCG
        }
    }
   FallBack Off
}

用shaderGraph实现的也是一样的添加两个参数

4)在RenderFeatrue中读取参数

对CustomRenderShaderPostPass修过如下

  class CustomRenderShaderPostPass : ScriptableRenderPass
    {  
        //定义渲染材质,通过Create方法赋值
        public Material _Material;
        //定义一个VolumeComponentTest
        VolumeComponentTest volumeComponentTest;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            //读取VolumeManager的单列取得stack
            var stack = VolumeManager.instance.stack;
            //为volumeComponentTest赋值
            volumeComponentTest = stack.GetComponent<VolumeComponentTest>();
            if (!volumeComponentTest) return;
            //直接从volumeComponentTest中读取数据
            _Material.SetFloat("_Saturation", volumeComponentTest.Saturation.value);
            _Material.SetFloat("_Contrast", volumeComponentTest.Contrast.value);
            //创建一个CommandBuffer
            CommandBuffer cmd = CommandBufferPool.Get("ShowShader");
            //这里有一个疑问,渲染标识符不管怎么传都不影响结果
            cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);
            //执行CommandBuffer
            context.ExecuteCommandBuffer(cmd);
            //回收CommandBuffer
            CommandBufferPool.Release(cmd);
        }
    }

实现效果

2、代码直接赋值

在RenderFeatrue中开放参数,用代码直接赋值

以后处理的饱和度和对比度为例

1)开放参数

在CustomRenderPassFeatureTest和CustomRenderShaderPostPass下分别定义饱和度和对比度,并赋值

public class CustomRenderPassFeatureTest : ScriptableRendererFeature
{
  
    //后处理效果
    class CustomRenderShaderPostPass : ScriptableRenderPass
    {  
        //定义渲染材质,通过Create方法赋值
        public Material _Material;
        public float _Contrast;
        public float _Saturation;
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            _Material.SetFloat("_Saturation", _Saturation);
            _Material.SetFloat("_Contrast", _Contrast);
            //创建一个CommandBuffer
            CommandBuffer cmd = CommandBufferPool.Get("ShowShader");
            //这里有一个疑问,渲染标识符不管怎么传都不影响结果
            cmd.Blit(colorAttachment, RenderTargetHandle.CameraTarget.Identifier(), _Material);
            //执行CommandBuffer
            context.ExecuteCommandBuffer(cmd);
            //回收CommandBuffer
            CommandBufferPool.Release(cmd);
        }
    }
    CustomRenderShaderPostPass m_ScriptablePassPost;

    public Shader shaderPost;
    public float Saturation;
    public float Contrast;
    /// <inheritdoc/>
    public override void Create()
    {
        #region 后处理效果
        m_ScriptablePassPost = new CustomRenderShaderPostPass();
        //通过创建一个渲染材质
        m_ScriptablePassPost._Material = new Material(shaderPost);
        //将饱和度和对比度赋值给CustomRenderShaderPostPass
        m_ScriptablePassPost._Contrast = Contrast;
        m_ScriptablePassPost._Saturation = Saturation;
        //定义渲染的位置
        m_ScriptablePassPost.renderPassEvent = RenderPassEvent.AfterRendering;

        #endregion
    }

    // 这里你可以在渲染器中注入一个或多个渲染通道。
    //每一帧都执行
    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        //把实例化的CustomRenderPass插入渲染管线
        renderer.EnqueuePass(m_ScriptablePassPost);
    }
}

2)对参数进行修改

//得到RenderFeatrue    
CustomRenderPassFeatureTest custom=renderData.rendererFeatures.OfType<CustomRenderPassFeatureTest>().FirstOrDefault();
//对值进行修改
custom.Saturation =0;
custom.Contrast =0;
//设置数据
custom.SetParam();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1067653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ruoyi-cloud新增模块示例(亲自操作,可行)

1.在ruoyi-modules模块下新建模块&#xff08;ruoyi-search&#xff09; 2.重命名模块的名称 3.在ruoyi-modules添加新模块依赖 4.复制ruoyi-system模块的pom文件&#xff0c;并进行修改 <?xml version"1.0" encoding"UTF-8"?> <project xmlns…

JetPack系列:001-JetPack概要介绍

文章目录 1. 概念介绍2. 主要内容2.1 框架库2.2 UI界面库 3. 核心思想4. 内容总结 本章回是一起Talk AndroidJetpack吧专栏的第一章回&#xff0c;本章回中主要介绍JetPack的基本概念和编程思想&#xff0c;同时也会介绍它的基础知识。闲话休提&#xff0c;请我们一起Talk Andr…

Mysql——创建数据库,对表的创建及字段定义、数据录入、字段增加及删除、重命名表。

一.创建数据库 create database db_classics default charsetutf8mb4;//创建数据库 use db_classics;//使用该数据库二.对表的创建及字段定义 create table if not exists t_hero ( id int primary key auto_increment, Name varchar(100) not null unique, Nickname varchar(1…

TDengine OSS 与 qStudio 实现无缝协同,革新数据分析和管理方式

在数字化转型如火如荼的当下&#xff0c;海量爆发的时序数据处理成为转型成功的关键因素之一。为了帮助社区用户更好地进行数据分析和管理&#xff0c;丰富可视化解决方案的多样性&#xff0c;我们将开源的时序数据库&#xff08;Time Series Database&#xff09; TDengine OS…

【Zookeeper专题】Zookeeper经典应用场景实战(一)

目录 前置知识课程内容一、Zookeeper Java客户端实战1.1 Zookeeper 原生Java客户端使用1.2 Curator开源客户端使用快速开始使用示例 二、Zookeeper在分布式命名服务中的实战2.1 分布式API目录2.2 分布式节点的命名2.3 分布式的ID生成器 三、zookeeper实现分布式队列3.1 设计思路…

SpringBoot集成MyBatis-Plus实现增删改查

背景 因为学习工具的时候经常需要用到jar包&#xff0c;需要增删查改接口&#xff0c;所以参考文章实现了基于mybatis-plus的增删查改接口。 参考文章&#xff1a;第二十二节:SpringBoot集成MyBatis-Plus实现增删改查 原文中的git地址不存在&#xff0c;本文内容是原文代码修…

基于Java的源代码共享平台设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言系统功能具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域…

C#学习系列相关之多线程(二)----Thread类介绍

一、线程初始化 1.无参数 static void Main(string[] args) {//第一种写法Thread thread new Thread(test);thread.Start();//第二种写法 delegateThread thread1 new Thread(new ThreadStart(test));thread1.Start();//第三种写法 lambdaThread thread2 new Thread(() >…

R语言提交后台任务Rstudio\nohup

R语言后台任务用法 在进行大规模数据分析时&#xff0c;R语言提供了后台计算的功能&#xff0c;能将计算任务提交到后台执行&#xff0c;不影响当前窗口的活动&#xff0c;而且不会受到网络波动导致任务中断&#xff0c;提交后就不用盯着一直看&#xff0c;后台运行就可以下班。…

3.1.OpenCV技能树--二值图像处理--阈值

文章目录 1.文章内容来源2.阈值分割2.1.简单阈值分割2.1.1.简单阈值分割原理介绍2.1.2.简单阈值分割核心代码2.1.3.简单阈值分割效果展示 2.2.自适应阈值分割2.2.1.自适应阈值分割原理介绍2.2.2.自适应阈值分割核心代码2.2.3.自适应阈值分割效果展示 2.3.Otsu’s二值化/大津阈值…

指针拔尖1——(看完包会,不会来打我)

文章目录 前言&#xff1a;本章节涵盖——一、指针变量基础二、字符指针三、指针数组和数组指针拓展&#xff1a;数组名和&数组名的区别四、 指针传参总结 前言&#xff1a;本章节涵盖—— 1.指针变量基础知识 2.字符指针 3.数组指针 4.指针数组 5.指针传参 一、指针变量基…

I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)

阅读前导&#xff1a; “I/O 多路复用”处于知识树中网络和操作系统的最后&#xff0c;因此本文默认读者有计算机网络和操作系统的基础。 1. 引入&#xff1a;C10K 问题 c10k 问题是指如何让一个服务器同时处理超过 10000 个客户端的连接&#xff0c;这是一个网络编程中的经…

人机环境系统智能需要新的逻辑和数学体系

人机环境系统智能需要一个新的逻辑体系&#xff0c;以应对复杂多变、高度动态和不确定性的实际应用场景。 传统逻辑体系主要基于精确的符号逻辑和精确的数学方法&#xff0c;适用于精确的、确定性的问题。但在人机环境系统智能领域&#xff0c;问题往往是复杂的、动态的&#x…

体验华为云CodeArts Check IDE插件国际化展示效果

作者&#xff1a; yd_257945187 原文链接&#xff1a;体验CodeArts Check IDE插件国际化展示效果-云社区-华为云 开发者自述 俗话说“工欲善其事&#xff0c;必先利其器”&#xff0c;把自己的IDE配置的即逼格又好看&#xff0c;是每个程序员的梦想&#xff01;IDE插件亦是如…

Leetcode hot 100之二叉树

目录 (反)序列化二叉树&#xff08;str<->tree&#xff09;&#xff1a;前序 前序遍历&#xff08;迭代&#xff09;/路径 stack.length 入栈&#xff1a;中右左 出栈&#xff1a;中左右 中序遍历&#xff08;迭代&#xff09; cur||stack.length 后序遍历&#x…

机器视觉工程师,公司设置奖金,真的为了奖励你吗?其实和你没关系

​据说某家大厂&#xff0c;超额罚款&#xff0c;有奖有罚很正常&#xff0c;但是我觉得你罚款代理商员工就不一样了&#xff0c;把代理商当成你的员工&#xff0c;我就觉得这些大厂的脑回路有问题。 有人从来没听说过项目奖金&#xff0c;更没有奖金。那么为什么设置奖金呢&a…

开源大模型正在“杀死”闭源?

点击关注 文丨郝 鑫&#xff0c;编丨刘雨琦 “OpenAI不足为惧&#xff0c;开源会慢慢赶上来。” 彼时Hugging Face创始人Clem Delangue的一句预言&#xff0c;正在迅速成为现实。 ChatGPT横空出世7个多月后&#xff0c;7月19日&#xff0c;Llama 2宣布开源&#xff0c;并且可…

OpenCV实现求解单目相机位姿

单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码&#xff0c;这里用opencv来实现最简单的位姿估计. mLeftImg cv::imread(lImg, cv::IMREAD_GRAYSCALE); mRightImg cv::imread(rImg, cv::IMREAD_GRAYSCALE); cv::Ptr<ORB> OrbLeftExtractor …

No169.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Neo4j深度学习

Neo4j的简介 Neo4j是用Java实现的开源NoSQL图数据库。从2003年开始开发&#xff0c;2007年正式发布第一版&#xff0c;其源码托管于GitHtb。Neo4j作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理、软件分析、组织和…