簡體   English   中英

在無窗口的GLX程序中讀取OpenGL的默認幀緩沖區

[英]Reading OpenGL's default framebuffer in a windowless GLX program

我想在我的Debian機器上執行一些3D渲染並將結果帶到客戶端內存中。

我創建了一個不需要窗口的基於C ++,GLX和GLEW的應用程序。 我得到一個顯示glXOpenDisplay ,用它來找到合適的幀緩沖glXChooseFBConfig (經過DefaultScreen顯示的),獲得與視覺信息glXGetVisualFromFBConfig ,並傳遞相關信息給glXCreateContext 我將當前上下文設為當前狀態並初始化GLEW。

作為開始測試,我只是清除具有多種顏色的默認幀緩沖區; 我現在想逐個查詢結果,大概是使用glReadPixels

但這是我似乎從根本上誤解的地方:默認幀緩沖區的尺寸是多少? 我從來沒有為它定義初始高度或寬度,也沒有找到一種方法。

這樣的回答暗示着窗口“定義”了尺寸。 在我的應用程序中, DefaultScreen定義尺寸? 如果是這樣,我該怎么做才能使默認幀緩沖區大於特別小的屏幕?

並將相關信息傳遞給glXCreateContext。 然后,我初始化GLEW。

僅僅因為您具有上下文並不意味着可以立即使用它。 考慮如果您有多個上下文,會發生什么情況。 在進行OpenGL調用之前,必須使用glXMakeCurrentglXMakeContextCurrent在當前線程上激活上下文。 如果您查看這些功能的簽名,您會發現除了OpenGL上下文之外,它們還使用Drawable作為參數。 因此,您也需要它。

對於無窗口操作,GLX提供了PBuffers,這些緩沖區提供了無窗口可繪制對象。 或者,您可以使用不映射到屏幕的窗口。 PBuffer允許在不使用幀緩沖區對象的情況下進行屏幕外渲染,但是使用它們的主幀緩沖區有點挑剔。 我的建議是使用大小為0×0的PBuffer和一個framebuffer對象。

您需要使用幀緩沖對象。 這些使用您指定尺寸的紋理。 例如:

// Generate framebuffer ID
GLuint fb;
glGenFramebuffers(1, &fb);

// Make framebuffer active
glBindFramebuffer(GL_FRAMEBUFFER, fb);

// Attach color and depth textures (must have same dimensions)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_tex, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_tex, 0);

// Check framebuffer is valid
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM