我想確定幀緩衝區對象的大小(寬度,高度)。如何確定GL幀緩衝區對象的寬度和高度,只給出相應的ID
我創建通過
// create the FBO.
glGenFramebuffers(1, &fboId);
一個幀緩衝區對象如何獲得第一附色的只給出幀緩衝區對象ID(fboId
)的大小? 這是可能的嗎?或者我是否已經將顏色附件的大小存儲在外部變量中以便稍後瞭解FBO的大小?
我想確定幀緩衝區對象的大小(寬度,高度)。如何確定GL幀緩衝區對象的寬度和高度,只給出相應的ID
我創建通過
// create the FBO.
glGenFramebuffers(1, &fboId);
一個幀緩衝區對象如何獲得第一附色的只給出幀緩衝區對象ID(fboId
)的大小? 這是可能的嗎?或者我是否已經將顏色附件的大小存儲在外部變量中以便稍後瞭解FBO的大小?
你的問題有點困惑,因爲你問兩個不同的東西。
這裏的問題很簡單:
如何,我可以得到只給出幀緩衝區對象ID(fboId)第一附色的大小?
這很簡單:讓連接到該附件的紋理/渲染,得到了什麼見大貼圖水平和陣列層連接,然後查詢它有多大的紋理/渲染。
對於GL_COLOR_ATTACHMENT0
,前兩步完成with glGetFramebufferAttachmentParameter
(注意關鍵詞「附件」)。您查詢GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
以獲取它是渲染緩衝區還是紋理。您可以使用GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
獲取渲染緩衝區/紋理名稱。
如果對象是渲染緩衝區,則可以綁定渲染緩衝區並使用glGetRenderbufferParameter
來獲取渲染緩衝區的GL_RENDERBUFFER_WIDTH
和GL_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_WIDTH
和GL_TEXTURE_HEIGHT
。現在
,這就是容易問題。難題是你的標題要求:
我想確定一個framebuffer對象的大小(寬度,高度)。
一個FBO的渲染區域的大小是不一樣作爲GL_COLOR_ATTACHMENT0
大小。 FBO的可渲染區域是連接到FBO的所有圖像的所有大小的交集。
除非你對這個FBO有特殊的知識,否則你不能假設FBO只包含一個圖像或者所有的圖像都具有相同的大小(如果你對FBO有特殊的知識,那麼坦率地說你應也有特殊的知識,它有多大)。因此,您需要重複上述步驟每個附件(如果類型爲GL_NONE
,則不會附加任何內容)。然後取返回值的交集(即:最小的寬度和高度)。
一般來說,你不應該問一個FBO你創造了多大。正如你不必質疑它們有多大。你做了他們;根據定義,你知道他們有多大。你把他們放在FBO裏,所以你又知道它有多大。
感謝您的答案(順便說一句,每當我問一個OpenGL的問題,我發現你的答案之一:我不知道你花了多少時間,但你肯定應該得到每個單一的rep點:)) – Rick77 2015-10-11 14:35:04
我如何知道將幀緩衝區的附加紋理綁定到哪個目標? (例如GL_TEXTURE_2D?GL_TEXTURE_CUBE_MAP?等) OBJECT_TYPE只返回「GL_TEXTURE」,我看不到任何方式來查詢實際的紋理目標。 – namey 2015-12-11 14:49:18
@namey:只要將它綁定爲每個可能的紋理目標; *不會導致錯誤的是正確的。你可能會認爲我很諷刺,但我其實是非常認真的。如果你擁有的是紋理對象,這是*唯一的方法*來知道紋理的類型。另外,使用ARB_direct_state_access,你將不必在意。 – 2015-12-11 15:07:05
僅供參考:爲了更好的服務,使用OpenGL標籤來解決OpenGL問題,甚至是更高版本。大多數OpenGL專家都在關注OpenGL標記,而不是OpenGL-3標記。 – 2013-03-03 13:36:37