• <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
            <2011年10月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(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) 閱讀(1374) 評論(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讀書人
            空閑時間學習學習,體驗體驗  回復  更多評論
              
            久久久无码精品亚洲日韩按摩 | 国产精品久久久久久久人人看| 亚洲国产成人久久精品动漫| 久久久久综合网久久| 久久综合九色综合久99| 国内精品伊人久久久影院| 久久无码人妻一区二区三区午夜| 国产精品久久毛片完整版| 久久毛片免费看一区二区三区| 亚洲中文久久精品无码ww16 | 久久精品这里只有精99品| 久久久久久久久久久久久久| 亚洲中文字幕久久精品无码喷水| 久久91精品国产91久久麻豆| 久久婷婷午色综合夜啪| 国产综合久久久久| 亚洲欧美一级久久精品| 66精品综合久久久久久久| 中文字幕久久久久人妻| 久久人人爽人人爽AV片| 久久91综合国产91久久精品 | 91久久精品视频| 久久无码人妻一区二区三区| 久久午夜夜伦鲁鲁片免费无码影视 | 久久精品中文字幕第23页| 久久婷婷五月综合97色一本一本| 亚洲另类欧美综合久久图片区| 丰满少妇人妻久久久久久4| 久久国产精品77777| 亚洲愉拍99热成人精品热久久| 中文精品久久久久人妻| 久久久99精品成人片中文字幕 | 日本WV一本一道久久香蕉| 久久婷婷五月综合色99啪ak| 伊人热人久久中文字幕| 国产高清国内精品福利99久久| 国内精品久久国产大陆| 久久婷婷综合中文字幕| 天天爽天天爽天天片a久久网| 国内精品久久久久久野外| 久久久久久久综合日本亚洲|