开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:689

当前位置:游戏蛮牛 技术专区 教程分享

查看: 525|回复: 14

[系列教程] 【Unity3d】窗体透明

[复制链接]  [移动端链接]
排名
4351
昨日变化
20

15

主题

51

帖子

547

积分

Rank: 9Rank: 9Rank: 9

UID
208032
好友
1
蛮牛币
1018
威望
0
注册时间
2017-2-23
在线时间
185 小时
最后登录
2017-10-18
发表于 2017-4-21 14:29:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
偶然在国外网站上看到的一个脚本,通过纯色背景抠像的方法,把windows的窗体透明化,可以用来做无背景的小头像、桌面精灵等。
首先新建一个叫TransparentWindow的CS脚本,输入如下代码:
[C#] 纯文本查看 复制代码
using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class TransparentWindow : MonoBehaviour
{
    [SerializeField]
    private Material m_Material;

    private struct MARGINS
    {
        public int cxLeftWidth;
        public int cxRightWidth;
        public int cyTopHeight;
        public int cyBottomHeight;
    }

    // Define function signatures to import from Windows APIs

    [DllImport("user32.dll")]
    private static extern IntPtr GetActiveWindow();

    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);

    [DllImport("Dwmapi.dll")]
    private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);


    // Definitions of window styles
    const int GWL_STYLE = -16;
    const uint WS_POPUP = 0x80000000;
    const uint WS_VISIBLE = 0x10000000;

    void Start()
    {
#if !UNITY_EDITOR
        var margins = new MARGINS() { cxLeftWidth = -1 };

        // Get a handle to the window
        var hwnd = GetActiveWindow();

        // Set properties of the window
        // See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx
        SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);

        // Extend the window into the client area
        //See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa969512%28v=vs.85%29.aspx 
        DwmExtendFrameIntoClientArea(hwnd, ref margins);
#endif
    }

    // Pass the output of the camera to the custom material
    // for chroma replacement
    void OnRenderImage(RenderTexture from, RenderTexture to)
    {
        Graphics.Blit(from, to, m_Material);
    }
}


然后新建一个叫ChromakeyTransparent的Shader:
[C#] 纯文本查看 复制代码
Shader "Custom/ChromakeyTransparent" {
    Properties{
        _MainTex("Base (RGB)", 2D) = "white" {}
        _TransparentColourKey("Transparent Colour Key", Color) = (0,0,0,1)
        _TransparencyTolerance("Transparency Tolerance", Float) = 0.01
    }

    SubShader{
        Pass{
            Tags{ "RenderType" = "Opaque" }
            LOD 200

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct a2v
            {
                float4 pos : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert(a2v input)
            {
                v2f output;
                output.pos = UnityObjectToClipPos(input.pos);
                output.uv = input.uv;
                return output;
            }

            sampler2D _MainTex;
            float3 _TransparentColourKey;
            float _TransparencyTolerance;

            float4 frag(v2f input) : SV_Target
            {
                // What is the colour that *would* be rendered here?
                float4 colour = tex2D(_MainTex, input.uv);

                // Calculate the different in each component from the chosen transparency colour
                float deltaR = abs(colour.r - _TransparentColourKey.r);
                float deltaG = abs(colour.g - _TransparentColourKey.g);
                float deltaB = abs(colour.b - _TransparentColourKey.b);

                // If colour is within tolerance, write a transparent pixel
                if (deltaR < _TransparencyTolerance && deltaG < _TransparencyTolerance && deltaB < _TransparencyTolerance)
                {
                    return float4(0.0f, 0.0f, 0.0f, 0.0f);
                }

                // Otherwise, return the regular colour
                return colour;
            }
            ENDCG
        }
    }
}


新建一个材质,选择我们刚刚写好的Shader,将TransparentWindow挂载到摄像机上,摄像机的Clear Flags选择Solid Color,Background选择和材质的Transparent Color Key相同的颜色(建议选择与模型边缘颜色相近的颜色,不然会出现较明显的毛边),将材质拖拽给TransparentWindow的Material变量。


运行之后可以看到背景颜色已经被扣掉(黑色其实是透明):
Build一下之后我们就可以看到类似桌面精灵的一个程序了:


回复

使用道具 举报

7日久生情
3416/5000
排名
127
昨日变化

1

主题

463

帖子

3416

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
11004
好友
0
蛮牛币
4498
威望
0
注册时间
2013-12-24
在线时间
1019 小时
最后登录
2017-9-4

VIP

发表于 2017-4-21 23:04:50 | 显示全部楼层
有创意

回复

使用道具 举报

5熟悉之中
718/1000
排名
6697
昨日变化
5

22

主题

144

帖子

718

积分

Rank: 5Rank: 5

UID
190197
好友
8
蛮牛币
15768
威望
0
注册时间
2016-12-7
在线时间
272 小时
最后登录
2017-10-17

一掷千金

发表于 2017-4-23 11:01:34 | 显示全部楼层
感谢分享

回复

使用道具 举报

3偶尔光临
189/300
排名
9332
昨日变化
12

1

主题

54

帖子

189

积分

Rank: 3Rank: 3Rank: 3

UID
218826
好友
0
蛮牛币
18
威望
0
注册时间
2017-4-21
在线时间
50 小时
最后登录
2017-10-1
发表于 2017-4-23 21:53:15 | 显示全部楼层
阿阿阿阿阿阿阿阿

回复 支持 反对

使用道具 举报

5熟悉之中
894/1000
排名
2648
昨日变化
2

5

主题

87

帖子

894

积分

Rank: 5Rank: 5

UID
148165
好友
3
蛮牛币
495
威望
0
注册时间
2016-5-10
在线时间
376 小时
最后登录
2017-10-18
QQ
发表于 2017-4-25 14:21:34 | 显示全部楼层
有想法~

回复

使用道具 举报

5熟悉之中
894/1000
排名
2648
昨日变化
2

5

主题

87

帖子

894

积分

Rank: 5Rank: 5

UID
148165
好友
3
蛮牛币
495
威望
0
注册时间
2016-5-10
在线时间
376 小时
最后登录
2017-10-18
QQ
发表于 2017-4-25 14:49:30 | 显示全部楼层
本帖最后由 XXHH 于 2017-4-25 14:55 编辑

为啥我复制的shader在34行  就这个output.pos = UnityObjectToClipPos(input.pos);报错啊~

回复 支持 反对

使用道具 举报

排名
785
昨日变化

14

主题

250

帖子

1900

积分

Rank: 11Rank: 11Rank: 11Rank: 11Rank: 11

UID
19893
好友
5
蛮牛币
3421
威望
0
注册时间
2014-4-1
在线时间
486 小时
最后登录
2017-10-18

活力之星

QQ
发表于 2017-4-25 16:46:32 | 显示全部楼层
XXHH 发表于 2017-4-25 14:49
为啥我复制的shader在34行  就这个output.pos = UnityObjectToClipPos(input.pos);报错啊~

没有定义UnityObjectToClipPos
[发帖际遇]: 暮呈晨曦 被钱袋砸中进医院,看病花了 2 蛮牛币. 幸运榜 / 衰神榜

励志成为大神的男人!!!
回复 支持 反对

使用道具 举报

5熟悉之中
894/1000
排名
2648
昨日变化
2

5

主题

87

帖子

894

积分

Rank: 5Rank: 5

UID
148165
好友
3
蛮牛币
495
威望
0
注册时间
2016-5-10
在线时间
376 小时
最后登录
2017-10-18
QQ
发表于 2017-4-25 17:27:01 | 显示全部楼层
暮呈晨曦 发表于 2017-4-25 16:46
没有定义UnityObjectToClipPos

不会shader  咋定义  
[发帖际遇]: XXHH 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
785
昨日变化

14

主题

250

帖子

1900

积分

Rank: 11Rank: 11Rank: 11Rank: 11Rank: 11

UID
19893
好友
5
蛮牛币
3421
威望
0
注册时间
2014-4-1
在线时间
486 小时
最后登录
2017-10-18

活力之星

QQ
发表于 2017-4-26 09:01:06 | 显示全部楼层
XXHH 发表于 2017-4-25 17:27
不会shader  咋定义

表示也在初学阶段,同求这个问题,最好楼主能给个解释!

励志成为大神的男人!!!
回复 支持 反对

使用道具 举报

2初来乍到
137/150
排名
23339
昨日变化
54

1

主题

61

帖子

137

积分

Rank: 2Rank: 2

UID
143117
好友
0
蛮牛币
89
威望
0
注册时间
2016-3-23
在线时间
64 小时
最后登录
2017-8-22
发表于 2017-5-9 16:00:15 | 显示全部楼层
我老喜欢楼主  我要给楼主生毛球

回复 支持 反对

使用道具 举报

5熟悉之中
530/1000
排名
3479
昨日变化
1

0

主题

45

帖子

530

积分

Rank: 5Rank: 5

UID
164900
好友
0
蛮牛币
799
威望
0
注册时间
2016-8-30
在线时间
160 小时
最后登录
2017-10-17
发表于 2017-5-11 11:20:33 | 显示全部楼层
尝试失败了,咱们回事啊,求指导

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1169/1500
排名
2021
昨日变化
1

3

主题

203

帖子

1169

积分

Rank: 6Rank: 6Rank: 6

UID
28898
好友
0
蛮牛币
1913
威望
0
注册时间
2014-6-9
在线时间
419 小时
最后登录
2017-10-18
发表于 2017-5-19 11:27:20 | 显示全部楼层
有工程文件么,^_^

回复 支持 反对

使用道具 举报

3偶尔光临
220/300
排名
11734
昨日变化
24

0

主题

98

帖子

220

积分

Rank: 3Rank: 3Rank: 3

UID
55085
好友
1
蛮牛币
255
威望
0
注册时间
2014-11-12
在线时间
66 小时
最后登录
2017-8-14
发表于 2017-7-21 17:57:31 | 显示全部楼层
火钳刘明

回复

使用道具 举报

3偶尔光临
207/300
排名
9452
昨日变化
11

0

主题

57

帖子

207

积分

Rank: 3Rank: 3Rank: 3

UID
217494
好友
1
蛮牛币
157
威望
0
注册时间
2017-4-13
在线时间
68 小时
最后登录
2017-9-13
发表于 2017-9-7 15:18:54 | 显示全部楼层
666666666666666

回复 支持 反对

使用道具 举报

排名
21785
昨日变化
35

0

主题

51

帖子

93

积分

Rank: 2Rank: 2

UID
123492
好友
2
蛮牛币
173
威望
0
注册时间
2015-9-22
在线时间
28 小时
最后登录
2017-9-15
发表于 2017-9-15 15:38:09 | 显示全部楼层
不错不错啊  可以做个妹纸陪我写代码了

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表