程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Windows下,通過程序設置全屏抗鋸齒(多重采樣)的方法,全屏鋸齒

Windows下,通過程序設置全屏抗鋸齒(多重采樣)的方法,全屏鋸齒

編輯:C++入門知識

Windows下,通過程序設置全屏抗鋸齒(多重采樣)的方法,全屏鋸齒


    這裡說的全屏抗鋸齒,不是基於著色器的FXAA之類的方式,而是兼容性更好的,基於固定管線的多重采樣方式。

    先來說一下開發環境,我用的是VC2013+GLEW1.11。

    要通過程序設置多重采樣,首先需要進入控制面板,確定抗鋸齒的設置是“根據應用程序而定” ,當然,這個設置的具體名稱,不同的顯卡廠商有不同的叫法。

    接下來,就是重點了。

    Windows下要通過程序設置多重采樣,必須使用wglChoosePixelFormatARB這個函數。目前網上基本都是自己去獲取這個函數的接口地址,其實根本不用這麼麻煩。GLEW已經有這個函數接口了,我們要做的,就是正確地使用而已。正確使用這個函數的關鍵,就是需要創建一個臨時窗體,通過這個窗體,我們可以初始化GLEW,以及獲取必須的基礎像素格式,然後再使用wglChoosePixelFormatARB這個函數,得到可用的多重采樣像素格式,最後,對渲染窗口設置這個像素格式即可。

    //----------創建一個臨時窗體
    HWND secondwnd; WNDCLASS wc; //窗體類結構體 wc.style = CS_HREDRAW | CS_VREDRAW; //窗體風格 wc.lpfnWndProc = WndProc; //窗體處理函數 wc.cbClsExtra = 0; //窗體類是否由擴展 wc.cbWndExtra = 0; //窗體實例是否由擴展 wc.hInstance = NULL; //窗體句柄 wc.hIcon = LoadIcon(0, IDI_APPLICATION); //窗體圖標 wc.hCursor = LoadCursor(NULL, IDC_ARROW); //窗體鼠標樣式 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗體背景顏色 wc.lpszMenuName = NULL; //窗體菜單 wc.lpszClassName = L"BaseWndClass"; //窗體類名 if (!RegisterClass(&wc)) //判斷窗體是否注冊成功 { MessageBox(L"注冊失敗"); return; } //創建窗體 secondwnd = CreateWindow(L"BaseWndClass", //窗體類名 L"MyFrom", //窗體標題名 WS_OVERLAPPEDWINDOW, //窗體風格 CW_USEDEFAULT, CW_USEDEFAULT, //窗體坐標 CW_USEDEFAULT, CW_USEDEFAULT, //窗體坐標 NULL, //窗體的父窗體 NULL, //窗體的子菜單 NULL, //窗體句柄 NULL); // 如果函數成功,返回值為新窗口的句柄:如果函數失敗,返回值為NULL if (secondwnd == 0)//判斷創建窗體是否成功 { MessageBox(L"創建窗體失敗"); return; } ::ShowWindow(secondwnd, SW_HIDE); //顯示窗體 ::UpdateWindow(secondwnd); //繪制窗體; PIXELFORMATDESCRIPTOR pfd = //定義像素格式 { sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小 1, // 版本號 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, // 申請 RGBA 格式 32, 0, 0, 0, 0, 0, 0, // 忽略的色彩位 8, // 無Alpha緩存 0, // 忽略Shift Bit 0, // 無累加緩存 0, 0, 0, 0, // 忽略聚集位 32, // 32位 Z-緩存 (深度緩存) 8, // 無蒙板緩存 0, // 無輔助緩存 PFD_MAIN_PLANE, // 主繪圖層 0, // Reserved 0, 0, 0 // 忽略層遮罩 };     //----------用這個臨時窗體得到一個可用HGLRC HDC secondDC = ::GetDC(secondwnd); int nIndex = ChoosePixelFormat(secondDC, &pfd); //選擇剛剛定義的像素格式 if (nIndex == 0) { return; } SetPixelFormat(secondDC, nIndex, &pfd); //設置像素格式 glRC = wglCreateContext(secondDC); wglMakeCurrent(secondDC, glRC);   //----------然後初始化GLEW GLenum glerr = glewInit(); if (glerr != GLEW_OK) { MessageBox(L"無法初始化GLEW!"); } else { OutputDebugString(L"成功加載GLEW\n"); } UINT Multisample = 4; //4倍多重采樣率 int pixelformat; UINT numformat; float fAttributes[] = { 0, 0 }; int iAtributes[] = { WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, WGL_SUPPORT_OPENGL_ARB, GL_TRUE, WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, WGL_COLOR_BITS_ARB, 24, WGL_ALPHA_BITS_ARB, 8, WGL_DEPTH_BITS_ARB, 32, WGL_STENCIL_BITS_ARB, 8, WGL_DOUBLE_BUFFER_ARB, GL_TRUE, WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, WGL_SAMPLES_ARB, Multisample, 0, 0 };     //----------取得可用的多重采樣像素格式 if (!wglChoosePixelFormatARB(secondDC, iAtributes, fAttributes, 1, &pixelformat, &numformat)) { MessageBox(L"找不到可用的抗鋸齒格式"); }   //----------刪除由臨時窗體得到的HGLRC,同時銷毀臨時窗體 wglMakeCurrent(NULL, NULL); wglDeleteContext(glRC); ::ReleaseDC(secondwnd, secondDC); ::DestroyWindow(secondwnd);     //----------用得到的多重采樣像素格式,設置渲染窗體 SetPixelFormat(this->GetDC()->m_hDC, pixelformat, &pfd); //設置像素格式 glRC = wglCreateContext(this->GetDC()->m_hDC); wglMakeCurrent(this->GetDC()->m_hDC, glRC);

上面這段代碼,就是按照我所說的方式初始化了OpenGL。

這樣設置後,你就能通過glEnable/glDisable啟用或禁用多重采樣了。

 

希望這點經驗能夠對和我一樣曾困於此問題的朋友有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved