不透明物体的投射和接收阴影

news2024/9/27 5:02:16

1、Fallback的作用

新建一个材质球,将其的Shader设置为之前编写的多种光源综合实现Shader

并将该材质球赋值给较大的立方体使用,我们会发现该立方体不再投射阴影也不再接受阴影


(1)不投射阴影的原因
    该Shader中没有LightMode为ShaderCaster的Pass,无法参与光源的阴影映射纹理的计算
(2)不接收阴影的原因
    该Shader并没有对阴影映射相关纹理进行采样,没有进行阴影相关颜色运算

Unity会寻找LightMode为ShaderCaster的Pass来进行处理,如果该Shader没有该Pass,会在它FallBack指定的Shader中寻找,直到找到为止

在该Shader 最后加上FallBack "Specular",便可以让该立方体投射阴影(但没有接收阴影)

2、让物体投射阴影

物体向其它物体投射阴影的关键点是:
(1)需要实现 LightMode(灯光模式) 为 ShadowCaster(阴影投射) 的 Pass(渲染通道),这样该物体才能参与到光源的阴影映射纹理计算中

(2)一个编译指令,一个内置文件,三个关键宏
编译指令:#pragma multi_compile_shadowcaster
该编译指令时告诉Unity编译器生成多个着色器变体,用于支持不同类型的阴影(SM,SSSM等等),可以确保着色器能够在所有可能的阴影投射模式下正确渲染

内置文件:#include "UnityCG.cginc",其中包含了关键的阴影计算相关的宏三个关键宏:
2 - 1.V2F_SHADOW_CASTER
顶点到片元着色器阴影投射结构体数据宏,这个宏定义了一些标准的成员变量,这些变量用于在阴影投射路径中传递顶点数据到片元着色器,我们主要在结构体中使用
2 - 2.TRANSFER_SHADOW_CASTER_NORMALOFFSET
转移阴影投射器法线偏移宏,用于在顶点着色器中计算和传递阴影投射所需的变量,我们主要在顶点着色器中使用,主要做了

  • 将对象空间的顶点位置转换为裁剪空间的位置
  • 考虑法线偏移,以减轻阴影失真问题,尤其是在处理自阴影时
  • 传递顶点的投影空间位置,用于后续的阴影计算

2 - 3.SHADOW_CASTER_FRAGMENT
    阴影投射片元宏,将深度值写入到阴影映射纹理中,我们主要在片元着色器中使用

Shader "ShaderProj/4/ShadownNormal"
{
    Properties
    {
        _MainColor("MainColor", Color) = (1,1,1,1)
        _SpecularColor("SpecularColor", Color) = (1,1,1,1)
        _SpecularNum("SpecularNum", Range(0, 20)) = 1
    }
    SubShader
    {
        //Base Pass 基础渲染通道
        Pass
        {
            Tags { "LightMode"="ForwardBase" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _MainColor;
            fixed4 _SpecularColor;
            float _SpecularNum;

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 wNormal:NORMAL;
                float3 wPos:TEXCOORD0;
            };

            fixed3 getLambertColor(in float3 wNormal)
            {
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 color = _LightColor0.rgb * _MainColor.rgb * max(0, dot(wNormal, lightDir));

                return color;
            }

            fixed3 getSpecularColor(in float3 wPos, in float3 wNormal)
            {
                float3 viewDir = normalize(UnityWorldSpaceViewDir(wPos));
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

                float3 halfA = normalize(viewDir + lightDir);
                fixed3 color = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0, dot(wNormal, halfA)), _SpecularNum);

                return color;
            }

            v2f vert (appdata_base  v)
            {
                v2f data;

                data.pos = UnityObjectToClipPos(v.vertex);
                data.wNormal = UnityObjectToWorldNormal(v.normal);
                data.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                return data;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 lambertColor = getLambertColor(i.wNormal);
                fixed3 specularColor = getSpecularColor(i.wPos, i.wNormal);

                fixed atten = 1;        // 衰减值
                 //衰减值 会和 漫反射颜色 + 高光反射颜色 后 再进行乘法运算
                fixed3 BlinnPhongColor = UNITY_LIGHTMODEL_AMBIENT.rgb + (lambertColor + specularColor) * atten;

                return fixed4(BlinnPhongColor, 1);
            }
            ENDCG
        }

        //Additional Pass 附加渲染通道
        Pass
        {
            Tags { "LightMode"="ForwardAdd" }
            //线性减淡的效果 进行 光照颜色混合
            Blend One One

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdadd
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _MainColor;
            fixed4 _SpecularColor;
            float _SpecularNum;

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 wNormal:NORMAL;
                float3 wPos:TEXCOORD0;
            };

            v2f vert (appdata_base  v)
            {
                v2f data;

                data.pos = UnityObjectToClipPos(v.vertex);
                data.wNormal = UnityObjectToWorldNormal(v.normal);
                data.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                return data;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //兰伯特漫反射
                fixed3 worldNormal = normalize(i.wNormal);
                #if defined(_DIRECTIONAL_LIGHT) //平行光 光的方向 其实就是它的位置
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                #else //点光源和聚光灯 光的方向 是 光的位置 - 顶点位置
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.wPos);
                #endif
                fixed3 diffuse = _LightColor0.rgb * _MainColor.rgb * max(0, dot(worldNormal, worldLightDir));

                //BlinnPhong高光反射
                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.wPos.xyz);
                fixed3 halfDir = normalize(worldLightDir + viewDir);
                fixed3 specular = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0, dot(worldNormal, halfDir)), _SpecularNum);

                // 衰减值
                #if defined(_DIRECTIONAL_LIGHT)
                    fixed atten = 1;
                #elif defined(_POINT_LIGHT)
                    float3 lightCoord = mul(unity_WorldToLight, float4(i.wPos ,1)).xyz
                    //利用这个坐标得到距离的平方 然后再再光源纹理中隐射得到衰减值
                    fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).xx).UNITY.ATTEN_CHANNEL;
                #elif defined(_SPOT_LIGHT)
                    //将世界坐标系下顶点转到光源空间下 聚光灯需要用w参与后续计算
                    float4 lightCoord = mul(unity_WorldToLight, float4(i.wPos, 1));
                    fixed4 atten = (lightCoord.z > 0) * //判断在聚光灯前面吗
                                  tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w * //映射到大图中进行采样
                                  tex2D(_LightTextureB0, dot(lightCoord,lightCoord).xx).UNITY_ATTEN_CHANNEL; //距离的平方采样
                #else
                    fixed atten = 1;
                #endif

                //在附加渲染通道中不需要在加上环境光颜色了 因为它只需要计算一次 在基础渲染通道中已经计算了
                return fixed4((diffuse + specular)*atten, 1);
            }
            ENDCG
        }

        //主要用于进行阴影投影 主要是用来计算阴影映射纹理的
        Pass {
            Tags {"LightMode" = "ShadowCaster"}
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            //  该编译指令时告诉Unity编译器生成多个着色器变体
            //  用于支持不同类型的阴影(SM,SSSM等等)
            //  可以确保着色器能够在所有可能的阴影投射模式下正确渲染
            #pragma multi_compile_shadowcaster
            #include "UnityCG.cginc"

            struct v2f
            {
                //顶点到片元着色器阴影投射结构体数据宏
                //这个宏定义了一些标准的成员变量
                //这些变量用于在阴影投射路径中传递顶点数据到片元着色器
                //我们主要在结构体中使用
                V2F_SHADOW_CASTER;    
            };

            v2f vert(appdata_base v)
            {
                v2f data;
                //转移阴影投射器法线偏移宏
                //用于在顶点着色器中计算和传递阴影投射所需的变量
                //主要做了
                //2-2-1.将对象空间的顶点位置转换为裁剪空间的位置
                //2-2-2.考虑法线偏移,以减轻阴影失真问题,尤其是在处理自阴影时
                //2-2-3.传递顶点的投影空间位置,用于后续的阴影计算
                //我们主要在顶点着色器中使用
                TRANSFER_SHADOW_CASTER_NORMALOFFSET(data);
                return data;
            }

            float4 frag(v2f i):SV_TARGET
            {
                //阴影投射片元宏
                //将深度值写入到阴影映射纹理中
                //我们主要在片元着色器中使用
                SHADOW_CASTER_FRAGMENT(i);
            }

            ENDCG
        }
    }
    FallBack "Specular"
}

3、让物体接收阴影

所谓的投射阴影,其实就是让物体参与到光源的阴影映射纹理计算中,最终才能影响其他物体在接收阴影时的采样结果

由此可见让物体接收阴影的主要思路其实就是要从阴影隐射纹理中进行采样,然后将采样结果用于最终的颜色计算中

总体的流程就是:

  • 在顶点着色器中进行顶点坐标转换(将顶点坐标 转换为 阴影映射纹理坐标)
  • 在片元着色器中使用阴影映射纹理坐标在阴影映射纹理中进行采样,通过得到的深度值判断片元(像素)是否在阴影中,以计算出阴影衰减值
  • 将采样结果参与到最终的颜色计算中

实现物体接收阴影效果

(1)接受阴影的三剑客(三个宏)

首先我们需要在Base Pass当中引用包含内置文件:# include "AutoLight.cginc",该内置文件中,有用于计算阴影时需要使用的三剑客

1 - 1.SHADOW_COORDS(阴影坐标宏)
        该宏在v2f结构体(顶点着色器返回值)中使用
        本质上就是声明了一个用于对阴影纹理进行采样的坐标
        在内部实际上就是声明了一个名为_ShadowCoord的阴影纹理坐标变量
        需要注意的是:
        在使用时 SHADOW_COORDS(2) 传入参数2
        表示需要时下一个可用的插值寄存器的索引值

1 - 2.TRANSFER_SHADOW(转移阴影宏)
        该宏在顶点着色器函数中调用,传入对应的v2f结构体对象
        该宏会在内部自己判断应该使用哪种阴影映射技术(SM、SSSM)
        最终的目的就是将顶点进行坐标转换并存储到_ShadowCoord阴影纹理坐标变量中
        需要注意的是:

  •  该宏会在内部使用顶点着色器中传入的结构体,该结构体中顶点的命名必须是vertex
  •  该宏会在内部使用顶点着色器的返回结构体,其中的顶点位置命名必须是pos

1 - 3.SHADOW_ATTENUATION(阴影衰减宏)
        该宏在片元着色器中调用,传入对应的v2f结构体对象
        该宏会在内部利用v2f中的 阴影纹理坐标变量(ShadowCoord)对相关纹理进行采样
        将采样得到的深度值进行比较,以计算出一个fixed3的阴影衰减值
        我们只需要使用它返回的结果和(漫反射 + 高光反射) 的结果相乘即可

(2)注意
目前处理的方式只是大致了解接受阴影的流程,还没有对 Additional Pass 附加渲染通道进行处理

Shader "ShaderProj/4/ShadownNormalReceiver"
{
    Properties
    {
        _MainColor("MainColor", Color) = (1,1,1,1)
        _SpecularColor("SpecularColor", Color) = (1,1,1,1)
        _SpecularNum("SpecularNum", Range(0, 20)) = 1
    }
    SubShader
    {
        //Base Pass 基础渲染通道
        Pass
        {
            Tags { "LightMode"="ForwardBase" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            //引用包含该内置文件 其中有计算阴影会用到的三个宏(阴影三剑客)
            #include "AutoLight.cginc"

            fixed4 _MainColor;
            fixed4 _SpecularColor;
            float _SpecularNum;

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 wNormal:NORMAL;
                float3 wPos:TEXCOORD0;
                // 该宏在v2f结构体(顶点着色器返回值)中使用
                // 本质上就是声明了一个用于对阴影纹理进行采样的坐标
                // 在内部实际上就是声明了一个名为_ShadowCoord的阴影纹理坐标变量
                // 需要注意的是:
                // 在使用时 SHADOW_COORDS(2) 传入参数2
                // 表示需要时下一个可用的插值寄存器的索引值   
                // 阴影坐标宏 主要用于存储阴影纹理坐标
                SHADOW_COORDS(2)
            };

            fixed3 getLambertColor(in float3 wNormal)
            {
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                fixed3 color = _LightColor0.rgb * _MainColor.rgb * max(0, dot(wNormal, lightDir));

                return color;
            }

            fixed3 getSpecularColor(in float3 wPos, in float3 wNormal)
            {
                float3 viewDir = normalize(UnityWorldSpaceViewDir(wPos));
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

                float3 halfA = normalize(viewDir + lightDir);
                fixed3 color = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0, dot(wNormal, halfA)), _SpecularNum);

                return color;
            }

            v2f vert (appdata_base  v)
            {
                v2f data;

                data.pos = UnityObjectToClipPos(v.vertex);
                data.wNormal = UnityObjectToWorldNormal(v.normal);
                data.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                // 该宏在顶点着色器函数中调用,传入对应的v2f结构体对象
                // 该宏会在内部自己判断应该使用哪种阴影映射技术(SM、SSSM)
                // 最终的目的就是将顶点进行坐标转换并存储到_ShadowCoord阴影纹理坐标变量中
                // 需要注意的是:
                // 1.该宏会在内部使用顶点着色器中传入的结构体
                //   该结构体中顶点的命名必须是vertex
                // 2.该宏会在内部使用顶点着色器的返回结构体
                //   其中的顶点位置命名必须是pos
                //计算阴影映射纹理坐标 它会在内部去进行计算 然后将其存入 v2f中的SHADOW_COORDS中
                TRANSFER_SHADOW(data)

                return data;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 lambertColor = getLambertColor(i.wNormal);
                fixed3 specularColor = getSpecularColor(i.wPos, i.wNormal);

                // 得到阴影衰减值
                // 该宏在片元着色器中调用,传入对应的v2f结构体对象
                // 该宏会在内部利用v2f中的 阴影纹理坐标变量(ShadowCoord)对相关纹理进行采样
                // 将采样得到的深度值进行比较,以计算出一个fixed3的阴影衰减值
                // 我们只需要使用它返回的结果和 (漫反射+高光反射) 的结果相乘即可
                float3 shadow = SHADOW_ATTENUATION(i);

                fixed atten = 1;        // 衰减值
                 //衰减值 会和 漫反射颜色 + 高光反射颜色 后 再进行乘法运算
                fixed3 BlinnPhongColor = UNITY_LIGHTMODEL_AMBIENT.rgb + (lambertColor + specularColor) * atten * shadow;

                return fixed4(BlinnPhongColor, 1);
            }
            ENDCG
        }

        //Additional Pass 附加渲染通道
        Pass
        {
            Tags { "LightMode"="ForwardAdd" }
            //线性减淡的效果 进行 光照颜色混合
            Blend One One

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdadd
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _MainColor;
            fixed4 _SpecularColor;
            float _SpecularNum;

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 wNormal:NORMAL;
                float3 wPos:TEXCOORD0;
            };

            v2f vert (appdata_base  v)
            {
                v2f data;

                data.pos = UnityObjectToClipPos(v.vertex);
                data.wNormal = UnityObjectToWorldNormal(v.normal);
                data.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                return data;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //兰伯特漫反射
                fixed3 worldNormal = normalize(i.wNormal);
                #if defined(_DIRECTIONAL_LIGHT) //平行光 光的方向 其实就是它的位置
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                #else //点光源和聚光灯 光的方向 是 光的位置 - 顶点位置
                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.wPos);
                #endif
                fixed3 diffuse = _LightColor0.rgb * _MainColor.rgb * max(0, dot(worldNormal, worldLightDir));

                //BlinnPhong高光反射
                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.wPos.xyz);
                fixed3 halfDir = normalize(worldLightDir + viewDir);
                fixed3 specular = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0, dot(worldNormal, halfDir)), _SpecularNum);

                // 衰减值
                #if defined(_DIRECTIONAL_LIGHT)
                    fixed atten = 1;
                #elif defined(_POINT_LIGHT)
                    float3 lightCoord = mul(unity_WorldToLight, float4(i.wPos ,1)).xyz
                    //利用这个坐标得到距离的平方 然后再再光源纹理中隐射得到衰减值
                    fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).xx).UNITY.ATTEN_CHANNEL;
                #elif defined(_SPOT_LIGHT)
                    //将世界坐标系下顶点转到光源空间下 聚光灯需要用w参与后续计算
                    float4 lightCoord = mul(unity_WorldToLight, float4(i.wPos, 1));
                    fixed4 atten = (lightCoord.z > 0) * //判断在聚光灯前面吗
                                  tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w * //映射到大图中进行采样
                                  tex2D(_LightTextureB0, dot(lightCoord,lightCoord).xx).UNITY_ATTEN_CHANNEL; //距离的平方采样
                #else
                    fixed atten = 1;
                #endif

                //在附加渲染通道中不需要在加上环境光颜色了 因为它只需要计算一次 在基础渲染通道中已经计算了
                return fixed4((diffuse + specular)*atten, 1);
            }
            ENDCG
        }
    }
    FallBack "Specular"
}

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

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

相关文章

Rust编程的if选择语句

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 Rust语言实现选择结构时,根据某种条件的成立与否而采用不同的程序段进行…

【Kubernetes】日志平台EFK+Logstash+Kafka【实战】

一,环境准备 (1)下载镜像包(共3个): elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz (2)在node节点导入镜像: ctr -nk8s.io images i…

解决sortablejs+el-table表格内限制回撤和拖拽回撤失败问题

应用场景: table内同一类型可拖拽,不支持不同类型拖拽(主演可拖拽交换位置,非主演和主演不可交换位置),类型不同拖拽效果需还原,试了好几次el-table数据更新了,但是表格样式和数据不能及时保持…

Java面试题之JVM面试题

JVM 的主要作用是什么? JVM 就是 Java Virtual Machine(Java虚拟机)的缩写,JVM 屏蔽了与具体操作系统平台相关的信息,使 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码)&#xff0…

uniapp 常用高度状态栏,导航栏,tab栏,底部安全高度

实际效果 使用 //使用 let posConfig this.getPosConfig(); // 传false返回值为 px大小 console.log(posConfig.safeBottomH) // 入参 是否转换为rpxgetPosConfig(toRpx true) {const systemInfo uni.getSystemInfoSync();// #ifdef MPconst menuButtonInfo uni.getMenuBu…

Hello Algorithm:Capture 1,2 初识算法

大家好 :) 自学完sklearn的基本使用后,颇感无趣。虽有阅文几篇,却无所获。遂于24年9月26日决习hello algorithm。 :) 好了,不开玩笑了。其实开设这篇专栏我也不知道有没有什么意义。其实是因为最近在读TaskWeaver&…

关于最小二乘法

最小二乘法的核心思想简单而优雅:我们希望找到一条最佳的曲线,使其尽可能贴近所有的数据点。想象一下,当你在画布上描绘一条线,目标是让这条线与点的距离最小。数学上,这可以表示为: 在这个公式中&#xff…

Eclipse Memory Analyzer (MAT)提示No java virtual machine was found ...解决办法

1,下载mat后安装,打开时提示 jdk版本低,需要升级到jdk17及以上版本,无奈就下载了jdk17,结果安装后提示没有jre环境,然后手动生成jre目录,命令如下: 进入jdk17目录:执行&…

SpringBoot的基础(自动配置)

SpringBootApplication注解 是一个组合注解,其中EnableAutoConfiguration让SpringBoot根据类路径中的jar包依赖为当前项目进行自动配置 例如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和SpringMVC的依赖 添加了spring-boot-start…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第四篇-着色器投影-接收阴影部分】

上一章中实现了体积渲染的光照与自阴影,那我们这篇来实现投影 回顾 勘误 在开始本篇内容之前,我已经对上一章中的内容的错误进行了修改。为了确保不会错过这些更正,同时也避免大家重新阅读一遍,我将在这里为大家演示一下修改的…

LeetCode - 850 矩形面积 II

题目来源 850. 矩形面积 II - 力扣(LeetCode) 题目描述 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该…

灵当CRM index.php接口SQL注入漏洞复现 [附POC]

文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…

数据治理003-数据域

数据仓库是面向主题(数据综合、归类并进行分析利用的抽象)的应用。 数据仓库模型设计除横向的分层外,通常也需要根据业务情况进行纵向划分数据域。数据域是联系较为紧密的数据主题的集合,通常是根据业务类别、数据来源、数据用途…

001、视频添加字幕

1. 腾讯智影 (可用) https://zenvideo.qq.com/ 1.1 操作步骤 https://zenvideo.qq.com/ https://zenvideo.qq.com/my/material?typeexport 上传资源 自动字幕识别 修改字幕 下载字幕 上传字幕 https://zenvideo.qq.com/my/material?typeexport 2. 秒剪–手机版app &a…

【Python-GUI图形化界面-PyQt5模块(3)】——Qwidget核心模块

本文旨在带大家学习Python中的一种GUI图形化界面模块——PyQt5模块,将为大家详细了解PyQt5模块中函数的参数和使用: 一、PyQt5简介 PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。 官方网站&a…

Win32打开UWP应用

最近无意间发现Windows里一个神奇的文件夹。 shell:appsfolder 运行打开 这个文件夹后,你可以看到本机安装的所有应用程序。 我觉得这个挺方便的,所以做了一个简单的appFolderDialog包给C#用 项目地址:https://github.com/TianXiaTech/App…

大数据毕业设计选题推荐-内蒙古旅游景点数据分析系统-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【有啥问啥】深度理解主动学习:机器学习的高效策略

深度理解主动学习:机器学习的高效策略 在大数据时代,数据量的爆炸性增长与有限的标注资源之间的矛盾日益凸显。如何高效地利用标注资源来训练高质量的模型,成为了机器学习领域亟待解决的问题。主动学习(Active Learning, AL&…

Oracle RMAN 无敌备份脚本

1 说明 上一篇文章:Oracle逻辑备份脚本,介绍了如何部署Oracle数据库的逻辑备份脚本,在数据迁移场景下十分好用,但是作为备份来说有点牵强。仅仅有逻辑备份时,当故障发生后,逻辑备份恢复只能恢复到某一时刻…

网络资源模板--Android Studio 飞机大战游戏

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--飞机大战 二、项目测试环境 三、项目详情 首页 1. **继承 Activity**: - SecondActivity 类继承自 Activity,表示一个新的屏幕或界面。 2. **重写 onCrea…