redhat9i 发表于 2022-4-28 08:15

Unity exe程序背景透明化+鼠标穿透

转:https://blog.csdn.net/www1501766557/article/details/108308060
Shader "Custom/MakeTransparent" {Properties {    _MainTex ("Base (RGB)", 2D) = "white" {}    _TransparentColorKey ("Transparent Color Key", Color) = (0,1,0,1)    _TransparencyMargin ("Transparency Margin", Float) = 0.01   }SubShader {    Pass {      Tags { "RenderType"="Opaque" }      LOD 200          CGPROGRAM      #pragma vertex VertexShaderFunction      #pragma fragment PixelShaderFunction          #include "UnityCG.cginc"      struct VertexData      {      float4 position : POSITION;      float2 uv : TEXCOORD0;      };      struct VertexToPixelData      {      float4 position : SV_POSITION;      float2 uv : TEXCOORD0;      };      VertexToPixelData VertexShaderFunction(VertexData input)      {      VertexToPixelData output;      output.position = UnityObjectToClipPos (input.position);      output.uv = input.uv;      return output;      }          sampler2D _MainTex;      float3 _TransparentColorKey;      float _TransparencyMargin;      float4 PixelShaderFunction(VertexToPixelData input) : SV_Target      {      float4 color = tex2D(_MainTex, input.uv);            float deltaR = abs(color.r - _TransparentColorKey.r);      float deltaG = abs(color.g - _TransparentColorKey.g);      float deltaB = abs(color.b - _TransparentColorKey.b);      if (deltaR < _TransparencyMargin && deltaG < _TransparencyMargin && deltaB < _TransparencyMargin)      {          return float4(0.0f, 0.0f, 0.0f, 0.0f);      }      return color;      }      ENDCG    }}}using System;using System.Runtime.InteropServices;using UnityEngine;public class TransparentWindow : MonoBehaviour{        private Material m_Material;    private struct MARGINS    {      public int cxLeftWidth;      public int cxRightWidth;      public int cyTopHeight;      public int cyBottomHeight;    }        private static extern IntPtr GetActiveWindow();        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);        private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);private static extern int SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int cx, int cy, int uFlags);static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, int dwFlags);private static extern bool SetForegroundWindow(IntPtr hWnd);const int GWL_STYLE = -16;const int GWL_EXSTYLE = -20;const uint WS_POPUP = 0x80000000;    const uint WS_VISIBLE = 0x10000000;const uint WS_EX_TOPMOST = 0x00000008;const uint WS_EX_LAYERED = 0x00080000;const uint WS_EX_TRANSPARENT = 0x00000020;const int SWP_FRAMECHANGED = 0x0020;const int SWP_SHOWWINDOW = 0x0040;const int LWA_ALPHA = 2;private IntPtr HWND_TOPMOST = new IntPtr(-1);private IntPtr _hwnd;void Start()    {#if !UNITY_EDITOR    MARGINS margins = new MARGINS() { cxLeftWidth = -1 };    _hwnd = GetActiveWindow();    int fWidth = Screen.width;    int fHeight = Screen.height;      SetWindowLong(_hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);    SetWindowLong(_hwnd, GWL_EXSTYLE, WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT);      DwmExtendFrameIntoClientArea(_hwnd, ref margins);      SetWindowPos(_hwnd, HWND_TOPMOST, 0, 0, fWidth, fHeight, SWP_FRAMECHANGED | SWP_SHOWWINDOW);         ShowWindowAsync(_hwnd, 3); //Forces window to show in case of unresponsive app    // SW_SHOWMAXIMIZED(3)#endif}void OnRenderImage(RenderTexture from, RenderTexture to)    {      Graphics.Blit(from, to, m_Material);    }}
页: [1]
查看完整版本: Unity exe程序背景透明化+鼠标穿透