2015-12-08 39 views
-1

這是可能是所有libgdx應用具有的代碼:GL_COLOR_BUFFER_BIT重新生成哪個內存?

Gdx.gl.glClearColor(1, 0, 0, 1); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

Gdx.gl.glClear(GL20.GL_DEPTH_BUFFER_BIT); 

此設置與女巫顏色的屏幕將被刷新(第一行)和比沖洗它(第二線)。但是GL20.GL_COLOR_BUFFER_BIT的含義是什麼?從我得到的文檔中得知,GL是一個包裝OpenGL ES 2.0所有方法的接口,它在那裏,所以我可以調用方法。 GL_COLOR_BUFFER_BIT的含義令我感到困惑。它應該重新生成當前啓用彩色寫入的內存......這是否意味着它會擦除所有圖像?它會擦除ShapeRenderer對象嗎?屏幕上的任何內容不是顏色寫入的一部分,並且在使用此常量時不會被擦除? GL_DEPTH_BUFFER_BIT會擦除紋理的Z位置嗎?

+0

傳遞'GL_COLOR_BUFFER_BIT'到'glClear'清除顏色緩衝區。通過'GL_DEPTH_BUFFER_BIT'清除深度緩衝區。還有一個「GL_STENCIL_BUFFER_BIT」 - 你猜對了 - 清除模板緩衝區。您也可以按位或將它們一起清除多個緩衝區。 –

回答

5

當你不直接繪製在屏幕上畫一些東西。相反,他們首先被吸引到一個所謂的「後臺緩衝區」。這是一塊內存(緩衝區),其中包含屏幕每個像素的四個字節,每個像素的每個顏色分量(紅色,綠色,藍色和阿爾法)都有一個字節。當你準備畫圖時(當你的渲染方法完成時),這個緩衝區會立即顯示在屏幕上。

緩衝液的現有值是重要的。例如,當您在屏幕上繪製圖像,然後在其上繪製半透明圖像時,結果就是兩個圖像的混合。第一個圖像被繪製到後臺緩衝區,導致後臺緩衝區的內存包含該圖像的像素數據。接下來,繪製第二個圖像並將其混合到後臺緩衝區的現有數據的頂部。

所述存儲器塊中的每一個字節總是有一個值,例如0表示黑色,255表示白色等。即使你沒有繪製任何東西到緩衝區,它也必須有一些值。調用glClear(GL20.GL_COLOR_BUFFER_BIT)指示GPU用一些指定值(顏色)填充整個後臺緩衝區。該值可以使用glClearColor的呼叫進行設置。請注意,您不必調用glClearColor每次glClear被調用時,驅動程序會記得以前的值。

除了背緩衝器用於在屏幕上(顏色緩衝器)的顏色值中,GPU可以具有其它類型的緩衝液,其中之一是深度緩衝液中。這也是每像素幾個字節的存儲塊,但是這次它包含每個像素的深度值。這使得它成爲可能,例如當3D渲染時,確保其他對象後面的對象不被繪製。需要使用GL20.GL_DEPTH_BUFFER_BIT來清除此緩衝區。

注意,您可以使用按位或操作它們的清除兩者一起:Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

在實踐中,調用glClear應該是你在你的渲染方法做(或例如綁定FBO時)的第一件事。這是因爲它告訴驅動程序您不關心緩衝區的現有值。這允許驅動程序進行優化,因爲它不必重新構建(複製)原始內存塊。

+0

你應該在大學任教。 – brumbrum