Shader 編程(二)使用光照模型來計算某個點(diǎn)的光照效果

什么是光照模型
光照模型就是一個公式蛾派,使用這個公式來計算在某個點(diǎn)的光照效果

標(biāo)準(zhǔn)光照模型
在標(biāo)準(zhǔn)光照模型里面,我們把進(jìn)入攝像機(jī)的光分為下面四個部分
自發(fā)光
高光反射
Blinn光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和視野方向的夾角
Blinn-Phong光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是法線和x的夾角 x 是平行光和視野方向的平分線
漫反射 Diffuse = 直射光顏色 * max(0,cos夾角(光和法線的夾角) ) cosθ = 光方向· 法線方向
環(huán)境光

Tags{ "LightMode"="ForwardBase" }
只有定義了正確的LightMode才能得到一些Unity的內(nèi)置光照變量
include "Lighting.cginc"
包含unity的內(nèi)置的文件,才可以使用unity內(nèi)置的一些變量

normalize() 用來把一個向量躯护,單位化(原來方向保持不變尸变,長度變?yōu)?)
max() 用來取得函數(shù)中最大的一個
dot 用來取得兩個向量的點(diǎn)積
_WorldSpaceLightPos0 取得平行光的位置
_LightColor0取得平行光的顏色
UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
UNITY_LIGHTMODEL_AMBIENT用來獲取環(huán)境光

(1)蘭伯特光照模型計算公式(漫反射計算方式)

(漫反射)Diffuse = 直射光顏色 * max(0,cos夾角(光和法線的夾角) ) cosθ = 光方向· 法線方向
下面我們使用逐頂點(diǎn)光照和逐像素光照來實現(xiàn)蘭伯特光照模型計算公式忿等。

逐頂點(diǎn)光照

兩種方式可以實現(xiàn)漫反射 第一種是逐頂點(diǎn)實現(xiàn)漫反射,第二種方式是逐像素實現(xiàn)漫反射咽瓷。
逐頂點(diǎn)就是將光照的計算方式放在頂點(diǎn)函數(shù)里面设凹,因為頂點(diǎn)個數(shù)是有限的,而像素個數(shù)是無限的茅姜,逐頂點(diǎn)計算是頂點(diǎn)與頂點(diǎn)之間的計算時是使用了插值的計算方式計算闪朱,這樣比較平和,但是頂點(diǎn)是直接計算出來的所以頂點(diǎn)上不會太平和匈睁。下面我們來實現(xiàn)第一種逐頂點(diǎn)监透。

Shader"Diffuse"{
    properties{
        _Diffuse("Color",Color) = (1,1,1,1)
    }
        SubShader{

        Pass {

        //定義正確的LightMode得到內(nèi)置的光照變量
        Tags{"LightMode" = "ForwardBase"}

        CGPROGRAM
        //包含unity的內(nèi)置的文件,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
        #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0

        #pragma vertex vert
        #pragma fragment frag

                   fixed4 _Diffuse;

            struct a2v {
               float4 vertex:POSITION;
               float3 normal:NORMAL; 
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            fixed3 color : COLOR;
        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = UnityObjectToClipPos(v.vertex);
                //環(huán)境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

                //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
                fixed3 normalDir = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間
                //normalize() 用來把一個向量航唆,單位化(原來方向保持不變胀蛮,長度變?yōu)?)
                //_WorldSpaceLightPos0 取得平行光的位置
                fixed3 lightDir = normalize( _WorldSpaceLightPos0.xyz);//對于每一個頂點(diǎn)來說 光的位置就是光的方向  因為光是平行光
                //_LightColor0取得平行光的顏色
                //max() 用來取得函數(shù)中最大的一個
                //dot 用來取得兩個向量的點(diǎn)積
                fixed3 diffuse = _LightColor0.rgb*max(0, dot(normalDir, lightDir))*_Diffuse.rgb;//取得漫反射的顏色
                    f.color = diffuse+ ambient;
                return f;
            }

        fixed4 frag(v2f f) :SV_Target{
            return fixed4(f.color,1);

        }
            ENDCG
       }
    }
        Fallback"VertexLit"
}

因為在程序里面設(shè)置了環(huán)境光所以在暗部會受到環(huán)境光的影響


效果展示.png

這里設(shè)置受SkyBox環(huán)境光的影響,也可以自己將其他物體或者顏色設(shè)置成環(huán)境光顏色


Paste_Image.png

逐像素光照

逐頂點(diǎn)光照沒有逐像素光照渲染的平和 糯钙,但是逐像素光照渲染更加耗費(fèi)性能
Shader"Fragment"{
    properties{
        _Diffuse("Color",Color) = (1,1,1,1)
    }
        SubShader{
        Pass {
        //定義正確的LightMode得到內(nèi)置的光照變量
        Tags{"LightMode" = "ForwardBase"}
        CGPROGRAM
        //包含unity的內(nèi)置的文件粪狼,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
        #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0
        #pragma vertex vert
        #pragma fragment frag

                   fixed4 _Diffuse;

            struct a2v {
               float4 vertex:POSITION;
               float3 normal:NORMAL; 
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            fixed3 worldNormalDir : COLOR0;

        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);   
                f.worldNormalDir = mul(v.normal, (float3x3)unity_WorldToObject);
                return f;
            }

        fixed4 frag(v2f f) :SV_Target{
            //環(huán)境光
            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

        //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
        fixed3 normalDir = normalize(f.worldNormalDir);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間

        //normalize() 用來把一個向量,單位化(原來方向保持不變任岸,長度變?yōu)?)
        //_WorldSpaceLightPos0 取得平行光的位置
        fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//對于每一個頂點(diǎn)來說 光的位置就是光的方向  因為光是平行光

         //_LightColor0取得平行光的顏色
        //max() 用來取得函數(shù)中最大的一個
        //dot 用來取得兩個向量的點(diǎn)積
        fixed3 diffuse = _LightColor0.rgb*max(0, dot(normalDir, lightDir))*_Diffuse.rgb;//取得漫反射的顏色
        fixed3 tempColor  = diffuse + ambient;
            return fixed4(tempColor,1);
        }
            ENDCG
       }
    }
        Fallback"Diffuse"
}
逐頂點(diǎn)逐像素對比.png

(2)半蘭伯特光照模型計算公式(漫反射計算方式)

Diffuse = 直射光顏色 *( cosθ *0.5 +0.5 )
因為蘭伯特光照模型在背光面會完全看不清再榄,所以半蘭伯特光照模型應(yīng)時而生。


蘭伯特光照模型.png
Shader"Lambert"{
    properties{
        _Diffuse("Color",Color) = (1,1,1,1)
    }
        SubShader{

        Pass {

        //定義正確的LightMode得到內(nèi)置的光照變量
        Tags{"LightMode" = "ForwardBase"}

        CGPROGRAM
        //包含unity的內(nèi)置的文件享潜,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
        #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0

        #pragma vertex vert
        #pragma fragment frag

                   fixed4 _Diffuse;

            struct a2v {
               float4 vertex:POSITION;
               float3 normal:NORMAL; 
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            fixed3 worldNormalDir : COLOR0;

        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
                
                f.worldNormalDir = mul(v.normal, (float3x3)unity_WorldToObject);

                return f;
            }

        fixed4 frag(v2f f) :SV_Target{
            //環(huán)境光
            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

        //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
        fixed3 normalDir = normalize(f.worldNormalDir);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間


        //normalize() 用來把一個向量困鸥,單位化(原來方向保持不變,長度變?yōu)?)
        //_WorldSpaceLightPos0 取得平行光的位置
        fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//對于每一個頂點(diǎn)來說 光的位置就是光的方向  因為光是平行光

        float halfLambert = dot(normalDir, lightDir)*0.5 + 0.5;

         //_LightColor0取得平行光的顏色
        //max() 用來取得函數(shù)中最大的一個
        //dot 用來取得兩個向量的點(diǎn)積
        fixed3 diffuse = _LightColor0.rgb*halfLambert*_Diffuse.rgb;//取得漫反射的顏色
        fixed3 tempColor  = diffuse + ambient;
            return fixed4(tempColor,1);

        }
            ENDCG
       }
    }
        Fallback"Diffuse"
}
Paste_Image.png

這樣對比一下背光面蘭伯特光照模型和半蘭伯特光照模型剑按〖簿停可以看到很明顯的差別,半蘭伯特光照模型即使暗部就不會是全黑艺蝴。

(3)高光反射計算方式

Blinn光照模型 計算公式
Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和視野方向的夾角
這里使用逐頂點(diǎn)光照模型寫出高光反射猬腰。

Shader"Specular"{
    properties{
        _Diffuse("Color",Color) = (1,1,1,1)
        _Specular("Specular Color",Color)=(1,1,1,1)//控制高光顏色
       _Gloss("Gloss",Range(8,200))=10//控制高光強(qiáng)度

    }
        SubShader{

        Pass {

        //定義正確的LightMode得到內(nèi)置的光照變量
        Tags{"LightMode" = "ForwardBase"}

        CGPROGRAM
        //包含unity的內(nèi)置的文件,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
        #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0

        #pragma vertex vert
        #pragma fragment frag

                   fixed4 _Diffuse;
                   half _Gloss;
                   fixed4 _Specular;

            struct a2v {
               float4 vertex:POSITION;
               float3 normal:NORMAL; 
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            fixed3 color : COLOR;

        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
                
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//環(huán)境光

                //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
                fixed3 normalDir = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間
             
                fixed3 lightDir = normalize( _WorldSpaceLightPos0.xyz);//對于每一個頂點(diǎn)來說 光的位置就是光的方向  因為光是平行光
        
                fixed3 diffuse = _LightColor0.rgb*max(0, dot(normalDir, lightDir))*_Diffuse.rgb;//取得漫反射的顏色

                fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
                fixed3 vlewDir = normalize(_WorldSpaceCameraPos.xyz - mul(v.vertex, unity_WorldToObject).xyz);

                fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(dot( reflectDir, vlewDir), 0), _Gloss);//計算高光

                f.color = diffuse+ ambient+ specular;
                return f;
            }

        fixed4 frag(v2f f) :SV_Target{
            return fixed4(f.color,1);

        }
            ENDCG
       }
    }
        Fallback"Diffuse"
}
高光強(qiáng)度調(diào)節(jié).gif

高光顏色調(diào)節(jié).gif

下面我們用逐像素來實現(xiàn)高光反射

Shader"Specular Fragment"{
    properties{
        _Diffuse("Color",Color) = (1,1,1,1)
        _Specular("Specular Color",Color)=(1,1,1,1)//控制高光顏色
       _Gloss("Gloss",Range(8,200))=10//控制高光強(qiáng)度

    }
        SubShader{

        Pass {

        //定義正確的LightMode得到內(nèi)置的光照變量
        Tags{"LightMode" = "ForwardBase"}

        CGPROGRAM
        //包含unity的內(nèi)置的文件猜敢,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
        #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0

        #pragma vertex vert
        #pragma fragment frag

                   fixed4 _Diffuse;
                   half _Gloss;
                   fixed4 _Specular;

            struct a2v {
               float4 vertex:POSITION;
               float3 normal:NORMAL; 
              };
        struct v2f {
        
            float4 position:SV_POSITION;
            float3 WorldNomormal : TEXCOORD0;
            float3 WorldVertex:TEXCOORD1;
        }; 
        v2f vert(a2v v) {
                v2f f;
                //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
                f.position = mul(UNITY_MATRIX_MVP, v.vertex);
    
                f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);
                f.WorldVertex = mul(v.vertex,_World2Object).xyz;
                return f;
        };

        fixed4 frag(v2f f) :SV_Target{

        fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//環(huán)境光
         //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
        fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間

        fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//對于每一個頂點(diǎn)來說 光的位置就是光的方向  因為光是平行光

        fixed3 diffuse = _LightColor0.rgb*max(0, dot(normalDir, lightDir))*_Diffuse.rgb;//取得漫反射的顏色

        fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
        fixed3 vlewDir = normalize(_WorldSpaceCameraPos.xyz - f.WorldVertex);

        fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(dot(reflectDir, vlewDir), 0), _Gloss);//計算高光

        fixed3 tempColor = diffuse + ambient + specular;
    

            return fixed4(tempColor,1);

        }
            ENDCG
       }
    }
        Fallback"Diffuse"
}

可以看到逐像素更加柔和平滑

對比圖.png

Blinn-Phong光照模型
下面對我們對Blinn光照模型又作了一種改進(jìn)姑荷,其計算方式為:
Specular=直射光 * pow( max(cosθ,0),10) θ:是法線和x的夾角 x 是平行光和視野方向的平分線盒延。

Shader"Learning/Specular Fragment BlinnPhone"{
   properties{
       _Diffuse("Color",Color) = (1,1,1,1)
       _Specular("Specular Color",Color)=(1,1,1,1)//控制高光顏色
      _Gloss("Gloss",Range(8,200))=10//控制高光強(qiáng)度

   }
       SubShader{

       Pass {

       //定義正確的LightMode得到內(nèi)置的光照變量
       Tags{"LightMode" = "ForwardBase"}

       CGPROGRAM
       //包含unity的內(nèi)置的文件,才可以使用unity內(nèi)置的一些變量  相當(dāng)于引入內(nèi)置的光照模型
       #include "Lighting.cginc"http://取得第一個直射光的顏色  _LightColor0第一個值是光的位置_WorldSpaceLightPos0

       #pragma vertex vert
       #pragma fragment frag

                  fixed4 _Diffuse;
                  half _Gloss;
                  fixed4 _Specular;

           struct a2v {
              float4 vertex:POSITION;
              float3 normal:NORMAL; 
             };
       struct v2f {
       
           float4 position:SV_POSITION;
           float3 WorldNomormal : TEXCOORD0;
           float4 WorldVertex:TEXCOORD1;
       }; 
       v2f vert(a2v v) {
               v2f f;
               //UNITY_MATRIX_MVP 這個矩陣用來把一個坐標(biāo)從模型空間轉(zhuǎn)換到剪裁空間
               f.position = mul(UNITY_MATRIX_MVP, v.vertex);
   
               /*f.WorldNomormal = mul(v.normal, (float3x3)unity_WorldToObject);*/

               //UnityObjectToWorldNormal(float3 norm)  把法線方向 模型空間 == 》世界空間
               f.WorldNomormal = UnityObjectToWorldNormal(v.normal);

               f.WorldVertex = mul(v.vertex,unity_WorldToObject);
               return f;
       };

       fixed4 frag(v2f f) :SV_Target{
       fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//環(huán)境光
        //_World2Object 這個矩陣用來把一個方向從世界空間轉(zhuǎn)換到模型空間
       fixed3 normalDir = normalize(f.WorldNomormal);//相當(dāng)于把模型空間轉(zhuǎn)換到世界空間

       //fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//對于每一個頂點(diǎn)來說 光的位置就是光的方向  因為光是平行光

       //WorldSpaceLightDir(float4 v)  模型空間中的頂點(diǎn)坐標(biāo) == 》世界空間中從這個點(diǎn)到光源的方向
       fixed3 lightDir = normalize(WorldSpaceLightDir(f.WorldVertex).xyz);

       fixed3 diffuse = _LightColor0.rgb*max(0, dot(normalDir, lightDir))*_Diffuse.rgb;//取得漫反射的顏色
   
       //fixed3 vlewDir = normalize(_WorldSpaceCameraPos.xyz - f.WorldVertex);

       //UnityWorldSpaceViewDir(float4 v) 世界空間中的頂點(diǎn)坐標(biāo)==》世界空間從這個點(diǎn)到攝像機(jī)的觀察方向
       fixed3 vlewDir = normalize(UnityWorldSpaceViewDir(f.WorldVertex));

       fixed3 halfDir = normalize(vlewDir + lightDir);
       fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(dot(normalDir, halfDir), 0), _Gloss);//計算高光
       fixed3 tempColor = diffuse + ambient + specular;
           return fixed4(tempColor,1);
       }
           ENDCG
      }
   }
       Fallback"Diffuse"
}

在這里我們可以看到Blinn-Phong光照模型的高光更加大更加亮鼠冕,并且在背光面B模型因為一些計算所以背光面也會有一些高光添寺,但是B—P模型就不會出現(xiàn)這種現(xiàn)象,一般我們更傾向于Blinn-Phong的計算方式.


Paste_Image.png
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懈费,一起剝皮案震驚了整個濱河市畦贸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楞捂,老刑警劉巖薄坏,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寨闹,居然都是意外死亡胶坠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門繁堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沈善,“玉大人,你說我怎么就攤上這事椭蹄∥拍担” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵绳矩,是天一觀的道長罩润。 經(jīng)常有香客問我,道長翼馆,這世上最難降的妖魔是什么割以? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮应媚,結(jié)果婚禮上严沥,老公的妹妹穿的比我還像新娘。我一直安慰自己中姜,他們只是感情好消玄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丢胚,像睡著了一般翩瓜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗜桌,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天奥溺,我揣著相機(jī)與錄音辞色,去河邊找鬼骨宠。 笑死浮定,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的层亿。 我是一名探鬼主播桦卒,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匿又!你這毒婦竟也來了方灾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤碌更,失蹤者是張志新(化名)和其女友劉穎裕偿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痛单,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘿棘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旭绒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟妙。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挥吵,靈堂內(nèi)的尸體忽然破棺而出重父,到底是詐尸還是另有隱情,我是刑警寧澤忽匈,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布房午,位于F島的核電站,受9級特大地震影響丹允,放射性物質(zhì)發(fā)生泄漏歪沃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一嫌松、第九天 我趴在偏房一處隱蔽的房頂上張望沪曙。 院中可真熱鬧拣技,春花似錦渐逃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缘眶。三九已至,卻和暖如春髓废,著一層夾襖步出監(jiān)牢的瞬間巷懈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工慌洪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顶燕,地道東北人凑保。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像涌攻,于是被迫代替她去往敵國和親欧引。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 一.標(biāo)準(zhǔn)光照模型OpenGL與Direct3D提供了幾乎相同的固定功能光照模型恳谎。什么是固定功能光照模型?在過去只有...
    karma085閱讀 3,618評論 0 2
  • 一芝此、Surface Output (表面著色器的標(biāo)準(zhǔn)輸出結(jié)構(gòu))Surface Shader的標(biāo)準(zhǔn)輸出結(jié)構(gòu)-第一要素...
    CarlDonitz閱讀 921評論 0 1
  • 版本記錄 前言 OpenGL 圖形庫項目中一直也沒用過,最近也想學(xué)著使用這個圖形庫因痛,感覺還是很有意思婚苹,也就自然想著...
    刀客傳奇閱讀 6,045評論 0 2
  • 現(xiàn)實世界的光照是極其復(fù)雜的,而且會受到諸多因素的影響鸵膏,這是以目前我們所擁有的處理能力無法模擬的租副。因此OpenGL的...
    IceMJ閱讀 1,962評論 1 6
  • 如果有一天我要去流浪不是因為我厭倦了家鄉(xiāng)不是難忍這里的冬天太長而是我終于得知了你的方向如果有一天我不再感傷不是因為...
    lulucia閱讀 153評論 0 0