我們有一個使用OpenGL的3D查看器,但是我們的客戶有時會抱怨它「不工作」。我們懷疑這些問題中的大部分來自於他們試圖在businiss筆記本電腦上使用現實的3D實時遊戲。如何編寫一個檢查openGL支持的安裝程序?
我們如何才能在我們使用Windows的MSI安裝程序,檢查是否支持OpenGL?
而作爲一個側面說明,如果你能回答「的OpenGL的支持列表圖形卡?」,這也將是馬麗娟。奇怪的是,谷歌犯規幫助這裏..
我們有一個使用OpenGL的3D查看器,但是我們的客戶有時會抱怨它「不工作」。我們懷疑這些問題中的大部分來自於他們試圖在businiss筆記本電腦上使用現實的3D實時遊戲。如何編寫一個檢查openGL支持的安裝程序?
我們如何才能在我們使用Windows的MSI安裝程序,檢查是否支持OpenGL?
而作爲一個側面說明,如果你能回答「的OpenGL的支持列表圖形卡?」,這也將是馬麗娟。奇怪的是,谷歌犯規幫助這裏..
取決於「不工作」的客戶意味着什麼。它可能是以下之一:
所有Windows版本(自95)都有OpenGL支持內置。所以這不太可能導致上面的情況1),除非你申請要求更高的OpenGL版本。
但是,默認OpenGL實現是OpenGL 1.1,其中軟件渲染。如果用戶沒有手動安裝具有OpenGL支持的驅動程序(從NVIDIA/AMD/Intel站點下載的任何驅動程序都將具有OpenGL),那麼它們將默認使用這種緩慢和舊的實現。這很可能導致上述情況3)和4)。
即使OpenGL可用,在Windows上OpenGL驅動程序也不是很健壯,可以說是溫和的。驅動程序中的各種錯誤很可能導致情況2),在那裏做有效的事情會導致驅動程序崩潰。
這裏是一個C++/WinAPI的代碼片段,創建了一個虛擬的OpenGL上下文並檢索信息(GL版本,圖形卡名稱,擴展等):
// setup minimal required GL
HWND wnd = CreateWindow(
"STATIC",
"GL",
WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, 16, 16,
NULL, NULL,
AfxGetInstanceHandle(), NULL);
HDC dc = GetDC(wnd);
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA, 32,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
16, 0,
0, PFD_MAIN_PLANE, 0, 0, 0, 0
};
int fmt = ChoosePixelFormat(dc, &pfd);
SetPixelFormat(dc, fmt, &pfd);
HGLRC rc = wglCreateContext(dc);
wglMakeCurrent(dc, rc);
// get information
const char* vendor = (const char*)glGetString(GL_VENDOR);
const char* renderer = (const char*)glGetString(GL_RENDERER);
const char* extensions = (const char*)glGetString(GL_EXTENSIONS);
const char* version = (const char*)glGetString(GL_VERSION);
// DO SOMETHING WITH THOSE STRINGS HERE!
// cleanup
wglDeleteContext(rc);
ReleaseDC(wnd, dc);
DestroyWindow(wnd);
你可以以某種方式插入代碼到您的安裝程序或應用程序並至少檢查GL版本是否爲1.1;這會檢測到「驅動程序未安裝」的情況。要解決實際的OpenGL驅動程序錯誤,那麼您必須弄清楚它們並解決它們。很多工作。
OpenGL是因爲Windows NT或Win95的Windows的一部分。您不可能找到未安裝OpenGL的Windows系統(例如Windows 3.1)
但是,您的應用程序可能需要更新版本的OpenGL,而不是OpenGL 1.1的舊版本的窗戶。你可以從你的程序中檢查。我不知道如何從msi中找到它。
注意,得到的OpenGL通過圖形驅動程序更新,而不是由安裝服務包左右。
關於支持OpenGL的圖形卡:都有OpenGL。即使客戶使用石器時代的ISA ET4000圖形卡,他至少也可以通過軟件渲染獲得OpenGL 1.1。
我覺得這是相當安全的假設,在過去10年中取得的每筆記本電腦提供了它,你可能會與依靠簡單的檢查硬件支持OpenGL的一個問題。 (雖然如果這些筆記本電腦真的是那麼老,那麼this wiki可能有幫助嗎?)
但是,如果只是你的程序是圖形密集型的,那麼我可能會推薦一個小型基準測試程序來檢查你的客戶系統是否正常運行首先從頭開始。您可以試試here,看看您是否可以使用某個現有的基準測試工具來幫助您,或者您可以嘗試爲您的程序編寫一個專門的軟件,例如一個小的測試腳本,而不是模擬在重負載下運行程序並記錄諸如FPS等信息。
對於前者,您甚至可能會發現將測試運行集成到MSI安裝程序中是可行的,但是我沒有任何這方面的經驗。
希望你找到這些有用的。
Windows支持OpenGL 1.1(正如其他人在此提到的)。所以,用戶面臨的問題是由於在1.1之後添加到OpenGL中的擴展。如果您使用的是GLEW庫,那麼通過編程來檢查對所有擴展的支持是非常容易的。以下是如何檢查的支持遮擋查詢:
if (GLEW_OK != glewInit())
{
// GLEW failed!
exit(1);
}
// Check if required extensions are supported
if (!GLEW_ARB_occlusion_query)
cout << "Occlusion query not supported" << endl;
更多關於使用GLEW,看到here。