渲染的時候是不是頂點數目越少越好?

OpenGL渲染的時候是不是能做到頂點數越少越好,頂點數多就意味著渲染速度會變慢?


不是。

這取決於瓶頸在不在頂點。比如說,只要三個頂點就可以覆蓋全屏。如果那時候運行非常複雜的pixel shader,照樣可以讓幀速率低到不行。

有的時候,甚至需要增加頂點,並把pixel shader里的一些計算挪到vertex shader,來加速計算。


不一定,但是在這一代主機平台(GCN架構顯卡)上vertex shader的GPU佔有率確實非常低。正常的compute shader或者pixel shader在vgpr不爆表的情況下可以在所有wavefront(越多表示並行程度越高,最多10個還是11個忘記了)上運行,但vertex shader一般只能用到2-3個wavefront(也就是說GPU的shader engine有一大半空在那),vgpr用的再少也不行,因為受制於頂點處理部分建立三角形和rasterize的開銷(PA,VGT,SC等等組建都是有開銷的)。也就是說vertex shader的並行程度不高。

如果支持async compute可以把一部分compute shader和vertex shader並行,這樣可以彌補佔有率低的問題。

另外geometry shader問題更大,不要有為了減少頂點用geometry shader的想法,這貨坑得令人髮指。


剛剛做完一個手機遊戲,某些場景模型,我們用增加mesh頂點來增加幾何細節,再加上一些fragment shader上的trick,省去了90%的貼圖,達到幾乎一樣的效果和fps,包體縮小到原來的1/10

具體來說,就是vertex頂點可以存顏色值,對於建築物、車輛、道路等texture不複雜的模型可以通過只vertex頂點顏色+detail map 實現,vertex 頂點甚至可以通過調整明暗變化實現GI的效果,這樣可以省一張大UV貼圖,還可以省一張light map


oz回答了 我也來湊湊熱鬧

但凡效率、性能都需要一個對比。

現在的移動硬體設備來說,對於面數的要求自然還是比較苛刻的,但在十幾萬面的情況下,只要其他方面的性能過得去,面數不是制衡這些的問題。

這個所謂的越低越好。看你怎麼比較。100個頂點,跟150頂點(甚至更大),可以認為沒有區別,除非你非要在vf裡面耍雜技,只有數量級或者大幅度的變化才會有一些區別。這裡指的是同樣的shader做的渲染。如果vf不同,處理的效率自然也不同了。


我來解釋下「頂點越多性能越低,性能優化就是減少頂點數」這種論點是怎麼流行起來的吧。

性能的優劣取決於做同樣的事達到同樣的效果,使用的方法是否更簡單更快速。

現在國內最流行的3D引擎是unity,而unity為了照顧移動平台相對於PC和主機平台羸弱的gpu性能,大量使用了頂點光照(相對的是」像素光照「)和頂點著色(相對的是」像素著色「)(尤其是老版本中),這種情況下,像素著色器只需要娶個插值結果返回即可,基本沒有計算量,所以性能優化的核心就在於控制頂點數。

在口口相傳中,大前提被省略了,所以只留下了結論。

類似的還有「TCP會粘包「等等,大佬們都超忙的,看書學習哪兒有刷不經驗證的博客來的迅速快捷。


不是,除了調用批次,三角形數量主要影響在並行度,一個特大三角形很可能在驅動里會為了並行度切成很多小三角


http://m.blog.csdn.net/i_dovelemon/article/details/51705167 我翻譯的nvidia的一篇文章,講到了你這個問題,可以看看了解一下


1. 頂點數越少模型質量越差,所以肯定不是越少越好。

2. 在其他條件不變的前提下單純減少頂點數在理論上是可以提高性能,但是實際上頂點數很少是渲染瓶頸,所以基本上很難獲得明顯的性能提升。


理論上是這樣的。

但是我在家用電腦上渲染十萬面的物體也沒有遇見瓶頸。在現在顯存甚至比內存大的情況下單純的把頂點傳入shader中渲染不會有太大的問題。如果為了性能而降低頂點數甚至讓模型精度變低那就本末倒置,為了優化而優化了。


你如果做的是輕 Shader 的產品,例如CAD有關的,一般 Draw 次數和頂點數是最影響渲染速度的,所以可以講頂點數越少渲染越快。至於在你的產品上,頂點數是否是渲染速度這木桶中最短的一塊,那就要好好分析了,不一定的。


推薦閱讀:

WebGL 和 OpenGL ES 有什麼區別?
WebGL 是否需要以 OpenGL 為學習基礎?
OpenGL ES 和 Unity3D 是什麼關係?
openGL與界面兼容?
為什麼ShaderToy選擇了GLSL?

TAG:OpenGL | OpenGLES | 渲染 |