GLSL in Unity 系列文章(三):Unity GLSL內(nèi)置變量

Built-in shader variables
Built-in shader include files

一、GLSL內(nèi)置變量

Unity 作為渲染引擎嚷炉,內(nèi)置了一些shader變量以及一些數(shù)據(jù)結(jié)構(gòu)申屹,方便Unity自身的一些函數(shù)計(jì)算,同時(shí)也開(kāi)放給開(kāi)發(fā)者使用独柑,我們開(kāi)發(fā)者同時(shí)也可以將這些視為某種規(guī)范和標(biāo)準(zhǔn),詳細(xì)參考UnityShaderVariables.cginc(Unity的內(nèi)置Shader可以在官網(wǎng)可以下載到)车酣。

UnityShaderVariables.cginc文件截圖

同時(shí)Unity的文檔也對(duì)內(nèi)置變量做了說(shuō)明索绪,可以參考Built-in shader variables瑞驱。

內(nèi)置shader變量說(shuō)明

Unity 內(nèi)置Shader 基本上通過(guò)Cg來(lái)編寫(xiě)的,所以GLSL內(nèi)置的變量比較少凳寺,主要關(guān)注UnityCG.glslinc和GLSLSupport.glslinc彤侍。

首先來(lái)看看UnityCG.glslinc

UnityCG.glslinc

Unity引擎會(huì)在cpu提交gpu渲染請(qǐng)求時(shí)為這些變量賦值盏阶,開(kāi)發(fā)者只需要知道如何使用即可。

再看GLSLSupport.glslinc

GLSLSupport.glslinc

這里主要看gl_前綴的變量:

變量名 類型
gl_ModelViewProjectionMatrix mat4 MVP矩陣魄眉,將對(duì)象空間中的頂點(diǎn)轉(zhuǎn)換到裁剪空間
gl_ModelViewMatrix mat4 MV矩陣闷袒,將對(duì)象空間中的頂點(diǎn)轉(zhuǎn)換到相機(jī)空間
gl_ModelViewMatrixTranspose mat4 MV矩陣的轉(zhuǎn)置
gl_ModelViewMatrixInverseTranspose mat4 MV矩陣逆的轉(zhuǎn)置
gl_NormalMatrix mat4 法線矩陣,將對(duì)象空間中的法線轉(zhuǎn)換到世界空間
gl_ProjectionMatrix mat4 投影矩陣脾歇,將相機(jī)空間的頂點(diǎn)轉(zhuǎn)換到裁剪空間

另外還有

變量名 類型
gl_Vertex vec4 對(duì)象空間的頂點(diǎn)坐標(biāo)
gl_Position vec4 頂點(diǎn)著色器的輸出到片元著色器的位置(裁剪空間)
gl_FragColor vec4 最終輸出到屏幕像素的顏色值
gl_Normal vec4 頂點(diǎn)法線
gl_MultiTexCoord0 vec4 uv

這些是OpenGLES預(yù)定義的變量(未確認(rèn),Unity 內(nèi)置shader源碼搜索不到定義池摧,知道的大佬告知一聲),可以直接使用膘魄。

二竭讳、shading in world space

改變距離改變顏色
Shader "GLSL/GLSL shading in world space" {
    Properties {
        _Point ("a point in world space", Vector) = (0., 0., 0., 1.0)
        _DistanceNear ("threshold distance", Float) = 5.0
        _ColorNear ("color near to point", Color) = (0.0, 1.0, 0.0, 1.0)
        _ColorFar ("color far from point", Color) = (1.0, 0.0, 0.0, 1.0)
    }
    SubShader {
        Pass {
            GLSLPROGRAM
            // uniforms corresponding to properties
            uniform vec4 _Point;
            uniform float _DistanceNear;
            uniform vec4 _ColorNear;
            uniform vec4 _ColorFar;
            #include "UnityCG.glslinc"
            out vec4 position_in_world_space;
            #ifdef VERTEX
            void main()
            {
                position_in_world_space = unity_ObjectToWorld * gl_Vertex;
                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
            }
            #endif
            #ifdef FRAGMENT
            void main()
            {
                float dist= distance(position_in_world_space, _Point);
                if (dist < _DistanceNear)
                {
                    gl_FragColor = _ColorNear;
                }
                else
                {
                    gl_FragColor = _ColorFar;
                }
            }
            #endif
            ENDGLSL
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class InWorldSpace : MonoBehaviour
{
    public MeshRenderer meshRenderer;
    // Start is called before the first frame update
    void Start()
    {
        if (Application.isPlaying)
        {
            meshRenderer.material.SetVector("_Point", new Vector4(1.0f, 0.0f, 0.0f, 1.0f));
            meshRenderer.material.SetFloat("_DistanceNear", 10.0f);
            meshRenderer.material.SetColor("_ColorNear", new Color(1.0f, 0.0f, 0.0f));
            meshRenderer.material.SetColor("_ColorFar", new Color(0.0f, 0.0f, 1.0f));
        }
        else
        {
            meshRenderer.sharedMaterial.SetVector("_Point", new Vector4(1.0f, 0.0f, 0.0f, 1.0f));
            meshRenderer.sharedMaterial.SetFloat("_DistanceNear", 10.0f);
            meshRenderer.sharedMaterial.SetColor("_ColorNear", new Color(1.0f, 0.0f, 0.0f));
            meshRenderer.sharedMaterial.SetColor("_ColorFar", new Color(0.0f, 0.0f, 1.0f));
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (Application.isPlaying)
        {
            meshRenderer.material.SetVector("_Point", this.transform.position); // set the shader property
        }
        else
        {
            meshRenderer.sharedMaterial.SetVector("_Point", this.transform.position); // set the shader property
        }
    }
}

github:https://github.com/eangulee/GLSLInUnity.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胰舆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缚窿,更是在濱河造成了極大的恐慌倦零,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋嵌,死亡現(xiàn)場(chǎng)離奇詭異诞帐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)愕鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門菇晃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人磺送,你說(shuō)我怎么就攤上這事〕绾牵” “怎么了馅袁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汗销,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我叠骑,道長(zhǎng)削茁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任朦拖,我火速辦了婚禮厌衔,結(jié)果婚禮上富寿,老公的妹妹穿的比我還像新娘。我一直安慰自己页徐,他們只是感情好变勇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布贴唇。 她就那樣靜靜地躺著飞袋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓶您。 梳的紋絲不亂的頭發(fā)上纲仍,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天郑叠,我揣著相機(jī)與錄音,去河邊找鬼油吭。 笑死署拟,一個(gè)胖子當(dāng)著我的面吹牛歌豺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馒铃,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼痕惋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了议谷?” 一聲冷哼從身側(cè)響起堕虹,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赴捞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胜宇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡封寞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年狈究,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盏求。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碎罚,死狀恐怖磅废,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荆烈,我是刑警寧澤拯勉,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站憔购,受9級(jí)特大地震影響宫峦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫鸟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一导绷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屎飘,春花似錦妥曲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)押桃。三九已至葵萎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怨规,已是汗流浹背陌宿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留波丰,地道東北人壳坪。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掰烟,于是被迫代替她去往敵國(guó)和親爽蝴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沐批,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354