2011-10-27 91 views
3

我是新來的opengl編程,但我正在做一些非常基本的東西,自定義opengl代碼和cocos2d之間的質量差異是巨大的!iOs:與OpenGL混淆但不與Cocos2D混淆?

我想只是加載圖像,並不斷旋轉它的每一幀。使用我的代碼,我得到了許多閃爍的尖銳邊緣,而cocos2d的效果非常好,很流暢。 我已經設置了4倍多采樣反鋸齒,使用我的代碼上的iOs 4的蘋果推薦代碼,並且與沒有任何MSAA的cocos2d相比,它仍然看起來非常糟糕。

您可以在這裏看到的差異: 自定義OpenGL代碼(與MSAA): custom opengl code

cocos2D上(沒有MSAA): cocos2d

有誰知道我缺少什麼才能夠實現這種流暢的圖形?通過查看cocos2d代碼,我發現了一些將別名鏈接到GL_LINEAR的引用。我已經將GL_LINEAR參數添加到我的紋理中,就像cocos一樣,但它看起來仍然很糟糕。

+0

出於興趣,你是否因爲好奇而學習OpenGL,或者有什麼你想做的事情,Cocos2D不能做? –

+0

@Danyal,我也在學習OpenGL,但我想不惜一切代價避免使用cocos2d和objective c,因爲1)可移植性問題(避免使用目標c,因此我可以將代碼移植到android甚至webgl中)以及2)目標c會強加給我的語言障礙。我理解它的基本概念,但我真的不喜歡它的工作方式。 – Waneck

+1

謝謝@Waneck,你可能會說我在想我是否應該學習它!順便說一下你看過Cocos2d-x嗎?它是帶有Android端口的Cocos2d的C++版本。但我想這不會沒有它特定於平臺的錯誤。 –

回答

3

反走樣功能正如名稱所說的那樣:它可以防止原語假定別名,例如直線(對角線)變成樓梯。由於抗鋸齒通常會導致「軟」邊緣,因此該術語有時用於適用於任何算法的「軟化」,但這樣做不正確。

假設你的源紋理已經包含一些反鋸齒渲染你的汽車的曲面邊緣到一個像素網格(所以,如果你打開源PNG或任何藝術計劃和放大邊緣你會看到一些柔和),我認爲你的代碼無論出於何種原因都未能應用多重採樣。如果放大並觀察屋頂的頂部邊緣,則檢查右邊第一步的頂部和左邊的第一步之間的過渡。頂部的粗糙黑色只是自發地增加了一個像素。這是邊緣在原始紋理中的症狀,並且它被逐個像素地複製出來。

GL_LINEAR是影響如何OpenGL的回答這樣的問題的濾波參數「如果在源像素(0,0)是在一種顏色和(0,1)是另一種則是在(0,0.5)什麼顏色? 「如果應用線性濾波,那麼當您將紋理縮放到原始大小以上時,將使用最近源像素的線性組合創建OpenGL必須發明的額外像素。如果您使用的是GL_NEAREST,那麼它將是最接近的任何源像素的顏色。所以這就是紋理之間的區別,可以放大看起來模糊和低對比度,紋理可以放大看起來像鑲嵌有明顯像素的紋理。所以它(通常)爲整體圖像增加了模糊性和柔和性,但與抗鋸齒功能無關。

關於爲什麼你沒有得到反鋸齒,兩個可能的原因衝刺到腦海。您的代碼中可能存在一些錯誤,或者您可能只是使用了與Cocos2D不同的算法。蘋果公司的硬件多采樣支持僅在iOS 4中推出,並且Cocos2D可能會堅持一種'軟件'方法(具體來說,將整個場景按像素逐像素渲染爲4倍大小,然後讓GPU縮小)。後者會明顯較慢,但會阻止硬件嘗試優化該過程。有些硬件有時適用的一種優化方法是僅在幾何(幾乎)邊緣進行多重採樣。這顯然不會使你受益。

另一種可能性是,當您繪製時縮放圖像(雖然看起來不像),而Cocos2D生成的是mip貼圖,而您不是。當繪圖到屏幕時,Mip地圖會預先計算一定比例的圖像並從那裏開始工作。這樣做會允許應用更昂貴的算法,並趨於減少混疊。

你能發表一些代碼嗎?

+0

你好湯米!非常感謝您的詳細回覆。我非常感謝,並且今天晚些時候我會在下班時再添加代碼。現在我可以說紋理的大小與它們在屏幕上的大小相同,所以我不認爲它是一個mip映射問題。就軟件模式而言,它可能確實是這樣,儘管我沒有在cocos2d源代碼中找到它的任何引用。當我回家時,我會發布代碼!非常感謝你! – Waneck

+0

湯米,這似乎是GL_LINEAR的問題!我後來用GL_NEAREST重新綁定了紋理!哦,哇!它有很大的不同!非常感謝你! – Waneck