• <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年10月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            好友連接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            第一個是最容易“發明”的車輪:x射線效果,不過按這個做法實現真正透明的話還要逐個物體渲染到紋理,再疊加:

             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}

            第二個是per pixel lighting,也簡單,把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}

            第三個是normal mapping,比較難理解些,在vs中把點的空間位置弄清楚,然后ps中直接拿normal map的貼圖當法線用。
            但是看過別人實現的normal mapping是可以控制凹凸的強度的,這里好像控制不了,那位高手能說一說思路?


             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    // 眼坐標系下的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;//光相對于點,在眼空間的位置
            24    LightPos_pointTanSpace=TBN*pointLightPos;//光相對于點,在點的tangent坐標系下的位置
            25
            26    
            27    vec3 eyePos=Pos_eyeSpace*-1.0;       //眼睛相對于點,在眼空間的位置
            28    EyePos_pointTanSpace=TBN*eyePos;//眼睛相對于點,在點的tangent坐標系下的點位置
            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) 閱讀(1369) 評論(3)  編輯 收藏 引用 所屬分類: 圖形學算法

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

            是啊,空閑時間學習學習,體驗體驗,有什么建議嗎?  回復  更多評論
              
            # re: shader的小奏鳴曲 2009-10-18 18:03 99讀書人
            空閑時間學習學習,體驗體驗  回復  更多評論
              
            午夜人妻久久久久久久久| 一极黄色视频久久网站| 久久精品国产亚洲av麻豆小说 | 很黄很污的网站久久mimi色| 国产精品免费看久久久香蕉| 中文字幕精品久久| 亚洲中文字幕久久精品无码喷水| 日韩一区二区久久久久久| 久久精品国产精品亚洲| 国产三级久久久精品麻豆三级| 无码国内精品久久人妻麻豆按摩| 久久综合九色综合欧美狠狠| 免费无码国产欧美久久18| 88久久精品无码一区二区毛片 | 久久婷婷色香五月综合激情| 国内精品久久国产大陆| 久久男人Av资源网站无码软件 | 日韩精品久久无码人妻中文字幕| 性欧美大战久久久久久久| 99久久免费国产精品热| 国产精品青草久久久久婷婷| 亚洲国产成人久久综合野外| 国产精品热久久毛片| 97久久精品无码一区二区| 久久久久久精品久久久久| 亚洲中文久久精品无码| 欧美午夜精品久久久久久浪潮| 香港aa三级久久三级| 99久久久精品免费观看国产| 欧美黑人又粗又大久久久| 久久久午夜精品| 免费无码国产欧美久久18| 免费精品久久天干天干| 久久中文字幕视频、最近更新| 伊人色综合九久久天天蜜桃| 久久精品无码一区二区app| 国产精品九九久久免费视频 | 国内精品伊人久久久久影院对白| 69国产成人综合久久精品| 久久99国产乱子伦精品免费| 韩国无遮挡三级久久|