• <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>

            公告

            聯系我:我的126郵箱: billhsu。 Locations of visitors to this page
            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統計

            • 隨筆 - 41
            • 文章 - 0
            • 評論 - 82
            • 引用 - 0

            常用鏈接

            留言簿(16)

            隨筆分類

            隨筆檔案

            相冊

            Game Dev

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            基于shader的骨骼蒙皮計算

                 摘要: 我的古董顯卡很操蛋,好端端的shader,傳骨骼矩陣進去,硬是沒反應。。
            尋尋覓覓,找到了 NVIDIA SDK 的example,終于解決了。
            難道我的顯卡不支持BLENDINDICES和BLENDWEIGHT?
            把BLENDINDICES和BLENDWEIGHT用TEXCOORD[n]表示才正常。。
            不說廢話,直接上代碼。  閱讀全文

            posted @ 2010-04-01 22:10 Bill Hsu 閱讀(1027) | 評論 (0)編輯 收藏
            fstream那些事

            感覺fstream有些地方設計的不太合理,不知道是bug還是那些牛X們故意這樣的。

            首先,fstream竟然在中文路徑這種東西上不支持,網上也可以看到許多實現方法,但有的方法其實并不是太好。
            我覺得這樣做最簡單:

            setlocale(LC_ALL,"");//設置成當前語言環境
            ofstream?out(filename);//打開文件
            setlocale(LC_CTYPE,?0);

            還有,fstream的getline也有問題,對于那些\n \r 空行 什么的都沒考慮,用起來會出錯。
            在網上看到一個函數可以完美解決這個問題:
            bool?readline(ifstream&?infile,?string&?textline)
            {

            while(getline(infile,?textline,?'\n'))
            {
            ??
            int?prev_pos?=?0;?//最開始有效字符位置.
            ??int?post_pos?=?0;?//最后有效字符位置
            ??
            //下面的循環語句能夠用textline.find_first_not_of(filter,pos)來處理,出于效率考慮本處使用這樣的算法
            ??while(textline[prev_pos]?==?'?'?||?textline[prev_pos]?==?'\t'?||?textline[prev_pos]?==?'\r')//過濾開始空白
            ???prev_pos++;
            ??
            if(textline[prev_pos]?==?'\0')
            ???
            continue;//假如是空白行則再讀一行進行處理.
            ??else
            ??{
            ?????? post_pos
            =textline.length()-1;
            ??????
            while(textline[post_pos]?==?'?'?||?textline[post_pos]?==?'\t'?||?textline[post_pos]?==?'\r')//過濾最后的空白
            ???????????? {
            ????????????????? post_pos
            --;
            ???????????? }
            ?????? textline
            =textline.substr(prev_pos,post_pos+1-prev_pos);
            ???
            return?true;//成功讀取一有效行
            ??}
            ??
            }
            return?false;//讀到文檔的末尾
            }

            我根據上面這個函數 重載了一個char* 版的:

            bool?readline(ifstream&?infile,?char*?textline)
            {
            while(infile.getline(textline,32))
            {
            ??
            int?prev_pos?=?0;?//最開始有效字符位置
            ??int?post_pos?=?0;?//最后有效字符位置.??
            ??string?str=textline;
            ??
            //下面的循環語句能夠用textline.find_first_not_of(filter,pos)來處理,出于效率考慮本處使用這樣的算法
            ??while(str[prev_pos]?==?'?'?||?str[prev_pos]?==?'\t'?||?str[prev_pos]?==?'\r')//過濾開始空白
            ???prev_pos++;
            ??
            if(str[prev_pos]?==?'\0')
            ???
            continue;//假如是空白行則再讀一行進行處理
            ??else
            ??{
            ???????? post_pos
            =str.length()-1;
            ????????
            while(str[post_pos]?==?'?'?||?str[post_pos]?==?'\t'?||?str[post_pos]?==?'\r')//過濾最后的空白
            ???????? {
            ?????????????? post_pos
            --;
            ???????? }
            ????????
            string?str2=str.substr(prev_pos,post_pos+1-prev_pos);
            ???????? strcpy(textline,str2.c_str());
            ????????

            ???return?true;//成功讀取一有效行
            ??}
            }
            return?false;//讀到文檔的末尾
            }


            posted @ 2010-03-27 18:37 Bill Hsu 閱讀(1801) | 評論 (3)編輯 收藏
            GPU水面模擬

            先上個自己實現的水面模擬圖:


            效果比較簡單,只是模擬了下水面的反射效果。折射與Fresnel系數沒有考慮。

            水面模擬大致需要分這么幾步:
            1.剪裁掉水面以下的頂點[gpu里的clipplane要注意轉換到Clip Space],
            將攝像機放到同原攝像機關于水面對稱的位置,比如原來攝像機在(x,y,z),
            此時就該把攝像機放在(x,-y,z),up向量也要設置成向下的。
            再把場景渲染到Render Target的紋理上(我用的紋理大小是256*256),不知道為什么Render Target的紋理大小不能超過窗口大小,超過的話渲染會出錯,知道的大大告訴我一下哈。

            于是,就得到了這樣一個紋理:


            2.將上面得到的紋理與水面的頂點對應.
            把Vertex Shader中乘過變換矩陣后的坐標傳到Pixel Shader,
            在PS中計算

            ?? ???? float2 clipspace = input.Coord.xy / input.Coord.w;
            ?? ???? clipspace.x=((clipspace.x * 0.5f) + 0.5f);
            ?? ???? clipspace.y = ((clipspace.y * -0.5f) + 0.5f);
            ?? ???? clipspace.x=1-clipspace.x;
            既可以讓水面頂點與紋理對應,然后再想辦法把紋理坐標擾亂來模擬水面波動。

            3.再渲染一次場景就可以了。

            大家也可以參考下Azure的水面渲染源代碼:
            http://www.azure.com.cn/article.asp?id=186

            posted @ 2010-03-23 20:59 Bill Hsu 閱讀(1994) | 評論 (0)編輯 收藏
            可編程管道下的剪裁平面

            剪裁平面 (Clip Plane) 在圖形學領域有著重要的作用,比如水面模擬中,渲染折射紋理時,我們就必須將水面以上的頂點通過剪裁平面剪裁掉。

            在過去的固定渲染管道時代,剪裁平面的實現較為簡單,比如在 DirectX 9 中,可以先設定剪裁平面在世界坐標系下的方程 (ax+by+cz+d=0) ,再調用 SetClipPlane(DWORD Index,CONST float * pPlane) 這個 API 函數就可以了。

            ?

            附上例子程序:

            vPosition=D3DXVECTOR3(0,0,0); // 平面上一個點
            vNormal=D3DXVECTOR3(0,1,0); // 法向量
            D3DXPlaneFromPointNormal(?&clipplane,?&vPosition,?&vNormal?); // 生成剪裁平面

            m_pDevice()->SetClipPlane(?0,?(
            float *)clipplane);?

            ?

            然而,在現在的可編程管道 (programmable pipeline) 下,設置的剪裁平面會被在剪裁坐標系下處理,而不是在世界坐標系下。

            解決這個問題的方法有:

            1)? 給要剪裁的頂點做標記,在Pixel Shader中把它剪裁掉。

            2)? 使用近斜平面裁剪(Oblique Near-Plane Clipping),即修改投影矩陣,將要剪裁的頂點放在視截體之外,從而避免了該頂點的繪制。

            3)? 修改平面方程,使之從世界坐標系轉換到剪裁坐標系。


            上述方法中,第一種和第二種效率并不高:在
            Pixel Shader中剪裁沒有減少任何不必要的頂點處理,而計算近斜平面裁剪矩陣較為繁瑣。所以,方法三是最佳選擇。

            ?要將一個平面從世界坐標系轉換到剪裁坐標系,必須求出這個變換矩陣。

            設平面方程ax+by+cz+d=0,用一個4維向量來n表示(a,b,c,d),設平面上有個點p:(x,y,z,1)。根據平面方程的定義,有:


            nTp = ax + by + cz + d = 0

            設矩陣R可以讓點P從世界坐標系轉換到剪裁坐標系,矩陣Q可以讓平面n實現同樣的變換。那么,有:

            p'= Rp
            n'= Qn

            其中p'n'分別是轉換后的點與平面。


            n'Tp'= 0
            (Qn)T (Rp) = 0
            nTQTRp = 0


            如果:QTR = I

            那么:

            nTQTRp = nTIp = nTp = 0

            于是:

            QT = R-1
            Q
            = (R-1)T

            DirectX 3D中,將一個點從世界坐標系轉換到剪裁坐標系,所用的矩陣為觀察矩陣與投影矩陣的乘積,即:

            D3DXMATRIX??TranMatrix?=?matView*matProj;

            (TranMatrix為所求的變換矩陣,matViewmatProj分別為觀察矩陣與投影矩陣)

            ?

            附上在D3D中變換的完整代碼:

            D3DXPLANE?tempPlane?=?clipplane;
            D3DXPlaneNormalize(&tempPlane,?&tempPlane);

            D3DXMATRIX??TranMatrix?=?matView*matProj;
            D3DXMatrixInverse(&TranMatrix,?NULL,?&TranMatrix);
            D3DXMatrixTranspose(&TranMatrix,?&TranMatrix);
            D3DXPlaneTransform(&tempPlane,?&tempPlane,?&TranMatrix);

            參考資料:

            1.Back Face Culling Notes ,Jordan Smith (University of California, Berkeley)

            http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/backfacecull.shtml?

            2.GameDev Forum

            http://www.gamedev.net/community/forums/topic.asp?topic_id=402381

            3.Oblique Near-Plane Clipping with Orthographic Camera ,Aras

            http://aras-p.info/texts/obliqueortho.html

            posted @ 2010-01-20 22:00 Bill Hsu 閱讀(2018) | 評論 (2)編輯 收藏
            矩陣求逆代碼

                 摘要: 感覺線性代數作業里一直少不了矩陣求逆,

            寫個帶輸出算逆矩陣的步驟的矩陣求逆程序,希望給即將或正在學線代的同學一點方便。  閱讀全文

            posted @ 2009-12-11 22:23 Bill Hsu 閱讀(6765) | 評論 (8)編輯 收藏
            僅列出標題
            共9頁: 1 2 3 4 5 6 7 8 9 
            精品久久久无码人妻中文字幕| 久久亚洲AV无码精品色午夜麻豆| 亚洲中文字幕久久精品无码APP| 久久综合偷偷噜噜噜色| 久久亚洲春色中文字幕久久久 | 99久久精品九九亚洲精品| 狠狠色丁香久久婷婷综合_中| 精品久久久久久久无码| 久久国产精品-久久精品| 国产一区二区三精品久久久无广告| 日韩中文久久| 99久久久国产精品免费无卡顿| 久久精品国产亚洲av瑜伽| 亚洲中文久久精品无码ww16 | 欧美午夜A∨大片久久| 人妻久久久一区二区三区| 久久93精品国产91久久综合| 久久精品国产第一区二区三区| 欧美国产成人久久精品| 91久久婷婷国产综合精品青草| 欧美一级久久久久久久大| 曰曰摸天天摸人人看久久久| 77777亚洲午夜久久多人| 久久亚洲AV无码西西人体| 欧美综合天天夜夜久久| 日韩人妻无码一区二区三区久久| 久久久久亚洲AV无码专区桃色| 国产亚洲精久久久久久无码| 久久免费看黄a级毛片| 久久久国产99久久国产一| 国産精品久久久久久久| 伊人色综合久久天天| 久久精品视频网| 99久久精品费精品国产| 久久99精品国产一区二区三区| 亚洲国产精品无码久久一线 | 久久精品国产亚洲AV无码麻豆 | 久久精品国产免费观看| 欧美午夜A∨大片久久 | 亚洲中文字幕伊人久久无码| 久久久久99精品成人片三人毛片|