閱讀113 返回首頁    go 阿裏雲 go 技術社區[雲棲]


強大的GPU片段編程:

強大的GPU片段編程:
在CG程序中,頂點程序的輸入一定要有一個POSITION,也一定要輸出一個POSITION ,輸入的POSITION 為頂點在模型空間的位置,輸出為最終的CLIP空間的位置,而在片段程序中,輸入隻能是COLOR和TEXCOODx, 輸出隻能為COLOR,因為這是GPU渲染的最後一步,你隻能改變每個片段的顏色。但是如果我想根據 片段的位置來改變他的顏色怎麼辦呢,輸入中沒有POSITION,但是這個TEXCOORD卻是一個神通廣大的量, 它可以代表任何從頂點程序中傳回的向量。我們可以在頂點程序中定義一個TEXCOORD0予以的向量,然後把 頂點的POSITION傳給他,那麼在片段程序中就可以接受到這位置信息,這就可以實現很多的功能 下麵是一個應用片段程序做的DEMO,它根據三角形的每個像素點的位置加上正弦波濾波得到該點的顏色, 這個效果在純OPENGL中是很難得到的,因為OPENGL是基於頂點插值渲染的,二這個DEMO不是插值是直接賦予 像素點顏色,而且它運行速度極快,因為在GPU中SIN這種函數隻是一個指令,就跟假發操作一樣高效;
注意我們實現的效果的關鍵的片段程序隻有一行代碼!
CG源程序;
頂點程序: struct C2E1v_Output { float4 position : POSITION; float4 fragposition :TEXCOORD0; }; C2E1v_Output C2E1v_green(float2 position : POSITION) { C2E1v_Output OUT; OUT.position = float4(position,0,1); OUT.fragposition=float4(position,0,1); return OUT; }
片段程序: void test( float4 position : TEXCOORD0, out float3 color:COLOR) { color=float3(sin(position.x*10),sin(position.y*10),sin(position.z*10)); }

 

最後更新:2017-04-02 04:00:23

  上一篇:go OGRE編程筆記
  下一篇:go 多核時代:並行程序設計探討(7)——並行編程模式概覽