2014-01-27 120 views
53

任何人都可以用簡單的語言向我解釋紋理和表面之間的區別嗎?我看到它在SDL2中用作SDL_SurfaceSDL_TextureSDL_TextureSDL_Surface創建,而後者又是從圖像/位圖創建的。兩者都是像素的集合。但我沒有看到他們之間的主要區別(必須做什麼與GPU?)表面和紋理之間的區別(SDL /普通)

我試圖谷歌它,但我發現所有解釋太複雜,無法深入瞭解計算機圖形的東西瞭解他們。

+6

看看我的答案在這裏:http://stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/21007477#21007477它會解釋'SDL_Texture'和'SDL_Surface'以及' SDL_Renderer'。一般來說,'SDL_Texture'是用於渲染的東西,但是當你使用'SDL_Image'或'SDL_ttf'加載紋理信息時,你會得到'SDL_Surface'的數據。 – olevegard

+0

@olevegard這個答案几乎是一個複製粘貼,我真的很想知道一些答案。 – this

+3

就像你所假設的那樣,'SDL_Surface'只是一個像素集合,而'SDL_Texture'是'一個高效的,驅動程序特定的像素數據表示',這意味着它可以被GPU http://wiki.libsdl使用。組織/ SDL_Texture。這是否回答你的問題?你真的應該更深入地瞭解計算機圖形學,以瞭解更多 – olevegard

回答

7

SDL_Texture被加載到您的視頻卡的VRAM中,而不是常規RAM中。

56

基本上你的假設「必須用GPU做點什麼?」是對的。

SDL_Surface用於軟件的渲染。使用軟件渲染,正如saloomi2012正確注意到的,您正在使用常規RAM來存儲圖像數據。因此,在大多數情況下,您可以直接訪問與表面相關的數據緩衝區,修改其內容,即使用CPU,因此可以使用軟件的名稱。

,另一方面SDL_Texture,以硬件渲染中使用,紋理存儲在VRAM和你沒有訪問它直接與SDL_Surface。渲染操作由GPU加速,內部使用OpenGL或DirectX(僅在Windows上可用)API,後者又使用您的視頻硬件,因此使用硬件渲染名稱。

不用說,硬件渲染比軟件渲染快幾個數量級,應該始終被視爲主要選項。

+2

如果硬件加速可用,使用SDL_Surface有什麼優勢嗎?例如。對於小型渲染操作,去硬件的開銷太大了? – Timmos

+2

@Timmos硬件渲染總是比軟件更快。但是,軟件表面有一個優點:由於它存儲在CPU可訪問的主存儲器中,因此可以直接向其寫入數據。如果您想要實時生成紋理,例如視頻遊戲中程序化生成的內容,這會非常有用。 (但是,請注意,現在許多類型的程序生成也可以使用着色器在GPU上完成。) – cemper93

+0

@Timmos您完全可以控制曲面的工作方式,生成的完全讀寫控制,我的意思是真的。 ..control是一個表面給你的。因爲GPU製造商不允許直接訪問GPU,所以OpenGL和此類API需要與GPU一起工作,這就是爲什麼您經常會聽到人們抱怨OpenGL或DX效率低下或者只是愚蠢的事情,因爲他們會可以寫更快或更高效的東西,但他們不能,因爲他們無法訪問GPU。 –

2

表面使用你的RAM內存和紋理使用你的視頻卡比表面更快 。

0

有一個關於在信息

https://thenumbat.github.io/cpp-course/sdl2/05/05.html

正如在上次的教訓所提到的,紋理的GPU渲染 相當於表面。因此,紋理幾乎總是使用函數SDL_CreateTextureFromSurface()從 曲面創建。這個函數或多或少地符合你的期望 - 參數是 渲染上下文以及用於創建紋理的表面。與 其他創建函數一樣,它將在失敗時返回NULL。

我希望它能幫助你!

相關問題