我打算在Linux紅帽子上使用GLFW打開一個OpenGL全屏窗口。我有一個桌面,跨越兩臺顯示器,總分辨率爲3840 * 1080。打開全屏OpenGL窗口
我有兩個問題: 1.窗口只在一個顯示器上打開,最大窗口寬度爲1920(單個顯示器的寬度)。 2.窗口的最大高度是1003(我認爲這是屏幕的高度減去任務欄和頂欄的高度)。
這是我用來打開該窗口中的代碼:
if (glfwInit() == GL_FALSE)
std::cout<< "Unable to initialize GLFW\n";
glfwOpenWindowHint(GLFW_STEREO, GL_FALSE);
if (glfwOpenWindow(3840,1080,8,8,8,0,24,0,GLFW_FULLSCREEN) == GL_FALSE)
std::cout<< "Unable to open window\n";
int width, height;
glfwGetWindowSize(&width, &height);
std::cout << "width = " << width << " height = " << height << "\n";
輸出:寬度= 1920高度= 1003
編輯: 我用xrandr檢查可用屏幕模式,並得到:
屏幕0:最小3840 x 1080,最大3840 x 1080,最大3840 x 1080 默認連接3840x1080 + 0 + 0 0mm x 0mm 3840x1080 50.0 *
EDIT2: 我已經改變了我的代碼使用X11
int doubleBufferAttributes[] = {
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
GLX_RENDER_TYPE, GLX_RGBA_BIT,
GLX_DOUBLEBUFFER, True, /* Request a double-buffered color buffer with */
GLX_RED_SIZE, 1, /* the maximum number of bits per component */
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
None
};
static Bool WaitForNotify(Display *dpy, XEvent *event, XPointer arg) {
return (event->type == MapNotify) && (event->xmap.window == (Window) arg);
}
int main(int argc, char *argv[])
{
Display *dpy;
Window xWin;
XEvent event;
XVisualInfo *vInfo;
XSetWindowAttributes swa;
GLXFBConfig *fbConfigs;
GLXContext context;
GLXWindow glxWin;
int swaMask;
int numReturned;
int swapFlag = True;
/* Open a connection to the X server */
dpy = XOpenDisplay(NULL);
if (dpy == NULL) {
printf("Unable to open a connection to the X server\n");
exit(EXIT_FAILURE);
}
/* Request a suitable framebuffer configuration - try for a double
** buffered configuration first */
fbConfigs = glXChooseFBConfig(dpy, DefaultScreen(dpy),
doubleBufferAttributes, &numReturned);
/* Create an X colormap and window with a visual matching the first
** returned framebuffer config */
vInfo = glXGetVisualFromFBConfig(dpy, fbConfigs[0]);
swa.border_pixel = 0;
swa.event_mask = StructureNotifyMask;
swa.colormap = XCreateColormap(dpy, RootWindow(dpy, vInfo->screen),
vInfo->visual, AllocNone);
swaMask = CWBorderPixel | CWColormap | CWEventMask;
xWin = XCreateWindow(dpy, RootWindow(dpy, vInfo->screen), 0, 0, 3840, 1080,
0, vInfo->depth, InputOutput, vInfo->visual,
swaMask, &swa);
XWindowAttributes attt;
XGetWindowAttributes(dpy,xWin, &attt);
std::cout << "he = " << attt.height << " wi = " << attt.width << "\n";
/* Create a GLX context for OpenGL rendering */
context = glXCreateNewContext(dpy, fbConfigs[0], GLX_RGBA_TYPE,
NULL, True);
XGetWindowAttributes(dpy,xWin, &attt);
std::cout << "2he = " << attt.height << " wi = " << attt.width << "\n";
/* Create a GLX window to associate the frame buffer configuration
** with the created X window */
glxWin = glXCreateWindow(dpy, fbConfigs[0], xWin, NULL);
XGetWindowAttributes(dpy,xWin, &attt);
std::cout << "3he = " << attt.height << " wi = " << attt.width << "\n";
/* Map the window to the screen, and wait for it to appear */
XMapWindow(dpy, xWin);
XGetWindowAttributes(dpy,xWin, &attt);
std::cout << "4he = " << attt.height << " wi = " << attt.width << "\n";
XIfEvent(dpy, &event, WaitForNotify, (XPointer) xWin);
XGetWindowAttributes(dpy,xWin, &attt);
std::cout << "5he = " << attt.height << " wi = " << attt.width << "\n";
/* Bind the GLX context to the Window */
glXMakeContextCurrent(dpy, glxWin, glxWin, context);
XGetWindowAttributes(dpy,xWin, &attt);
std::cout << "6he = " << attt.height << " wi = " << attt.width << "\n";
輸出是打開的窗口:
he = 1080 wi = 3840
2he = 1080 wi = 3840
3he = 1080 wi = 3840
4he = 1080 wi = 3840
5he = 1003 wi = 1920
6he = 1003 wi = 1920
看來,當窗口得到顯示它的尺寸縮小。
您是否嘗試過列舉可用的視頻模式並檢查可用內容? –
我用GLFW打開窗口,所以沒有。我使用'xrandr'查詢視頻模式: 屏幕0:最小3840 x 1080,當前3840 x 1080,最大3840 x 1080. 我目前正在更改代碼以直接使用X打開窗口。您能指出我到枚舉可用視頻模式的功能? 默認連接3840x1080 + 0 + 0 0mm x 0mm 3840x1080 50.0 * –
@NicolBolas請參閱最新編輯的問題。 –