- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了一个 OpenGL 应用程序,它会在某些机器上崩溃(在我自己的测试机器上运行:Windows 8、Windows 7、Windows Vista (x86) - 但在某些装有 Windows Vista (x86) 的客户端机器上它会崩溃) - 我还不知 Prop 体原因,但我将应用程序降级为一个空框架,它只会执行 glClear()
。然后应用程序运行至少没有崩溃(可以创建 OpenGL 上下文,可以加载 glew),但屏幕不会以指定的 glClearColor
颜色清除。我怀疑我的 PIXELFORMATDESCRIPTOR
或 SwapBuffer
中的某些问题没有按预期工作。
我的代码(为简单起见,我省略了窗口创建和 main()
):
hdc = GetDC(hWnd);
int pf;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pf = ChoosePixelFormat(hdc, &pfd);
if (pf == 0) {
MessageBox(NULL, "ChoosePixelFormat() failed: "
"Cannot find a suitable pixel format.", "Error", MB_OK);
}
if (SetPixelFormat(hdc, pf, &pfd) == FALSE) {
MessageBox(NULL, "SetPixelFormat() failed: "
"Cannot set format specified.", "Error", MB_OK);
}
DescribePixelFormat(hdc, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
hglrc = wglCreateContext(hdc);
if(!wglMakeCurrent(hdc, hglrc)){
MessageBox(NULL, "wglMakeCurrent() failed: "
"Cannot make context current.", "Error", MB_OK);
}
GLenum err = glewInit();
if (GLEW_OK != err){
/* Problem: glewInit failed, something is seriously wrong. */
fprintf(stdout, "Error: %s\n", glewGetErrorString(err));
}
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
此代码输出:“状态:使用 GLEW 1.10.0”然后我的主循环:
while(true){
timeDuration = std::chrono::duration_cast<std::chrono::duration<double> >(std::chrono::high_resolution_clock::now() - lastTime);
lastTime = std::chrono::high_resolution_clock::now();
time += timeDuration.count();
glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SwapBuffers(hdc);
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
在我自己的机器上,我收到一个灰色屏幕(如预期的那样)——但在我的原始程序崩溃的机器上,屏幕只是黑色的(但没有出现任何消息框,输出也是:“状态:使用 GLEW 1.10.0”)。所以我看不到任何错误的证据 - 但输出不同并且 glClearColor()
似乎被忽略了。
关于如何进一步解决这个问题有什么想法吗?
最佳答案
好吧,我仍然不确定为什么它之前确实在我的机器上运行过,但问题是:
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
将其更改为:
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
它确实在任何地方运行。我没有在 PIXELFORMATDESCRIPTOR
中指定双缓冲,这似乎带来了奇怪的问题(出于某种原因在我的机器上工作 - 但在其他机器上没有)。
关于c++ - 某些机器上 OpenGL 中的黑屏(PIXELFORMATDESCRIPTOR/SwapBuffer?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24228500/
通常在设置 OpenGL 上下文时,我只需使用必要的信息填写 PIXELFORMATDESCRIPTOR 结构并调用 ChoosePixelFormat(),然后使用从 ChoosePixelForm
我编写了一个 OpenGL 应用程序,它会在某些机器上崩溃(在我自己的测试机器上运行:Windows 8、Windows 7、Windows Vista (x86) - 但在某些装有 Windows
我是一名优秀的程序员,十分优秀!