1. 程式人生 > >Unity2D實現貼圖凹凸感並接受實時光照效果

Unity2D實現貼圖凹凸感並接受實時光照效果

先看最終效果:


我們的原圖是一個3D模型的截圖:


這一效果是通過Shader實現的:

(Shader程式碼來自國外部落格:http://www.thomas-joncorpuz.com/blog/2014/11/30/custom-unity-2d-sprite-shader)

Shader "Custom/SpriteNormal" {
	 Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _NormalsTex ("Sprite Normals", 2D) = "bump" {}
        _Ramp ("Shading Ramp", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        _Cutoff ("Alpha Cutoff", Range (0,1)) = 0.5
    }

    SubShader
    {
        Tags
        { 
            "Queue"="Transparent" 
            "IgnoreProjector"="False" 
            "RenderType"="Transparent" 
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Cull Off
        Lighting On
        ZWrite Off
        Fog { Mode Off }
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM
        #pragma surface surf CustomLambert alpha vertex:vert addshadow alphatest:_Cutoff 
        #pragma multi_compile DUMMY PIXELSNAP_ON

        sampler2D _MainTex;
        sampler2D _NormalsTex;
        sampler2D _Ramp;
        fixed4 _Color;

        struct Input
        {
            float2 uv_MainTex;
            fixed4 color;
        };
        
        half4 LightingCustomLambert (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
            half NdotL = dot (s.Normal, lightDir);
            half4 c;
            c.rgb = (s.Albedo * _LightColor0.rgb * (tex2D (_Ramp, half2 (NdotL * 0.5 + 0.5, 0)))) * (atten * 2);
            c.a = s.Alpha;
            return c;
        }
        
        void vert (inout appdata_full v, out Input o)
        {
            #if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
            v.vertex = UnityPixelSnap (v.vertex);
            #endif
            v.normal = float3(0,0,-1);
            v.tangent = float4(-1, 0, 0, 1);
            
            UNITY_INITIALIZE_OUTPUT(Input, o);
            o.color = _Color * v.color;
        }

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal (tex2D (_NormalsTex, IN.uv_MainTex));
            o.Alpha = c.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}
Shader需要的法線貼圖可以通過一個軟體:PixPlant生成出來,只需提供原素材圖,這個軟體就能生成一個法線貼圖了。

此外還需要一張陰影梯度圖:


相關推薦

Unity2D實現凹凸接受實時光照效果

先看最終效果: 我們的原圖是一個3D模型的截圖: 這一效果是通過Shader實現的: (Shader程式碼來自國外部落格:http://www.thomas-joncorpuz.com/blog/2014/11/30/custom-unity-2d-sprite-sh

如何在Unity5.0 下實現材質的Animation動畫功能

在太空射擊遊戲中,需要製作一個火星背景圖片,為動態的太空星空背景;如何用unity5自帶的Animation實現此動畫功能為關鍵; 實現步驟如下: 1,  首先產生一個plane作為火星背景;

小程式如何實現上傳、圖片預覽效果?(程式碼示例)

wxml程式碼: <view class="weui-uploader__hd"> <view class="weui-uploader__title">點選可預覽選好的圖片</view> <view class="weui-

Unity Shader 法線實現

計算 變換 float minus include 的確 dal 反射 mode 這裏有一個細節,關於法線貼圖是有兩個不同的空間的,如下:   切線空間:法線貼圖顏色為偏藍色   模型空間:法線貼圖顏色為五顏六色 因此根據不同的空間變換位置方便一致計算。 1 // 法

asp.net -mvc框架復習(9)-實現用戶登錄控制器和視的編寫調試

分享圖片 null admin img pac http tro .com sum 1.編寫控制器 三個步驟: 【1】獲取數據 【2】業務處理 【3】返回數據 using System;using System.Collections.Generic;using Syst

UnityShader 浮雕凹凸BumpMap與法線NormalMap的原理及其區別

效果圖:                                浮雕凹凸貼圖效果 ====》 高度圖   &nb

67 - three.js 筆記 - 使用 bumpMap 凹凸建立皺紋

凹凸貼圖用於為材質增加厚度,在三維環境中使表面產生凹凸不平的視覺效果。 它主要的原理是通過改變表面光照的法線。凹凸貼圖是一種灰度影象素的密集程度定義的是凹凸的程度。凹凸貼圖只包含畫素的相對高度,不包含傾斜方向的資訊,凹凸貼圖不會改變物體的形狀。 1、示例 示例 http://it

73 - three.js 筆記 - 設定折射比率 refractionRatio 加環境實現反射效果

通過給物體設定環境貼圖envMap可以實現虛假的反射效果,通過設定CubeCamera可以實現動態的反光,設定材質的refractionRatio 屬性可以實現透明反射的效果。 1、示例 示例 http://ithanmang.com/threeJs/home/201809/201

android平臺下OpenGL ES 3.0實現2D紋理顯示bitmap

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

【遊戲開發】遊戲視窗實現自定義

//Windows視窗標頭檔案 #include <windows.h> //PlaySound函式包含的標頭檔案 #pragma comment(lib,"winmm.lib") //視窗寬度 #define WINDOW_WIDTH 1132 //視窗高度 #define

Unity Shader程式設計 (一)簡單凹凸和自選邊緣顏色和強度的shader編寫

程式碼轉自: http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星雲(淺墨)  Shader "淺墨Shader程式設計/0.TheFirstShader"  {  &nb

請教picturebox截儲存到陣列實現拖動組合的問題

VS2017從元資料無註釋!AutodeskRevit二次開發VS2017從元資料無註釋!AutodeskRevit二次開發 net4.5選單BUGwinform製作列印net4.5選單BUGwinform製作列印 父窗體BindingNavigator導航按鈕如何操作當前活

opengl實現匯入正方體obj檔案+旋轉+平移+

平移函式    glTranslatef(0.0f + left_right_x, 0.0f + up_down_y, -5.0f); 鍵盤控制    SpecialKeys(int key, int x, int y) 繫結貼圖 

CityEngine基於規則實現技巧(二)

通過內部規則控制實現紋理貼圖,主要是指採用texture的方式進行貼圖。在使用texture進行貼圖的過程中其最關鍵的在於約束texture引入的圖片所代表的實際大小和其擺放的位置等資訊,因而就產生了控制圖片代表實際尺寸、圖片重複的次數兩種方式的貼圖。下面就針對這兩種方式進行簡單的介紹。 控制圖片代表的實際尺

CityEngine從影像提取屋頂紋理

前言         一段時間以來,一直有朋友在問屋頂紋理如何從影像中獲取的相關問題, 其實在2012年的使用者大會的Demo劇場的《CityEngine城市建模新選擇》就有這個問題的相關介紹,詳見http://wenku.it168.com/d_000565555.sht

利用win api 實現 儲存為BMP轉為位元組流

c++ 利用winAPI 實現截圖幕; 程式碼: #include<windows.h> void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc); int main() { HWND DeskWnd=::

android上用C語言讀取fb0實現儲存為rgb565的bmp

好久沒有看,這兩天在折騰一下,更新一下:修正了framebuffer bgra_8888格式截圖變紅的問題 =================================       android上用C語言讀取fb0實現截圖,儲存為bmp圖片, 支援16位

VC對話方塊效果實現

#include "stdafx.h" #include "dib256.h" #include "dibpal.h" #define PADWIDTH(x) (((x)*8 + 31) & (~31))/8 CDIBitmap :: CDIBitmap() : m_pInfo(0) ,

unity3d 凹凸、法線、置換 (二)

NormalMap 看來可以增加細節,但是它的缺點也很明顯。不過在說缺點之前,要提前說一句--NormalMap帶來的優勢是遠遠大於它的缺點的。因此仍然是個極好的東西,不要對它有偏見,特別是在我們後面介紹的更牛的技術前面,千萬不要。最大的也是最明顯的缺點應該就是它的視角問

凹凸與法線的區別

我翻譯這篇教程的目的是為了幫助那些對圖形渲染技術有興趣卻又苦於找不到免費中文學習資料的人。在我的身邊沒有任何一位從事計算機專業的前輩,從剛學會WINDOWS的基本操作到現在,我的計算機技術完全都是一步步自學過來的,算算學程式設計的歷史也近5年時間了。我往往要花一半以上的學