青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

月下的博客

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  34 Posts :: 0 Stories :: 59 Comments :: 0 Trackbacks

常用鏈接

留言簿(5)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評論

  • 1.?re: 五年感想
  • 5年一轉(zhuǎn)眼,我已經(jīng)進(jìn)入工作的第9個年頭了,缺少的是思考,一直安于現(xiàn)狀,也該反思了
  • --liquanhai
  • 2.?re: 五年感想
  • 認(rèn)為是設(shè)計(jì)-》現(xiàn)在轉(zhuǎn)變?yōu)槿?!
  • --linda
  • 3.?re: 五年感想
  • 決定游戲成功的因素
  • --linda
  • 4.?re: 五年感想
  • 果真人會沉淀是真的
  • --張恒
  • 5.?re: 五年感想
  • 樓主 最近股市大漲
    希望你能再接再厲
    再創(chuàng)輝煌
  • --ccsdu2009

閱讀排行榜

評論排行榜

 

自從以前看了clayman博客后,就很想把自己代碼里dxeffect框架替代掉。如今實(shí)習(xí)結(jié)束正好有短暫的自由時間,所以就ogrematerial開刀吧。

  山寨代碼也是有學(xué)問的,如果你想搞明白這些代碼的含義的話,最后之前就對這些已經(jīng)有了一定的使用經(jīng)歷和認(rèn)知,第一步先得自己想一下material系統(tǒng)的組成:
material
應(yīng)該包含的:1Material->n Techinque->(n Pass + extra params)->(n TextureUnit + m or 0 shaderUnit + n RenderStates(部分)),Pass里的TextureUnit又包含了這一組texture的相關(guān)信息和設(shè)置,TexcoordSet, AddressMode, FilterSetting等等, ShaderUnit則是對應(yīng)于vsfs以及新的gs,普通點(diǎn)也就最多兩組。shaderUnit包含了具體的shader和其shaderParams,為何要把shadershaderParams分開呢,不說設(shè)計(jì)優(yōu)雅的考慮,簡單的說就是方便,很多時候params可能會需要共享,譬如shaderA里用到mvpMat,和eyePos diffuse,specular,可能shaderB也只用到這些,但是兩個shader的內(nèi)部計(jì)算并不相同。到此我們只分析了作為程序中的材質(zhì)的結(jié)構(gòu),還需要考慮如果編寫一個類似fx格式的material script,這也是另外一個大頭,簡單的說就是要做個腳本解釋,然后給shader參數(shù)加上語義,減少大部分需要手動更新的shaderParams。鑒于我如今還沒把這塊扒完,等下次再寫這塊吧。


   當(dāng)你至少能閉著眼睛想透這些了,那就可以開始看ogrematerial system了,先說句題外話,我讀ogre的代碼其實(shí)讀挺久了。一直覺得很難讀,開始覺得是自己水平不夠,但后來實(shí)習(xí)才發(fā)現(xiàn)很多人都有這想法,甚至wolfgang對此也有批評,而自己曾經(jīng)寫了個olong引擎,接觸過ipad編程的人應(yīng)該對這些代碼都比較熟悉~ogre里用了大量的設(shè)計(jì)模式,使得整個渲染流程從不同類里跳來跳去(SceneMgr這塊看著最累了。。其實(shí)有很多地方看著都很累。。)個人覺得應(yīng)該把renderSceneMgr里抽離出來做個RenderMgr,(記住這里的RenderMgr的概念和ogreRenderSystem,后者是提供底層渲染API的接口,而前者是管理renderData并最終遞交給RenderSystem,以前也見有別人博客講過這個問題)讓SceneMgr專門管理Scene。。
 
打住打住。。我是來寫material的。。咳咳。。相當(dāng)于渲染來說,ogrematerial system還是相當(dāng)易讀的,也是因?yàn)檫@些模塊相互關(guān)系幾乎都是單向的,我們開始編寫的時候可以先不考慮Technique,就是直接1 Material->n Pass->...當(dāng)然甚至你都可以把multi pass去掉,就等同于1pass,當(dāng)然由于pass都代碼實(shí)際也沒多少,我們還是加上好了。

原始渲染的偽代碼就是:

 1for each pass
 2{
 3  setRenderStates(like alphe belnd, depth..)
 4  for each texture unit
 5    setTexSettings();
 6  if(hasVertexShader())
 7  {
 8    bindVertexShader();
 9    setShaderParams(vs);
10  }

11  if(hasFragmentShader())
12  {
13    bindFragmentShader();
14    setShaderParams(fs);
15  }

16  drawPrimitives();
17}

加入的RenderQueue也是一樣,只是pass和對應(yīng)的renderData我們是從renderqueue里取。

看到這里你會覺得,嘿,很簡單嘛,但如果你看了ogre里關(guān)于shader參數(shù)的細(xì)節(jié),你就知道這塊還是比較復(fù)雜的。我們剛只說了一個運(yùn)行過程,而建立params到constant registers的關(guān)系,以及如何編寫autoConstants的代碼都是魔鬼的細(xì)節(jié)~~對于dx,我們可以簡單點(diǎn),直接使用ID3DXConstantTable,它提供了set接口。但ogre則是直接從ID3DXConstantTable中解析參數(shù)。

   設(shè)計(jì)這塊的時候,腦子里先要對我整個過程有個清晰的認(rèn)識:一方面是從shader里(我們這里假設(shè)是hlsl,asm先不考慮),另一方面則是解析參數(shù)讀入材質(zhì)腳本里定義的參數(shù)(named,autoNamed,或者index),最后將兩者對應(yīng)上。

0.類型解釋
看過OgreGpuProgramParams.cpp/h的人都知道:GpuConstantDefinition,GpuNamedConstants,GpuLogicalIndexUse,GpuSharedParameters,GpuSharedParametersUsage,一堆的struct和class。。其實(shí)按照我們上面這個思路逐步加斷點(diǎn)分析,代碼也沒那么繁瑣。暫時不看GpuSharedParameters這塊,大概看下GpuConstantDefinition,重點(diǎn)變成員是physicalIndex和logicalIndex,前者的解釋是buffer中的起始地址,每個GpuProgramParameters里都包含了vector<int>和vector<float>兩個buffer,他們存儲了shader變量的值,而physicalIndex就是對應(yīng)vector的索引。而logicalIndex則是我們后面將hlsl編譯成asm后這些變量所綁定的寄存器id,而由于constant reg的size都是4,即一個register為4個float的大小,所以這些logicalIndex則不一定連續(xù),譬如第一個uniform為float1那么第二個uniform的logicalIndex雖然是1,但實(shí)際跨過了4個float,而實(shí)際內(nèi)存中我們的float(int同) buffer里,兩個變量之間的則就空了3個float,這就是physicalIndex的作用,所以我們還需要建立一個從logicalIndex到physicalIndex的map,也就是兩個GpuLogicalBuffersStructPtr對象(這兩個對象和GpuNamedConstantsPtr在GpuProgram類和GpuProgramParameters是共享的,都是sharedPtr)

1.解析shader的變量
  
我們從再具體的讀取代碼來看,假設(shè)我們已經(jīng)從腳本里讀入了對應(yīng)的shader,經(jīng)過一堆調(diào)用后(略。。)在D3D9HLSLProgram的函數(shù)buildConstantDefinitions->processParamElement將每個參數(shù)的registerIndex,physicalIndex, type(原子類型,即float, int,),size都寫入GpuLogicalBuffersStructPtrGpuNamedConstantsPtr對象里(后者當(dāng)然是只有highLevelShader里才有),并會為這個定義同樣在插入帶下標(biāo)的一對鍵值,以便于如果我們傳入的參數(shù)是數(shù)組(譬如float4x4[5]),則在程序里可以通過數(shù)組下標(biāo)訪問對應(yīng)的數(shù)組變量。再constantDef建立好之后,將GpuNamedConstantsPtr傳入到GpuProgramParameters對象里,然后向其中的兩個vector添加上述對象大小的空間,在將兩個LogicalToPhysicalMap的指針也傳到shaderParams里,這樣整個GpuProgramParameters幾乎就完工了。

2.解析材質(zhì)里定義的params,并將其與前者對應(yīng)上
  如今就差再把material script定義的param解析出來并與之前shader里的變量進(jìn)行對應(yīng)。材質(zhì)腳本讀出的每個變量的信息包含了param類型(namedauto_namedindexauto_index),name,type(float,int..),autoType(auto的才有),初始值等。我們根據(jù)其autoType在全局變量AutoConstantDictionary中查找是否有定義,然后調(diào)用set[Named]AutoConstant,在這里我們在會在我們之前從hlsl里解析出的GpuNamedConstantsPtr里查找是否有該名字的變量(畢竟shader里的變量才是最終有用的,甚至由于編譯器優(yōu)化的關(guān)系,由于shader編寫者可能定義了一個變量而未實(shí)際使用,在編譯shader后,這個變量實(shí)際是會被省略的,這樣在GpuNamedConstantsPtr也就找不到了)然后調(diào)用_setRawAutoConstant將這個變量加入到這個GpuProgramParameters對象所持有的autoConstant中。

(ps:關(guān)于_getFloatConstantLogicalIndexUse的用途我沒看懂,為何需要去在mFloatLogicalToPhysical里去查找這個logicalIndex是否存在呢,我覺得如果走到這一步肯定shader里肯定就是定義了的,因?yàn)檫@個logicalIndex是由mNamedConstants里取出,我覺得是沒必要的。。)

3,更新autoParamsbuffer并最終在DP前進(jìn)行更新

把上面的過程看懂了,下面就很好理解了。GpuProgramParameters::_updateAutoParams里就是對GpuProgramParameters對象所持有的autoConstant值進(jìn)行更新,當(dāng)然這是我們只是對GpuProgramParameters持有的buffer里的值做更新,最終在文章開頭的偽代碼中的setShaderParamsogre里叫bindGpuProgramParamters而這里的更新就輕而易舉了,我們遍歷logicalToPhysicalMap對每個param取出對應(yīng)的logicalIndexdataPointervector4ofCount,然后調(diào)用SetVertex/PixelShaderConstantF/I即可。



呼。。終于把這塊寫完了。。上述只是一個實(shí)現(xiàn)自己的material的基本思路。關(guān)于優(yōu)化的話,我開頭推薦的clayman的文章里有很多敘述。關(guān)于怎么寫ogre script translator,等下一篇再說。。

posted on 2011-04-18 23:32 月下圓舞曲 閱讀(4143) 評論(1)  編輯 收藏 引用 所屬分類: 開發(fā)

Feedback

# re: 沿著ogre來實(shí)現(xiàn)material system(一) 2012-08-20 09:09 sxx
09:03:57: OGRE EXCEPTION(2:InvalidParametersException): Parameter called worldVeiwMatrix does not exist. in GpuProgramParameters::_findNamedConstantDefinition at ..\..\..\..\OgreMain\src\OgreGpuProgramParams.cpp (line 1435)  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品美女久久久久av福利| 欧美在线观看一区| 免费观看亚洲视频大全| 欧美一区二区三区在线看| 国产一区亚洲| 欧美成人免费小视频| 欧美人与禽猛交乱配视频| 在线综合视频| 性做久久久久久久免费看| 亚洲大胆在线| 中日韩男男gay无套 | 在线视频欧美精品| 国产精品一区视频网站| 牛牛国产精品| 欧美午夜不卡| 欧美成人精品影院| 欧美性色综合| 欧美大片在线观看| 国产精品美女久久| 欧美.www| 国产毛片一区| 亚洲大片在线| 国产欧美日韩高清| 亚洲区在线播放| 精东粉嫩av免费一区二区三区| 亚洲精品日本| 影院欧美亚洲| 亚洲一级免费视频| 日韩写真在线| 久久久福利视频| 午夜精品久久久久99热蜜桃导演| 久久天堂国产精品| 欧美影视一区| 欧美日韩日本网| 免费观看亚洲视频大全| 国产女人18毛片水18精品| 亚洲激情午夜| 亚洲东热激情| 久久成人精品无人区| 校园春色国产精品| 欧美天堂亚洲电影院在线观看 | 中文精品在线| 久久深夜福利| 久久亚洲色图| 国产视频一区在线| 亚洲欧美精品一区| 亚洲伊人色欲综合网| 欧美日韩成人激情| 亚洲欧洲偷拍精品| 亚洲看片一区| 欧美国产成人在线| 亚洲第一黄网| 亚洲理论电影网| 欧美成人亚洲成人| 欧美激情1区2区3区| 亚洲第一精品夜夜躁人人爽| 久久国产婷婷国产香蕉| 久久亚洲一区二区三区四区| 韩国一区二区三区美女美女秀| 亚洲欧洲99久久| 久久久久久网| 亚洲大胆人体在线| 欧美午夜一区二区福利视频| 亚洲靠逼com| 亚洲一区二区三区影院| 国产精品久久国产三级国电话系列 | 亚洲精选视频免费看| 一区二区三区免费看| 欧美日本三区| 亚洲小说区图片区| 欧美在线视频日韩| 狠狠色狠色综合曰曰| 久久亚洲综合| 亚洲欧洲一区二区在线播放| aa级大片欧美| 国产精品免费福利| 久久精品国产v日韩v亚洲 | 久久国产一区| 在线观看日韩av电影| 欧美人与性动交α欧美精品济南到| 亚洲美女区一区| 久久国内精品自在自线400部| 国产综合色精品一区二区三区| 久久人人97超碰人人澡爱香蕉 | 久久久噜噜噜久久中文字免| 一色屋精品亚洲香蕉网站| 欧美xxxx在线观看| 国产精品99久久久久久宅男| 久久久久网址| 一本色道久久综合精品竹菊 | 亚洲欧美乱综合| 影音先锋国产精品| 欧美日韩一区二区在线观看视频| 亚洲欧美中文日韩v在线观看| 欧美xart系列高清| 亚洲视频www| 狠狠干成人综合网| 欧美日韩在线一区二区| 欧美在线观看www| 日韩亚洲精品电影| 久久亚洲精品一区二区| 在线视频日韩| 亚洲电影欧美电影有声小说| 国产精品国产三级国产普通话蜜臀| 欧美在线观看天堂一区二区三区| 亚洲片国产一区一级在线观看| 久久精品在线观看| 亚洲男人第一网站| 亚洲精品一区二区三区av| 国产精品永久入口久久久| 欧美激情一区二区| 久久久噜噜噜久久中文字免| 亚洲图片欧美午夜| 亚洲人成亚洲人成在线观看图片| 久久九九国产| 亚洲一区二区视频在线| 亚洲激情社区| 伊人久久大香线蕉av超碰演员| 国产麻豆综合| 国产精品美女诱惑| 欧美日韩三级电影在线| 欧美成人午夜剧场免费观看| 国产欧美一级| 亚洲第一精品夜夜躁人人躁| 国产精品女人网站| 欧美日韩国产小视频| 女仆av观看一区| 久久综合色天天久久综合图片| 亚洲欧美在线高清| 亚洲免费在线视频| 亚洲一区国产视频| 亚洲一品av免费观看| 亚洲视频在线观看| 亚洲少妇诱惑| 亚洲网站啪啪| 亚洲性视频网址| 亚洲一区中文字幕在线观看| 亚洲一区黄色| 欧美亚洲免费在线| 久久精品国产99精品国产亚洲性色| 欧美亚洲免费高清在线观看| 久久riav二区三区| 久久久综合免费视频| 久久精品夜色噜噜亚洲a∨| 久久久99精品免费观看不卡| 久久久久久久久综合| 久久午夜视频| 欧美77777| 欧美日韩成人综合在线一区二区 | 国产精品拍天天在线| 国产精品最新自拍| 激情一区二区三区| 亚洲片在线观看| 亚洲一区二区三区视频播放| 午夜精品久久一牛影视| 久久久久久久高潮| 欧美成人综合一区| 99在线热播精品免费| 亚洲综合国产| 久久视频免费观看| 欧美精品日日鲁夜夜添| 国产精品家教| 在线看片一区| 亚洲一卡二卡三卡四卡五卡| 欧美中文在线字幕| 欧美激情一二三区| 亚洲视频在线观看视频| 久久久久综合| 欧美日韩中文另类| 激情小说亚洲一区| 在线天堂一区av电影| 欧美在线观看视频一区二区三区| 男人天堂欧美日韩| 国产精品99久久久久久宅男| 久久久久久有精品国产| 欧美日韩激情网| 韩曰欧美视频免费观看| 亚洲一区中文| 亚洲高清二区| 久久不射电影网| 欧美体内谢she精2性欧美| 影音先锋亚洲电影| 亚洲欧美国产制服动漫| 欧美国产日韩一二三区| 亚洲一区二区三区在线| 欧美va亚洲va日韩∨a综合色| 国产精品女同互慰在线看| 亚洲精品一二区| 久久综合色播五月| 亚洲一区二区三区乱码aⅴ| 欧美大胆a视频| 一区在线观看视频| 欧美一区二区视频在线| 日韩视频中文字幕| 欧美r片在线| 在线看国产一区| 久久偷看各类wc女厕嘘嘘偷窃| 一本一本久久a久久精品牛牛影视| 蜜月aⅴ免费一区二区三区| 国产一区久久|