首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Unity3D中,如何在黑暗中拍摄整个场景,但有些区域并不黑暗。

在Unity3D中,如何在黑暗中拍摄整个场景,但有些区域并不黑暗。
EN

Stack Overflow用户
提问于 2015-06-19 06:48:31
回答 1查看 3.7K关注 0票数 0

我不想用UGUI来提高一些教学水平,所以需要整体处于黑暗中,但需要一些矩形区域,而不是黑暗。

我可以通过添加一个带有图像组件的游戏对象,在黑暗中制作整个场景,并控制它的阿尔法到暗。

但我不知道如何使一些矩形区域被点燃,长方形将在不同的教学水平上发生变化。不同的设备,不同的分辨率,也会改变雷克的边界。

Picutre3是我想要的,只要矩形区域就可以了。

Picture1

Picture2

Picture3

Picture4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 08:52:31

我将解释如何通过一个简单的着色器和一些设置,你可以实现这一点。我是从记忆里说的,所以如果有什么问题,请问。

所以你能做的是:

  • 制作一个新的图层来渲染面具。假设我们把这个层称为MaskLayer。
  • 复制你的主相机。我们把旧的主相机叫做camA,新的叫camB。
  • 设置camA的剔除面具,以包括除MaskLayer以外的所有内容。
  • 将camB的剔除面具设置为只包括MaskLayer。
  • 创建一个新的呈现纹理(比如MaskRT),并将其设置为camB的呈现目标。
  • 现在创建任何游戏对象。让我们把它变成纯色(白色)的雪碧。
  • 将雪碧的层设置为MaskLayer。

此时,您应该注意到,雪碧在“游戏”窗口或camA预览中不再可见。只有剩下的部分是可见的。当您选择camB时,只有平面会在预览中可见。来自camB的输出表示“漏洞”的位置。

现在我们继续这样做:

  • 创建一个与视口一样大的新精灵。
  • 确保此sprite具有默认标记。
  • 创建一个新的着色器和新的材料。叫它MaskMaterial。创建的默认着色器模板应该足够好。我不记得它到底提供了什么,但它至少应该有一个纹理输入。
  • 假设您的着色器参数称为漫射参数。在像素着色器中,将输出颜色设置为如下所示: fixed4 frag (v2f i):SV_Target { fixed4 fixed4 = tex2D (漫射,i.uv);fixed4 outputColor = fixed4(0,0,0,0.8-texcol.r);返回outputColor;}

所以,我们用简单的英语在我们的着色器中说的是:我的颜色是纯黑的,有一点透明度(0.8),除非我的输入纹理在相同的位置上有一个白色,在这种情况下,我是更透明的(-texcol.r)。

我们在这里使用r分量,但是你也可以很容易地使用任何颜色成分。

现在将这个新的材质和着色器分配到您的全屏精灵,并将您的MaskRT渲染纹理设置为蒙版着色器的输入纹理漫射。

如果一切顺利的话,你现在应该有你想要的效果了。移动掩码现在就像移动场景中任何被标记为MaskLayer层的对象一样容易。这样你就可以有很多面具了。

备注:

  • 雪碧可能会给你带来困难,有些人可能会从一架面对摄像机的飞机开始,以防万一。
  • 这是着色器上的文档,以防您需要阅读:http://docs.unity3d.com/Manual/ShaderTut2.html,值得一看,但这次您可能可以通过尝试和错误来解决问题。
代码语言:javascript
运行
复制
- In your shader there will probably a Color input by default. You can use this in the fragment shader instead of saying (0,0,0..) for easier and more control over the resulting mask. This will allow you to change your masking appearance as usual with the sliders of the material. For example:

fixed4 outputColor = fixed4(InputColor.Albedo,InputCol.a-texcoll)

编辑:您可以在这里查看“在Cg代码中使用着色器属性”部分:http://docs.unity3d.com/Manual/ShaderTut2.html,您可以复制粘贴整个片段,如果您正在挣扎,可以更改片段着色器(对不起,我不知道您对它有多大的体验)。

编辑:这是要求的着色器。还请阅读以下说明。

代码语言:javascript
运行
复制
Shader "Tutorial/Textured Colored" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0.5)
        _MainTex ("Texture", 2D) = "white" { }
    }
    SubShader {
        Tags
        {
          "Queue" = "Transparent"
        }

        Blend One OneMinusSrcAlpha

        Pass {

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"

        fixed4 _Color;
        sampler2D _MainTex;

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

        float4 _MainTex_ST;

        v2f vert (appdata_base v)
        {
            v2f o;
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
            return o;
        }

         fixed4 frag (v2f i) : SV_Target
        {
            fixed4 texcol = tex2D (_MainTex, i.uv);
            fixed4 outputColor = _Color;
            outputColor.a -= texcol.r;
            return outputColor ;
        }
        ENDCG

        }
    }
}

备注:

  • 这个着色器应该在你的全屏四边形上。
  • 请注意着色器属性名称的差异(而不是分散的,而是现在更清楚的_Color和_MainTex。
  • 逻辑大致相同。
  • 此代码未进行测试。
  • 有更有效的方法来做到这一点,例如,只将掩蔽对象的深度写入单个通道的RenderTexture,但我认为这种方法更容易学习。
  • 一旦你得到这半工作,有几个改进有待改进。第一种方法是将掩模矩形的材质改为无光实色着色器。

更新:

对不起,我漏掉了阴影的关键部分。请参阅标签部分和混合操作添加到着色器。另外,请注意,对于全屏四边形,您应该使用的是平面而不是精灵,因为在这种状态下,着色器与精灵不兼容。

还要注意,在这里的示例项目中:https://drive.google.com/file/d/0Bw8X8yAt21AiYjRyVkxJUkhreVU/view?usp=sharing

飞机在x和z轴上都是翻转的。

至于我之前遗漏的UGUI部分,这个解决方案可能有效。我还没查过。如果掩码在UI后面,您可以尝试将着色器中的"Queue“标记设置为"Overlay”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30931700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档