2013-02-28 57 views
4

我想確定幀緩衝區對象的大小(寬度,高度)。如何確定GL幀緩衝區對象的寬度和高度,只給出相應的ID

我創建通過

// create the FBO. 
glGenFramebuffers(1, &fboId); 

一個幀緩衝區對象如何獲得第一附色的只給出幀緩衝區對象ID(fboId)的大小? 這是可能的嗎?或者我是否已經將顏色附件的大小存儲在外部變量中以便稍後瞭解FBO的大小?

+1

僅供參考:爲了更好的服務,使用OpenGL標籤來解決OpenGL問題,甚至是更高版本。大多數OpenGL專家都在關注OpenGL標記,而不是OpenGL-3標記。 – 2013-03-03 13:36:37

回答

17

你的問題有點困惑,因爲你問兩個不同的東西。

這裏的問題很簡單:

如何,我可以得到只給出幀緩衝區對象ID(fboId)第一附色的大小?

這很簡單:讓連接到該附件的紋理/渲染,得到了什麼見大貼圖水平和陣列層連接,然後查詢它有多大的紋理/渲染。

對於GL_COLOR_ATTACHMENT0,前兩步完成with glGetFramebufferAttachmentParameter(注意關鍵詞「附件」)。您查詢GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE以獲取它是渲染緩衝區還是紋理。您可以使用GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME獲取渲染緩衝區/紋理名稱。

如果對象是渲染緩衝區,則可以綁定渲染緩衝區並使用glGetRenderbufferParameter來獲取渲染緩衝區的GL_RENDERBUFFER_WIDTHGL_RENDERBUFFER_HEIGHT

如果對象是紋理,則需要做更多工作。您需要查詢附件參數GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL以獲取mipmap級別。

當然,現在你需要知道如何綁定它。如果您在4.4之前使用OpenGL版本或者沒有特定的擴展名,那麼這很複雜。看,你需要知道使用哪個texture target type。愚蠢和令人討厭,因爲這看起來,從紋理對象名稱來確定目標的唯一方法是......嘗試一切。瀏覽每個目標並檢查glGetError。其中GL_INVALID_OPERATION不是返回的是正確的。

如果你有GL 4.4或ARB_multi_bind提供,你只use glBindTextures可以(注意「S」),它不需要您指定的目標。如果你有4.5或者ARB_direct_state_access,你根本不需要綁定紋理。 DSA樣式函數不需要紋理目標,它還提供glBindTextureUnit,它將紋理綁定到其自然內部目標。

一旦你有紋理的約束和它的紋理貼圖的水平,你use glGetTexLevelParameter來查詢該級別的GL_TEXTURE_WIDTHGL_TEXTURE_HEIGHT。現在

,這就是容易問題。難題是你的標題要求:

我想確定一個framebuffer對象的大小(寬度,高度)。

一個FBO的渲染區域的大小是不一樣作爲GL_COLOR_ATTACHMENT0大小。 FBO的可渲染區域是連接到FBO的所有圖像的所有大小的交集。

除非你對這個FBO有特殊的知識,否則你不能假設FBO只包含一個圖像或者所有的圖像都具有相同的大小(如果你對FBO有特殊的知識,那麼坦率地說你應有特殊的知識,它有多大)。因此,您需要重複上述步驟每個附件(如果類型爲GL_NONE,則不會附加任何內容)。然後取返回值的交集(即:最小的寬度和高度)。

一般來說,你不應該問一個FBO你創造了多大。正如你不必質疑它們有多大。你做了他們;根據定義,你知道他們有多大。你把他們放在FBO裏,所以你又知道它有多大。

+2

感謝您的答案(順便說一句,每當我問一個OpenGL的問題,我發現你的答案之一:我不知道你花了多少時間,但你肯定應該得到每個單一的rep點:)) – Rick77 2015-10-11 14:35:04

+1

我如何知道將幀緩衝區的附加紋理綁定到哪個目標? (例如GL_TEXTURE_2D?GL_TEXTURE_CUBE_MAP?等) OBJECT_TYPE只返回「GL_TEXTURE」,我看不到任何方式來查詢實際的紋理目標。 – namey 2015-12-11 14:49:18

+1

@namey:只要將它綁定爲每個可能的紋理目標; *不會導致錯誤的是正確的。你可能會認爲我很諷刺,但我其實是非常認真的。如果你擁有的是紋理對象,這是*唯一的方法*來知道紋理的類型。另外,使用ARB_direct_state_access,你將不必在意。 – 2015-12-11 15:07:05

相關問題