![使用uniform塊來優(yōu)化對uniform變量的讀寫資料_第1頁](http://file4.renrendoc.com/view/f70baca3ccb177a7841615b1503c0254/f70baca3ccb177a7841615b1503c02541.gif)
![使用uniform塊來優(yōu)化對uniform變量的讀寫資料_第2頁](http://file4.renrendoc.com/view/f70baca3ccb177a7841615b1503c0254/f70baca3ccb177a7841615b1503c02542.gif)
![使用uniform塊來優(yōu)化對uniform變量的讀寫資料_第3頁](http://file4.renrendoc.com/view/f70baca3ccb177a7841615b1503c0254/f70baca3ccb177a7841615b1503c02543.gif)
![使用uniform塊來優(yōu)化對uniform變量的讀寫資料_第4頁](http://file4.renrendoc.com/view/f70baca3ccb177a7841615b1503c0254/f70baca3ccb177a7841615b1503c02544.gif)
![使用uniform塊來優(yōu)化對uniform變量的讀寫資料_第5頁](http://file4.renrendoc.com/view/f70baca3ccb177a7841615b1503c0254/f70baca3ccb177a7841615b1503c02545.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1010使用uniform塊來優(yōu)化對uniform變量的讀寫Uniform塊如果shader程序變得比較復(fù)雜,那么其中用到的uniform變量數(shù)量也會上升。通常會在多個shader程序中用到同一個uniform變量。而uniformbufferobject就是一種優(yōu)化uniform變量訪問,以及在不同的shader程序間共享uniform數(shù)據(jù)的方法。寫法首先了解一下uniform塊的寫法。uniformb{//‘b’對應(yīng)于外部訪問時的名稱vec4v1;//塊中的變量列表boolv2;//…};//訪問成員時使用v1、v2或者uniformb{//‘b’對應(yīng)于外部訪問時的名稱vec4v1;//塊中的變量列表boolv2;//…}name;//訪問成員時使用name.v1、name.v2注意,shader程序中的數(shù)據(jù)類型有兩種:不透明的和透明的;其中不透明的包括sampler、image和atomiccounter。一個uniform塊中只能包含透明類型的變量。另外,在同一個shader程序里的兩個uniform塊,里面的變量名都不能相同。下面我們以具體例子的編寫過程來說明在如何使用uniform塊,順便了解一下CSharpGL是如何簡化對uniform塊的使用的。回到頂部(gototop)Shader我認為用ModernOpenGL渲染,首先要寫shader。我們先看一個簡單的vertexshader。復(fù)制代碼#version330coreuniformmat4projectionMatrix;uniformmat4viewMatrix;uniformmat4modelMatrix;invec3vPos;invec3vColor;outvec3fColor;11voidmain(void){99{12gl_Position=projectionMatrix*viewMatrix*modelMatrix*vec4(vPos,1.0);fColor=vColor;}復(fù)制代碼Uniforms”我們就把這里面的uniform變量換作塊,如下,只是把原來的uniformUniforms”復(fù)制代碼#version330coreuniformUniforms{mat4projectionMatrix;mat4viewMatrix;mat4modelMatrix;};invec3vPos;invec3vColor;outvec3fColor;voidmain(void){gl_Position=projectionMatrix*viewMatrix*modelMatrix*vec4(vPos,1.0);fColor=vColor;}復(fù)制代碼而fragmentshader則更簡單:復(fù)制代碼#version330coreinvec3fColor;outvec4out_Color;voidmain(void){out_Color=vec4(fColor,1.0f);}復(fù)制代碼回到頂部(gototop)準備工作傳送一個自定義的structUniform塊,實際上對應(yīng)一個在應(yīng)用程序客戶端的struct類型。對于示例中的‘Uniforms'塊,我們可以定義如下的結(jié)構(gòu)體。為了方便對照,我們也用‘Uniforms'作為struct名,其實你可以用任意你喜歡的名字。復(fù)制代碼structUniforms:IEquatable<Uniforms>{publicmat4projection;publicmat4view;publicmat4model;publicUniforms(mat4projection,mat4view,mat4model)TOC\o"1-5"\h\z{jection=projection;this.view=view;this.model=model;}publicboolEquals(Uniformsother){jection==jection&&this.view==other.view&&this.model==other.model;}}復(fù)制代碼今后我們就將數(shù)據(jù)準備好后保存到一個Uniforms對象,最終傳送到shader。uniform塊結(jié)構(gòu)這里是重點了。傳送float類型的uniform變量,我們有UniformFloat;傳送vec3類型的uniform變量,我們有UniformVec3。但是uniform塊傳送的是一個個可以任意自定義的不同的結(jié)構(gòu)體(例如上面的structUniforms),因此最好用一個泛型的UniformBlock<T>。復(fù)制代碼publicclassUniformBlock<T>:UniformSingleVariableBasewhereT:struct,IEquatable<T>{protectedTvalue;publicTValue{get{returnthis.value;}set10if(!value.Equals(this.value))1112this.value=value;13this.Updated=true;1415161718publicUniformBlock(stringblockName):base(blockName){}192010if(!value.Equals(this.value))1112this.value=value;13this.Updated=true;1415161718publicUniformBlock(stringblockName):base(blockName){}1920publicUniformBlock(stringblockName,Tvalue):base(blockName){this.Value=value;}2122protectedoverridevoidDoSetUniform(ShaderProgramprogram)2324//...2526復(fù)制代碼UniformBlock<T>更新uniform塊的操作比較復(fù)雜:它要創(chuàng)建一個uniformbufferobject,并與之綁定;以后它只需更新這個buffer里的數(shù)據(jù),就可以實現(xiàn)對uniform塊的更新。DoSetUniformSetUniform()對于普通的uniform變量,CSharpGL用Renderer.SetUniform(stringvarName,Tvalue)whereT:struct即可(無論是什么類型的uniform都可以處理)。對于Uniform塊,也可以用這個方法!回到頂部(gototop)UniformBlockRenderer有了上述準備,我們就可以使用uniform塊了。創(chuàng)建渲染器按照CSharpGL的傳統(tǒng),下面來創(chuàng)建一個UniformBlockRenderer,負責(zé)加載shader、模型數(shù)據(jù)和渲染工作。復(fù)制代碼classUniformBlockRenderer:RendererpublicstaticUniformBlockRendererCreate()varmodel=newTeapot();//modelvarshaderCodes=newShaderCode[2];//shadersshaderCodes[0]=newShaderCode(File.ReadAllText(@"shaders\UniformBlock.vert"),ShaderType.VertexShader);shaderCodes[1]=newShaderCode(File.ReadAllText(@"shaders\UniformBlock.frag"),ShaderType.FragmentShader);varmap=newAttributeNameMap();//mappingrelationbetweenmodelandshadersmap.Add("vPos",Teapot.strPosition);map.Add("vColor",Teapot.strColor);varrenderer=newUniformBlockRenderer(model,shaderCodes,map);//rendererreturnrenderer;}}復(fù)制代碼設(shè)置uniform塊的值就像普通的uniform變量一樣,我們也在Renderer.DoRender()方法里更新uniform塊。復(fù)制代碼protectedoverridevoidDoRender(RenderEventArgsarg){mat4projection=arg.Camera.GetProjectionMatrix();mat4view=arg.Camera.GetViewMatrix();mat4model=this.GetModelMatrix();//設(shè)置uniform塊,只需這一行。this.SetUniform("Uniforms",newUniforms(projection,view,model));base.DoRender(arg);}復(fù)制代碼完成的效果如圖,能夠正常渲染,說明我們成功地更新了uniform塊里的數(shù)據(jù)?;氐巾敳?gototop)下載CSharpGL已在GitHub開源,歡迎對OpenGL有興趣的同學(xué)力口入(/bitzhuwei/CSharpGL)回到頂部(gototop)總結(jié)借助C#的struct與byte□的相互轉(zhuǎn)換,加上CSharpGL對ModernRendering的封裝,實際上我們不需要調(diào)用glGetUniformIndices、glGetActiveUniformsiv(用于獲取shader中uniform塊里的各個變量的偏移量)這些接口,就可以使用uniform塊了。當shader中寫了一個uniform塊時,你只需在應(yīng)用程序客戶端也寫一個對應(yīng)的struct,然后用Renderer.SetUniform(blockName,structObj);一行即可實現(xiàn)對uniform塊數(shù)據(jù)的更新。PS:測試過程中發(fā)現(xiàn)對于vec3結(jié)果正常,但是v
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023二年級數(shù)學(xué)上冊 六 測量第2課時 課桌有多長說課稿 北師大版
- 《1 負數(shù) 》(說課稿)-2023-2024學(xué)年六年級下冊數(shù)學(xué)人教版
- 2024秋四年級語文上冊 第六單元 第19課 一只窩囊的大老虎說課稿 新人教版001
- 代銷材料合同范例
- 路塹紫穗槐種植施工方案
- 5《守株待兔》說課稿-2024-2025學(xué)年語文三年級下冊統(tǒng)編版
- 慶城硅pu跑道施工方案
- 5《一個豆莢里的五粒豆》說課稿-2024-2025學(xué)年四年級上冊語文統(tǒng)編版
- 京東店鋪運營合同范例
- 住宅劃地出售合同范本
- 廣西南寧市2024-2025學(xué)年八年級上學(xué)期期末義務(wù)教育質(zhì)量檢測綜合道德與法治試卷(含答案)
- 梅大高速塌方災(zāi)害調(diào)查評估報告及安全警示學(xué)習(xí)教育
- 2025年供應(yīng)鏈管理培訓(xùn)課件
- 2025中智集團招聘高頻重點提升(共500題)附帶答案詳解
- 幼兒園2025年春季學(xué)期保教工作計劃
- 《保利公司簡介》課件
- 中藥硬膏熱貼敷治療
- 《攜程旅行營銷環(huán)境及營銷策略研究》10000字(論文)
- 2024年高頻脈沖電源項目可行性研究報告
- 餐飲行業(yè)優(yōu)化食品供應(yīng)鏈管理計劃
- cnc加工崗前培訓(xùn)
評論
0/150
提交評論