• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 32  文章 - 94  trackbacks - 0
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(8)

            隨筆分類(lèi)

            隨筆檔案

            好友連接

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            第一個(gè)是最容易“發(fā)明”的車(chē)輪:x射線效果,不過(guò)按這個(gè)做法實(shí)現(xiàn)真正透明的話還要逐個(gè)物體渲染到紋理,再疊加:

             1uniform vec3 LightPos;
             2uniform float specularContribution;
             3
             4varying vec3  normal;
             5varying float LightIntensity;
             6void main(void)
             7{
             8
             9   vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex);
            10    normal      = normalize(gl_NormalMatrix * gl_Normal);
            11    vec3 lightVec   = normalize(LightPos - ecPosition);
            12    vec3 reflectVec = reflect(-lightVec, normal);
            13    vec3 viewVec    = normalize(-ecPosition);
            14
            15    float spec      = clamp(dot(reflectVec, viewVec), 0.01.0);
            16    spec            = pow(spec, 6.0);
            17
            18    LightIntensity  = (1.0-specularContribution) * max(dot(lightVec, normal), 0.0)
            19                       + specularContribution * spec;
            20
            21   LightIntensity=max(LightIntensity,0.0);
            22   gl_Position = ftransform();
            23}
             1uniform vec4 myColor;
             2uniform vec4 InnerColor;
             3uniform float RayTransmittance;
             4
             5varying vec3  normal;
             6varying float LightIntensity;
             7
             8void main(void)
             9{
            10   if(normal.z<=0.0)
            11   normal.z=1.0;
            12   float alpha=1.0-normal.z;
            13   alpha=pow(alpha,RayTransmittance);
            14   gl_FragColor =mix(myColor,InnerColor,alpha)+LightIntensity;//vec4( myColor.r, myColor.g, myColor.b, alpha );
            15}

            第二個(gè)是per pixel lighting,也簡(jiǎn)單,把vs中的東西搬到ps中就完了:
             1uniform vec3 LightPos;
             2
             3varying vec3 Normal_eyeSpace;
             4varying vec3 Pos_eyeSpace;
             5
             6void main(void)
             7{
             8   gl_Position = ftransform();
             9   
            10   Normal_eyeSpace=gl_NormalMatrix * gl_Normal;
            11   
            12   Pos_eyeSpace=gl_ModelViewMatrix * gl_Vertex;
            13   
            14   
            15}
             1uniform vec3 LightPos;
             2
             3varying vec3 Normal_eyeSpace;
             4varying vec3 Pos_eyeSpace;
             5
             6void main(void)
             7{
             8   Normal_eyeSpace=normalize(Normal_eyeSpace);
             9   vec3 LightDir_eyeSpace=normalize(Pos_eyeSpace-LightPos);
            10   
            11   float diffuse=max(dot(-LightDir_eyeSpace,Normal_eyeSpace),0.0);
            12   float spec = 0.0;
            13
            14    if (diffuse > 0.0)
            15    {
            16        vec3 reflectVec = reflect(LightDir_eyeSpace, Normal_eyeSpace);
            17        reflectVec=normalize(reflectVec);
            18       
            19        vec3 viewVec=normalize(-Pos_eyeSpace);
            20        spec = max(dot(reflectVec, viewVec), 0.0);//反射光 
            21        spec = pow(spec, 4.0);
            22    }

            23     float color=min(1.0,diffuse+spec);
            24
            25   gl_FragColor = vec4( color, spec, spec, 1.0 );
            26}

            第三個(gè)是normal mapping,比較難理解些,在vs中把點(diǎn)的空間位置弄清楚,然后ps中直接拿normal map的貼圖當(dāng)法線用。
            但是看過(guò)別人實(shí)現(xiàn)的normal mapping是可以控制凹凸的強(qiáng)度的,這里好像控制不了,那位高手能說(shuō)一說(shuō)思路?


             1uniform vec3 LightPosition;
             2
             3varying vec3 EyePos_pointTanSpace;
             4varying vec3 LightPos_pointTanSpace;
             5
             6attribute vec3 Tangent;
             7//uniform vec3 Tangent;
             8
             9void main()
            10{
            11    gl_Position = ftransform();
            12    gl_TexCoord[0= gl_MultiTexCoord0;
            13    
            14    
            15    vec3 Pos_eyeSpace = vec3(gl_ModelViewMatrix * gl_Vertex);
            16    
            17    // 眼坐標(biāo)系下的TBN
            18    vec3 n = normalize(gl_NormalMatrix * gl_Normal);
            19    vec3 t = normalize(gl_NormalMatrix * Tangent);
            20    vec3 b = cross(n, t);
            21    mat3 TBN = mat3(t, b, n);
            22
            23    vec3 pointLightPos=LightPosition-Pos_eyeSpace;//光相對(duì)于點(diǎn),在眼空間的位置
            24    LightPos_pointTanSpace=TBN*pointLightPos;//光相對(duì)于點(diǎn),在點(diǎn)的tangent坐標(biāo)系下的位置
            25
            26    
            27    vec3 eyePos=Pos_eyeSpace*-1.0;       //眼睛相對(duì)于點(diǎn),在眼空間的位置
            28    EyePos_pointTanSpace=TBN*eyePos;//眼睛相對(duì)于點(diǎn),在點(diǎn)的tangent坐標(biāo)系下的點(diǎn)位置
            29
            30    
            31}

             1uniform sampler2D BumpTex;
             2
             3uniform float bumpFactor;
             4
             5varying vec3 EyePos_pointTanSpace;
             6varying vec3 LightPos_pointTanSpace;
             7
             8void main() 
             9{
            10   float dist=length(LightPos_pointTanSpace);//光距離
            11
            12    vec3 BumpNorm = vec3(texture2D(BumpTex, gl_TexCoord[0].xy));//獲得法向量
            13    BumpNorm = (BumpNorm -0.5)* bumpFactor;
            14    
            15    
            16    vec3 LightDir=normalize(LightPos_pointTanSpace);//光方向
            17    vec3 viewVec=normalize(EyePos_pointTanSpace);//眼睛方向
            18    
            19    float diffuse = max(dot(BumpNorm, LightDir), 0.0);
            20    
            21    //diffuse=1.0/(pow(2.0,dist));//距離衰減
            22    
            23    vec3 reflectVec=reflect(-LightDir,BumpNorm);
            24    
            25    float spec = max(dot(reflectVec, viewVec), 0.0);//反射光 
            26    spec = pow(spec, 16.0);
            27
            28    float color=spec+diffuse;
            29    
            30    gl_FragColor = vec4(color,spec,0.01.0);
            31}
            posted on 2009-10-17 22:50 陳昱(CY) 閱讀(1375) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): 圖形學(xué)算法

            FeedBack:
            # re: shader的小奏鳴曲 2009-10-18 09:40 陳梓瀚(vczh)
            陳昱開(kāi)始搞shader了啊  回復(fù)  更多評(píng)論
              
            # re: shader的小奏鳴曲 2009-10-18 12:34 陳昱(CY)
            @陳梓瀚(vczh)

            是啊,空閑時(shí)間學(xué)習(xí)學(xué)習(xí),體驗(yàn)體驗(yàn),有什么建議嗎?  回復(fù)  更多評(píng)論
              
            # re: shader的小奏鳴曲 2009-10-18 18:03 99讀書(shū)人
            空閑時(shí)間學(xué)習(xí)學(xué)習(xí),體驗(yàn)體驗(yàn)  回復(fù)  更多評(píng)論
              
            亚洲国产精品无码久久一区二区 | 亚洲婷婷国产精品电影人久久| 99精品国产免费久久久久久下载| 亚洲国产精品婷婷久久| 国内精品久久久久影院免费| 国产精品一区二区久久不卡| 久久久久久人妻无码| 亚洲国产另类久久久精品| 久久er99热精品一区二区| 久久久婷婷五月亚洲97号色| 99久久久精品免费观看国产| 久久最近最新中文字幕大全| 久久e热在这里只有国产中文精品99| 久久久WWW成人免费毛片| 日韩欧美亚洲综合久久影院Ds| 国产免费久久精品99re丫y| 久久久久亚洲av综合波多野结衣 | 人妻无码αv中文字幕久久 | 久久精品国产99国产精品亚洲| 久久精品免费一区二区| 久久夜色精品国产噜噜噜亚洲AV| 99国产欧美精品久久久蜜芽 | 久久久免费观成人影院| 亚洲精品WWW久久久久久| 久久久av波多野一区二区| 97久久精品人人做人人爽| 伊人久久大香线蕉精品不卡| 久久精品一本到99热免费| 日韩亚洲欧美久久久www综合网| 久久久久久亚洲精品不卡| 午夜精品久久久久久久| 亚洲午夜精品久久久久久人妖| 亚洲国产精品无码久久久久久曰 | 99久久精品影院老鸭窝| 国内精品欧美久久精品| 久久男人Av资源网站无码软件| 久久久久久久综合综合狠狠| 久久精品国产清高在天天线| 色8激情欧美成人久久综合电| 国产精品无码久久久久久| 国内精品久久国产|