Blue channel for height in standard shader


I want to make standard shader that for height requires information in B channel of texture. What I need to change in code to make this work? Or maybe someone could point me in some direction how to do it?

Sorry, I dont know anything about shader coding :confused:


I’m assuming you’re using a plane with several subdivisions (as opposed to a terrain object)? If that’s the case then hopefully the following should help you out:

Shader "Custom/HeightMap" {
Properties {
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
    _HeightMapTex ("Height Map", 2D) = "white" {}
    _HeightMapFactor ("Factor", Range(0.001,10)) = 1.0//optional, you may want more control over how much the texture influences the height
    SubShader {
    Tags { "RenderType"="Opaque" }
    LOD 200
    #pragma surface surf Standard fullforwardshadows vertex:vert
    #pragma target 3.0 //or whatever your target is
    sampler2D _HeightMapTex;
    sampler2D _Color;
    fixed4 _Color;
    float _HeightMapFactor;

    struct Input {
        float2 uv_MainTex;

    void vert (inout appdata_full v) {
        v.vertex.y += _HeightMapTex.b * _HeightMapFactor;
        //alternatively:  v.vertex.y = _HeightMapTex.b * _HeightMapFactor;
    //After that just put in a standard surface shader
    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.rgb;
FallBack "Diffuse"