Shader在精灵Unity 2d中创建洞

时间:2016-03-21 13:35:18

标签: unity3d 2d shader sprite

我目前正在开发一款角色可以在背景上移动的游戏。这个想法将是这个角色挖掘这个背景。我认为它应该由着色器完成,但我是一个初学者。

我可以想象一下,如果角色离这个像素的位置太远,那么这个像素的alpha就是0.并且将alpha保持为0.如果alpha等于0,你就不会这样做。进行角色测试。

但就目前而言,我已尝试使用精灵/漫反射着色器作为基础,我无法找到获取像素位置的方法。我在冲浪功能中尝试了一些但没有实际效果冲浪功能应该按像素执行一次吗?

先谢谢你的帮助。

编辑 我已经尝试了一些东西来最终得到一个vert frag shader。正如我所说,我试图用像素的距离来计算alpha。 现在我无法弄清楚我的错误在哪里,但也许有些人会更健谈。 顺便说一下,当我放置这个新的着色器时,我的排序层刚刚爆炸。我试图关闭Ztest和Zwrite,但它不起作用。所以,如果你有任何想法(但它不是主要问题)

    Shader "Unlit/SimpleUnlitTexturedShader"
{
    Properties
    {
        // we have removed support for texture tiling/offset,
        // so make them not be displayed in material inspector
        [NoScaleOffset] _MainTex("Texture", 2D) = "white" {}
        _Position("Position", Vector) = (0,0,0,0)
    }
        SubShader
    {
        Pass
    {
        CGPROGRAM
        // use "vert" function as the vertex shader
#pragma vertex vert
        // use "frag" function as the pixel (fragment) shader
#pragma fragment frag

        // vertex shader inputs
    struct appdata
    {
        float4 vertex : POSITION; // vertex position
        float2 uv : TEXCOORD0; // texture coordinate

    };

    // vertex shader outputs ("vertex to fragment")
    struct v2f
    {
        float2 uv : TEXCOORD0; // texture coordinate
        float4 vertex : SV_POSITION; // clip space position
        float3 worldpos:WD_POSITION;
    };

    // vertex shader
    v2f vert(appdata v)
    {
        v2f o;
        // transform position to clip space
        // (multiply with model*view*projection matrix)
        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
        // just pass the texture coordinate
        o.uv = v.uv;
        o.worldpos= mul(_Object2World,o.vertex).xyz;
        return o;
    }

    // texture we will sample
    sampler2D _MainTex;
    float4 Position ;
    // pixel shader; returns low precision ("fixed4" type)
    // color ("SV_Target" semantic)
    fixed4 frag(v2f i) : SV_Target
    {
        // sample texture and return it
        fixed4 col = tex2D(_MainTex, i.uv);
    col.a = step(2,distance(Position.xyz, i.worldpos));
    return col;
    }
        ENDCG
    }
    }
}

1 个答案:

答案 0 :(得分:1)

使用顶点着色器可以实现几何体中“切割孔”的效果。这是可能的,因为顶点着色器允许您使用_Object2World矩阵确定对象像素的3d世界位置。如果我不在我的手机上,我会给出一个代码示例,但我会尝试描述它。如果采用顶点位置,应用_Object2World矩阵,它将返回3d世界位置。这是一个简单的例子:  float3 worldPos = mul(_Object2World,v.vertex).xyz; 在着色器的片段部分中,您可以根据worldPos与任何其他位置之间的距离设置透明度。如果仍然难以理解,我很抱歉,我正试着在我的手机上做这件事。如果有人想详细说明我所说的内容,或者提供代码示例,那就太好了。否则,您可以在此处研究顶点着色器: http://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

希望这有帮助!