2
\$\begingroup\$

I have already visited a lot of links, but non of them did not help me.

I just want to make a window as a plane (face) with texture with transparency.

.shader:

Shader "Custom/NewSurfaceShader"
{
Properties
{
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
    _Glossiness ("Smoothness", Range(0,1)) = 0.5
    _Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
    Tags {"Queue" = "Transparent" "RenderType"="Transparent"}
    LOD 200

    CGPROGRAM
    // Physically based Standard lighting model, and enable shadows on all light types
    #pragma surface surf Standard fullforwardshadows

    // Use shader model 3.0 target, to get nicer looking lighting
    #pragma target 3.0

    sampler2D _MainTex;

    struct Input
    {
        float2 uv_MainTex;
    };

    half _Glossiness;
    half _Metallic;
    fixed4 _Color;

    UNITY_INSTANCING_BUFFER_START(Props)
    UNITY_INSTANCING_BUFFER_END(Props)

    void surf (Input IN, inout SurfaceOutputStandard o)
    {
        // Albedo comes from a texture tinted by color
        fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgba;
        // Metallic and smoothness come from slider variables
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
        o.Alpha = c.a;
    }
    ENDCG
}
FallBack "Diffuse"
}

Material:

enter image description here

Test texture on imgur(I think it did not erase alpha when upload)

Result:

enter image description here

Result, if in material set Render Queue to Alpha Test or Geometry (others are opaque):

enter image description here

Seems like it renders begind it only geometry with clear white faces without texture in this case. And, anyway, it has dark background, when image texture does not.

What am I doing wrong? Unity 2021.3.0f1


Example of texture I want to use as window.

What do I want (in Blender):

enter image description here

\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

This is covered in the documentation:

Optional parameters

Transparency and alpha testing is controlled by alpha and alphatest directives. Transparency can typically be of two kinds: traditional alpha blending (used for fading objects out) or more physically plausible “premultiplied blending” (which allows semitransparent surfaces to retain proper specular reflections). Enabling semitransparency makes the generated surface shader code contain blending commands; whereas enabling alpha cutout will do a fragment discard in the generated pixel shader, based on the given variable.

  • alpha or alpha:auto - Will pick fade-transparency (same as alpha:fade) for simple lighting functions, and premultiplied transparency (same as alpha:premul) for physically based lighting functions.
  • alpha:blend - Enable alpha blending.
  • alpha:fade - Enable traditional fade-transparency.
  • alpha:premul - Enable premultiplied alpha transparency.
  • alphatest:VariableName - Enable alpha cutout transparency. Cutoff value is in a float variable with VariableName. You’ll likely also want to use addshadow directive to generate proper shadow caster pass.
  • keepalpha - By default opaque surface shaders write 1.0 (white) into alpha channel, no matter what’s output in the Alpha of output struct or what’s returned by the lighting function. Using this option allows keeping lighting function’s alpha value even for opaque surface shaders.
  • decal:add - Additive decal shader (e.g. terrain AddPass). This is meant for objects that lie atop of other surfaces, and use additive blending. See Surface Shader Examples
  • decal:blend - Semitransparent decal shader. This is meant for objects that lie atop of other surfaces, and use alpha blending. See Surface Shader Examples

So depending on your exact needs, you likely want to change:

#pragma surface surf Standard fullforwardshadows

to something like:

#pragma surface surf Standard fullforwardshadows alpha
\$\endgroup\$
3
  • \$\begingroup\$ Well, I think I did not clarified, what exact texture I want to use as window. I added to question, because changing code as You pointed indeed makes surface (almost) transparent, but even in areas where my texture's alpha is zero. \$\endgroup\$ Commented Apr 22, 2022 at 17:59
  • \$\begingroup\$ I also added a picture from Blender of how I want it to be \$\endgroup\$ Commented Apr 22, 2022 at 18:03
  • \$\begingroup\$ alpha:blend is what I need, thanks \$\endgroup\$ Commented Apr 22, 2022 at 18:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .