UnityShader基础(五)——进阶纹理

2023-11-08

一、立方体纹理

        立方体纹理是环境映射的一种实现方式,立方体纹理就是立方体的六个面,每个面有一个纹理,一般用于映射出物体周围环境。

        和基础纹理不同,采样立方体纹理需要一个三维坐标,而这个三维坐标由一条向量与立方体的交点构成,注意采样时,向量是由立方体内的某一点发出,向外指的,不是立方体外的某一点指向立方体内部。

        关于凹物体可能会反射自身的问题不做讨论。

        Unity里的天空盒就是一种立方体纹理,将整个场景包围在一个立方体内。

        1.1 创建立方体纹理:

                立方体纹理主要用于环境映射,说白点就是让一个物体表面反射出周围环境的样子,但每个物体在不同地方的采样立方体纹理有差距,因此要用脚本辅助截取当前物体所处位置的立方体纹理。

                脚本:        

using UnityEngine;
using UnityEditor;
using System.Collections;

public class RenderCubemapWizard : ScriptableWizard {
	
	public Transform renderFromPosition;
	public Cubemap cubemap;
	
	void OnWizardUpdate () {
		helpString = "Select transform to render from and cubemap to render into";
		isValid = (renderFromPosition != null) && (cubemap != null);
	}
	
	void OnWizardCreate () {
		
		GameObject go = new GameObject( "CubemapCamera");
		
		go.AddComponent<Camera>();
		
		go.transform.position = renderFromPosition.position;
			
		go.GetComponent<Camera>().RenderToCubemap(cubemap);
		
		DestroyImmediate( go );
	}
	
	[MenuItem("GameObject/Render into Cubemap")]
	static void RenderCubemap () {
		ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
			"Render cubemap", "Render!");
	}
}

                通过继承窗口编辑器实现。

        1.2 利用反射采样立方体纹理:

                利用入射方向(说反射更合理)求采样坐标,我们知道反射方向就是视角方向,根据光路可逆可以求出立方体纹理的哪个点发出的光线进入人眼,而这个点纹理颜色,就是这个片元或者说顶点的颜色,但注意采样时的向量是向外发散的,如果你计算的时候没有对视角方向取反,那么就需要对入射方向取反(取决于你在那个阶段计算),入射方向无需单位化 。       

Shader "Custom/Test0"
{
    Properties
    {
        _Color("Color",Color)=(1,1,1,1)
        _CubemapColor("立方体纹理颜色",Color)=(1,1,1,1)
        //越强越能看出周围环境
        _ReflectLevel("立方体纹理反射水平",Range(0,1))=1
        _Cubemap("立方体纹理",Cube)="_Skybox"{}
        
    }
    SubShader
    {
        
        Pass
        {
            Tags{"LightMode"="ForwardBase" }
            

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"
            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            samplerCUBE _Cubemap;
            fixed4 _CubemapColor;
            fixed _ReflectLevel;

            fixed _AlphaBlend;

            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;                
            };
 
            struct v2f
            {
                float4 pos:SV_POSITION;
                float4 worldPos:TEXCOORD0;
                float3 worldNormal :TEXCOORD1;
                float3 texDir:TEXCOORD2;                                    
            };
            
            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
               
                o.worldNormal = UnityObjectToWorldNormal(v.normal);

                o.worldPos=mul(unity_ObjectToWorld,v.vertex);

                float3 worldViewDir=UnityWorldSpaceViewDir(o.worldPos);
                                                             
                o.texDir=reflect(-worldViewDir,o.worldNormal);

                return o;
                
            }
 
            fixed4 frag(v2f i):SV_Target
            {                
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.rgb;
                
                fixed3 worldNormal=normalize(i.worldNormal);
                
                fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);               
                                                
                fixed3 refleResult=texCUBE(_Cubemap,i.texDir)*_CubemapColor;                               
                
                fixed3 diffuse=_LightColor0*_Color
                            *(0.5*dot(worldLightDir,worldNormal)+0.5);
                fixed3 color=ambient+lerp(diffuse,refleResult,_ReflectLevel);
                
                return fixed4(color,1);
                
            }
            
            ENDCG
        }
    }
}

        1.3 利用折射采样立方体纹理:

                立方体纹理的某一点经过物体内部的折射,最终进入摄像机,过程也是求入射方向是哪个点发出的,同样我们也知道反射方向。

                折射公式:\eta _{_{1}}sin\Theta _{1}=\eta _{_{2}}sin\Theta _{2}

                Cg函数: refract(入射方向,法线方向,\eta _{1}/\eta _{2});        

Shader "Custom/Test0"
{
    Properties
    {
        _Color("Color",Color)=(1,1,1,1)
        _CubemapColor("立方体纹理颜色",Color)=(1,1,1,1)
        //越强越能看出周围环境
        _RefractLevel("立方体纹理折射水平",Range(0,1))=1
        _Cubemap("立方体纹理",Cube)="_Skybox"{}
        _RefractRatio("介质比值",Range(0,1))=0.5
        
    }
    SubShader
    {
        
        Pass
        {
            Tags{"LightMode"="ForwardBase" }
            

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"
            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            samplerCUBE _Cubemap;
            fixed4 _CubemapColor;
            fixed _RefractLevel;
            fixed _RefractRatio;
   

            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;                
            };
 
            struct v2f
            {
                float4 pos:SV_POSITION;
                float4 worldPos:TEXCOORD0;
                float3 worldNormal :TEXCOORD1;
                float3 texDir:TEXCOORD2;                                    
            };
            
            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
               
                o.worldNormal = UnityObjectToWorldNormal(v.normal);

                o.worldPos=mul(unity_ObjectToWorld,v.vertex);

                float3 worldViewDir=UnityWorldSpaceViewDir(o.worldPos);
                                                             
                o.texDir=refract(normalize(-worldViewDir),normalize(o.worldNormal),_RefractRatio);

                return o;
                
            }
 
            fixed4 frag(v2f i):SV_Target
            {                
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.rgb;
                
                fixed3 worldNormal=normalize(i.worldNormal);
                
                fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);               
                                                
                fixed3 refleResult=texCUBE(_Cubemap,i.texDir)*_CubemapColor;                               
                
                fixed3 diffuse=_LightColor0*_Color
                            *(0.5*dot(worldLightDir,worldNormal)+0.5);
                fixed3 color=ambient+lerp(diffuse,refleResult,_RefractLevel);
                
                return fixed4(color,1);
                
            }
            
            ENDCG
        }
    }
}

        1.4 利用菲涅尔反射控制立方体采样:

                菲涅尔,通常指的是反射光和入射光存在一定比例,比如水面,当我们站在不同角度看,有些角度可以看到水面下,有些角度就是一片白太阳光全反射。

                F_{Schlick}(v\cdot n)=F_{0}+(1-F_{0})(1-v\cdot n)^{5}

Shader "Custom/Test0"
{
    Properties
    {
        _Color("Color",Color)=(1,1,1,1)
        _CubemapColor("立方体纹理颜色",Color)=(1,1,1,1)
        //越强越能看出周围环境
        _FresnelScale("菲涅尔系数",Range(0,1))=1
        _Cubemap("立方体纹理",Cube)="_Skybox"{}
        
    }
    SubShader
    {
        
        Pass
        {
            Tags{"LightMode"="ForwardBase" }
            

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"
            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            samplerCUBE _Cubemap;
            fixed4 _CubemapColor;
            fixed _FresnelScale;        
   

            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;                
            };
 
            struct v2f
            {
                float4 pos:SV_POSITION;
                float4 worldPos:TEXCOORD0;
                float3 worldNormal :TEXCOORD1;
                float3 worldViewDir :TEXCOORD2;
                float3 texDir:TEXCOORD3;                                    
            };
            
            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
               
                o.worldNormal = UnityObjectToWorldNormal(v.normal);

                o.worldPos=mul(unity_ObjectToWorld,v.vertex);

                o.worldViewDir=UnityWorldSpaceViewDir(o.worldPos);
                                                             
                o.texDir=reflect(-o.worldViewDir,o.worldNormal);

                return o;
                
            }
 
            fixed4 frag(v2f i):SV_Target
            {                
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.rgb;
                
                fixed3 worldNormal=normalize(i.worldNormal);

                i.worldViewDir=normalize(i.worldViewDir);
                
                fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);

                fixed fresnel=_FresnelScale+(1-_FresnelScale)*pow(1-dot(i.worldViewDir,i.worldNormal),5);               
                                                
                fixed3 refleResult=texCUBE(_Cubemap,i.texDir)*_CubemapColor;                               
                
                fixed3 diffuse=_LightColor0*_Color
                            *dot(worldLightDir,worldNormal);
                fixed3 color=ambient+lerp(diffuse,refleResult,saturate(fresnel));
                
                return fixed4(color,1);
                
            }
            
            ENDCG
        }
    }
}

                当菲涅尔系数为0时,物体就只有边缘可以反射立方体纹理,从而实现了边缘发光。当然不是只有立方体纹理可以用边缘发光,最终Lerp插值那里可以是随便一个颜色。而且菲涅尔也不一定非要用立方体纹理这种混合方式,随便一张纹理什么的也可以。反正图形学第一准则:如果这个东西看起来是对的,那么它就是对的。

二、渲染纹理

        就是Unity内置的Render Texture,即把场景渲染到一张纹理中,Unity允许我们在场景渲染中或者渲染完毕时获取当前的渲染图像用于做一些特殊操作。

        创建Render Texture的方法。一个是在Assets里创建,然后用摄像机填充,另一个是在Shader中使用GrabPass命令或者脚本内的OnRenderImage函数。

        在这里我们使用第一种方法,因为简单,而且适用于只需要一次抓取就能解决情况的Shader,一般OnRenderImage适用于需要对渲染纹理做出多次处理,在后面我们会遇到。其次,GrabPass多用于配合内置函数实现局部渲染纹理的抓取,而后者多用于整个图像的处理。

        关于渲染纹理能做的事情,这里只举两个例子,一个是类似的镜子反射,即用一个摄像机拍出来背面,然后用一个面片当镜子显示渲染纹理。    

Shader "Custom/Test0"
{
    Properties
    {
        _RenderTex("渲染纹理",2D)="white"{}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            sampler2D _RenderTex;
            float4 _RenderTex_ST;            
            struct a2v
            {
                float4 vertex:POSITION;
                float2 texcoord:TEXCOORD0;
            };
 
            struct v2f
            {
                float4 pos:SV_POSITION;
                float2 uv:TEXCOORD3;
            };
            
            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);               
                o.uv=TRANSFORM_TEX(v.texcoord,_RenderTex);
                o.uv.x=1-o.uv.x;
                return o;
                
            }
 
            fixed4 frag(v2f i):SV_Target
            {                
                return tex2D(_RenderTex,i.uv);                
            }
            
            ENDCG
        }
    }
}

        这样写其实不是完整的镜子,有很大的局限性,首先镜面的显示内容受面片大小以及纹理的大小影响,你要不停的调整摄像机参数来达成镜子中比较真实的物体的大小,其次,你一旦转动视角,镜子内的画面并不会随之改变,从镜子的成像原理上也可以解释这种实现方法的不真实性。

        第二个是玻璃折射效果,这个理解起来复杂一些。我们平常看玻璃,光线进入我们的眼睛中可以分为两种主要类型:一个是玻璃后面物体透过玻璃的折射光线,一个是玻璃表面的反射环境的反射光线。

        反射光线好说,用立方体纹理采个样。

        折射光线的模拟稍微复杂,就是利用内置函数抓取玻璃后面的图像,然后用玻璃的法线贴图给玻璃后面的图像做一个偏移或者说扰动。这里涉及渲染顺序的问题,我们要等所有不透明物体(当然,你要是想模拟透明物体的折射效果就把渲染顺序再往后设一级)渲染完毕后抓取当时的渲染纹理,然后用我们的法线贴图和采样纹理相加模拟出偏移效果。        

Shader "Custom/Test0"
{
    Properties
    {
        _MainTex("主要纹理",2D)="white"{}
        _NormalTex("法线贴图",2D)="bump"{}
        _CubeMap("立方体纹理",Cube)="_Skybox"{}
        _RefractLevel("折射程度",Range(0,100))=50
        _FinalScale("反射与折射的混合比例",Range(0,1))=0.5
    }
    SubShader
    {
        Tags{"Queue"="Transparent" "RenderType"="Opaque"}
        
        GrabPass{"_RefractionTex"}
        
        Pass
        {
            CGPROGRAM           
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D _NormalTex;
            float4 _NormalTex_ST;

            sampler2D _RefractionTex;
            float4 _RefractionTex_TexelSize;
            
            samplerCUBE _CubeMap;

            fixed _RefractLevel;
            fixed _FinalScale;
        
            
            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float4 tangent:TANGENT;
                float2 texcoord:TEXCOORD0;
            };
 
            struct v2f
            {
                float4 pos:SV_POSITION;                
                float4 uv:TEXCOORD0;
                float4 scrPos:TEXCOORD1;
                float4 worldPos:TEXCOORD2;
                float3 worldNormal:TEXCOORD3;
            };
            
            v2f vert(a2v v)
            {
                v2f o;                
                
                o.pos=UnityObjectToClipPos(v.vertex);
 
                o.worldPos=mul(unity_ObjectToWorld,v.vertex);
 
                o.worldNormal=UnityObjectToWorldNormal(v.normal);                
                                                               
                o.uv.xy=TRANSFORM_TEX(v.texcoord,_MainTex);
                
                o.uv.zw=TRANSFORM_TEX(v.texcoord,_NormalTex);

                o.scrPos=ComputeGrabScreenPos(o.pos);
                       
                return o;

            }
 
            fixed4 frag(v2f i):SV_Target
            {                
                float3 worldViewDir=normalize(UnityWorldSpaceViewDir(i.worldPos));
                fixed3 tangentNormal=UnpackNormal(tex2D(_NormalTex,i.uv.zw));
                
                //折射部分
                fixed2 offset=tangentNormal.xy*_RefractLevel*_RefractionTex_TexelSize.xy;
                i.scrPos.xy=offset+i.scrPos.xy;
                fixed3 refract=tex2D(_RefractionTex,i.scrPos.xy/i.scrPos.w);
                
                //反射部分                
                fixed3 reflectionDir=reflect(-worldViewDir,i.worldNormal);
                fixed4 texColor=tex2D(_MainTex,i.uv.xy);
                fixed3 reflection=texCUBE(_CubeMap,reflectionDir)*texColor;

                //最终结果
                fixed3 finalColor=reflection*(1-_FinalScale)+refract*_FinalScale;

                return fixed4(finalColor,1);

            }
            
            ENDCG
        }
    }
}

        渲染纹理能实现的效果非常非常多。

        关于GrabPass更加详细的解释,(32条消息) Unity Shader GrabPass 使用注意的问题_Jave.Lin的博客-CSDN博客_grab pass 与 rt的区别        总结大概就是,GrabPass{ }和GrabPass{ "Name" }的区别,前者会向多张纹理输出,彼此互不干扰,后者是只要纹理名字一样,全给渲染到给定名字的纹理中。这里就会涉及到一个叠加问题,前者的结果如果物体重合多个会产生纹理叠加现象,但后者并不会。性能方面后者会更好,而前者好像还增加了DrawCall等等什么的。

        关于采样渲染纹理时使用的函数ComputeGrabScreenPos的作用,输入齐次裁剪空间下的坐标,转化为对应屏幕采样的uv坐标,这个uv坐标需要除以w分量才可以使用,Unity在计算时为了不破坏插值并未在计算时除以w分量。关于这个计算过程,网上很多博客都解释的很清楚,这里就不再赘述了。

        关于另一个函数ComputeScreenPos的作用,去官网查了查,Unity的意思是尽量使用ComputeGrabScreenPos函数,因为后者会在某些情况下出现纹理翻转问题。

三、程序纹理

        指计算机生成的图像一般用于创建个性图案或非常真实的自然元素,例如石子,木头等等,了解即可。

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

UnityShader基础(五)——进阶纹理 的相关文章

  • 【Unity2d】带你制作一款类似于金山打字的小游戏

    博主大概08年开始接触电脑游戏 当时玩的是我哥的电脑 那时候家里没网 只可以玩电脑上自带的单机游戏 比如扫雷 蜘蛛纸牌等等 当然还有红色警戒 冰封王座 星际争霸 帝国崛起等等 这些大概是我哥当时在大学下载的 也是那个时候对游戏充满了兴趣 记
  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • c#获取cpu序列号

  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • Java private方法访问

    大家知道 Java中private修饰符修饰的方法或属性 只有在该类内可以访问 其他类均无法访问 事实真的是这样吗 下面一个例子可以实现访问一个类中的private方法 原理是通过Java的反射机制 感觉Java反射机制在这点似乎不太安全
  • 手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码

    文章目录 前言 一 物体识别算法原理概述 1 物体识别的概念 2 Yolo算法原理概述 二 opencv调用darknet物体识别模型 yolov3 yolov4 1 darknet模型的获取 2 python调用darknet模型实现物体
  • 深度学习环境配置1——windows下的tensorflow-gpu=1.13.2环境配置

    深度学习环境配置1 windows下的tensorflow gpu 1 13 2环境配置 注意事项 一 2021 9 11更新 二 2021 7 8更新 三 2020 11 5更新 学习前言 环境内容 环境配置 一 Anaconda安装 1
  • Android - Session 'app': Error Installing APK或installaion failed intall_parse_failed_manifest_的解决方法

    在Android Studio中启动模拟器的时候偶尔会遇到以下的问题 1 installaion failed with message intall parse failed manifest malformed 2 Session ap
  • 【Linux:进程间信号】

    文章目录 1 生活角度的信号 2 技术应用角度的信号 3 信号的产生 3 1 由系统调用向进程发信号 3 1 1 signal 3 1 2 kill 3 1 3 raise 3 2 由软件条件产生信号 3 3 硬件异常产生信号 3 4 通过
  • Git使用操作规范

    一 创建自己的开发分支 1 1 配置Git环境 1 1 1 Windows平台上安装 1 1 2 Linux平台上安装 1 1 3 Mac平台上安装 1 1 4 基本概念名词解释 Git 工作区 暂存区和版本库 工作区 就是你在电脑里能看到
  • Unity UGUI 无限循环列表 ----------多功能版

    一共有四种 循环列表 如下图 1 常用循环列表 2 收展嵌套 循环列表 3 弹框 循环列表 4 翻页 循环列表 注意点 1 层次结构如下图 2 Content 和 Item 控件锚点必须为如图 使用方式 只举例常用列表 其他列表查看 GIt
  • JDE(Towards Real-Time Multi-Object Tracking)代码训练——小白必看

    前言 自己在跑JDE多目标跟踪代码时 总结的方法和教训 一 数据集制作 1 可直接下载作者给的数据集 是制作好的 论文链接 https arxiv org pdf 1909 12605v1 pdf 代码链接 https github com
  • 如何使用oracle修改表字段长度

    系列文章目录 ORACLE简介 Oracle是一种关系数据库管理系统 RDBMS 广泛应用于企业应用程序中 它是由甲骨文公司在20世纪70年代末开发的 自此成为世界上最流行的数据库系统之一 Oracle以其可扩展性 可靠性和安全性而闻名 它
  • USB无线网卡的用途及编程实现

    USB无线网卡是一种设备 它可以通过USB接口连接到计算机 并提供无线网络连接功能 在本文中 我们将探讨USB无线网卡的用途以及如何通过编程实现相关功能 用途 提供无线网络连接 USB无线网卡允许计算机通过无线信号连接到网络 这对于那些没有
  • 【Java】------- Base64格式图片保存到服务器文件

    一 使用技术 Java Springboot 二 代码实例 fun base64ToImage base64转成图片格式 提示 data image png base64 的前缀要去掉 param imgBase64 base64 数据 p
  • Griffin 数据管理任务的SQL和原理

    文章目录 各种Measure内部计算原理 accuracy completeness distinct timeliness uniqueness profiling spark sql pre proc Service 任务管理模块 配置
  • JUC常用到的类

    JUC java util concurrent 并发包中包含了许多并发编程中需要用到的类 锁 如ReentratLock ReadWriteLock ReentrantLock重入锁 可以替代synchronized使用 并且有更多强大的
  • 在windows内使用virtualbox搭建安卓x86--以及所遇到的问题解决--3

    一 ARM兼容包的植入 1 下载arm包 2 安装arm兼容包 3 验证arm兼容包是否移植成功 二 触屏无效 三 玩游戏卡顿严重 一 ARM兼容包的植入 在AndroidX86系统内大部分应用 国内 并没有适配X86架构 安装基于arm架
  • Python实验作业

    Python实验作业 1 实验题目 中文数字对照表 输入一个数字 转换成中文数字 比如 1234567890 gt 壹贰叁肆伍陆柒捌玖零 chinese number 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 numeber input 请输
  • Vue-组件

    Vue 组件 组件之间的父子关系 使用组件的三个步骤 私有组件 通过components 注册的是私有子组件 全局组件 在vue 项目的main js 入口文件中 通过Vue component 方法 可以注册全局组件 import Vue
  • 【css面试题】实现2栏布局 右侧自适应; 3栏布局 中间自适应

    2栏布局 右侧自适应 flex grid table float div class son1 div
  • ROS 中写 python 的 roslaunch

    文章目录 1 必看教程 快速入门 1 1 快速入门ROS的视频教程 里面有一节是专门讲 roslaunch 的 https www bilibili com video av59458869 1 2 PDF文档 How to create
  • Chisel(四)Scala语法 操作符

    学习更多相关知识 关注博主知乎账号 用户名Trustintruth https www zhihu com people suo yi xin 90 activities Scala追求的是纯粹的面向对象 不推荐不属于面向对象的基本类型及其
  • UnityShader基础(五)——进阶纹理

    一 立方体纹理 立方体纹理是环境映射的一种实现方式 立方体纹理就是立方体的六个面 每个面有一个纹理 一般用于映射出物体周围环境 和基础纹理不同 采样立方体纹理需要一个三维坐标 而这个三维坐标由一条向量与立方体的交点构成 注意采样时 向量是由