C++ Opengl圖形顏色功能附源碼下載
項目開發(fā)環(huán)境:
開發(fā)語言:C++和IDE:VS2017,操作系統(tǒng)Windows版本windows SDK8.1,三方庫:OpenGL。
項目功能:
創(chuàng)建一個有顏色的圖形。
項目源碼如下:
/*********************包含鏈接的庫文件*******************************************************************************************/
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glut32.lib")
#pragma comment( lib, "glew32.lib")
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "vfw32.lib" )
/********************************************************************************************************************************/
#include <windows.h> // Windows的頭文件
#include "glew.h" // 包含最新的gl.h,glu.h庫
#include "glut.h" // 包含OpenGL實用庫
HDC hDC=NULL; // 窗口著色描述表句柄
HGLRC hRC=NULL; // OpenGL渲染描述表句柄
HWND hWnd=NULL; // 保存我們的窗口句柄
HINSTANCE hInstance; // 保存程序的實例
bool keys[256]; // 保存鍵盤按鍵的數(shù)組
bool active=TRUE; // 窗口的活動標志,缺省為TRUE
bool fullscreen=TRUE; // 全屏標志缺省,缺省設定成全屏模式
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定義
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 將Height設為1
}
glViewport(0,0,width,height); // 重置當前的視口
glMatrixMode(GL_PROJECTION); // 選擇投影矩陣
glLoadIdentity(); // 重置投影矩陣
// 設置視口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 選擇模型觀察矩陣
glLoadIdentity(); // 重置模型觀察矩陣
}
int InitGL(GLvoid) // 此處開始對OpenGL進行所有設置
{
glShadeModel(GL_SMOOTH); // 啟用陰影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glClearDepth(1.0f); // 設置深度緩存
glEnable(GL_DEPTH_TEST); // 啟用深度測試
glDepthFunc(GL_LEQUAL); // 所作深度測試的類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告訴系統(tǒng)對透視進行修正
return TRUE; // 初始化 OK
}
int DrawGLScene(GLvoid) // 從這里開始進行所有的繪制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 單位,并移入屏幕 6.0
glBegin(GL_TRIANGLES); // 繪制三角形
/***********************************新添的代碼*****************************************************/
glColor3f(1.0f,0.0f,0.0f); // 設置當前色為紅色
/**************************************************************************************************/
glVertex3f( 0.0f, 1.0f, 0.0f); // 上頂點
/***********************************新添的代碼*****************************************************/
glColor3f(0.0f,1.0f,0.0f); // 設置當前色為綠色
/**************************************************************************************************/
glVertex3f(-1.0f,-1.0f, 0.0f); // 左下
/***********************************新添的代碼*****************************************************/
glColor3f(0.0f,0.0f,1.0f); // 設置當前色為藍色
/**************************************************************************************************/
glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 三角形繪制結束
glTranslatef(3.0f,0.0f,0.0f); // 右移3單位
/***********************************新添的代碼*****************************************************/
glColor3f(0.5f,0.5f,1.0f); // 一次性將當前色設置為藍色
/**************************************************************************************************/
glBegin(GL_QUADS); // 繪制正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 正方形繪制結束
return TRUE; // 一切 OK
}
GLvoid KillGLWindow(GLvoid) // 正常銷毀窗口
{
if (fullscreen) // 我們處于全屏模式嗎?
{
ChangeDisplaySettings(NULL,0); // 是的話,切換回桌面
ShowCursor(TRUE); // 顯示鼠標指針
}
if (hRC) //我們擁有OpenGL描述表嗎?
{
if (!wglMakeCurrent(NULL,NULL)) // 我們能否釋放DC和RC描述表?
{
MessageBox(NULL,"釋放DC或RC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // 我們能否刪除RC?
{
MessageBox(NULL,"釋放RC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // 將RC設為 NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // 我們能否釋放 DC?
{
MessageBox(NULL,"釋放DC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // 將 DC 設為 NULL
}
if (hWnd && !DestroyWindow(hWnd)) // 能否銷毀窗口?
{
MessageBox(NULL,"釋放窗口句柄失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // 將 hWnd 設為 NULL
}
if (!UnregisterClass("OpenG",hInstance)) // 能否注銷類?
{
MessageBox(NULL,"不能注銷窗口類。","關閉錯誤",MB_OK | MB_ICONINFORMATION);
hInstance=NULL; // 將 hInstance 設為 NULL
}
}
/* 這個函數(shù)創(chuàng)建我們OpenGL窗口,參數(shù)為: *
* title - 窗口標題 *
* width - 窗口寬度 *
* height - 窗口高度 *
* bits - 顏色的位深(8/16/32) *
* fullscreenflag - 是否使用全屏模式,全屏模式(TRUE),窗口模式(FALSE) */
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat; // 保存查找匹配的結果
WNDCLASS wc; // 窗口類結構
DWORD dwExStyle; // 擴展窗口風格
DWORD dwStyle; // 窗口風格
RECT WindowRect; // 取得矩形的左上角和右下角的坐標值
WindowRect.left=(long)0; // 將Left 設為 0
WindowRect.right=(long)width; // 將Right 設為要求的寬度
WindowRect.top=(long)0; // 將Top 設為 0
WindowRect.bottom=(long)height; // 將Bottom 設為要求的高度
fullscreen=fullscreenflag; // 設置全局全屏標志
hInstance = GetModuleHandle(NULL); // 取得我們窗口的實例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移動時重畫,并為窗口取得DC
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc處理消息
wc.cbClsExtra = 0; // 無額外窗口數(shù)據(jù)
wc.cbWndExtra = 0; // 無額外窗口數(shù)據(jù)
wc.hInstance = hInstance; // 設置實例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 裝入缺省圖標
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 裝入鼠標指針
wc.hbrBackground = NULL; // GL不需要背景
wc.lpszMenuName = NULL; // 不需要菜單
wc.lpszClassName = "OpenG"; // 設定類名字
if (!RegisterClass(&wc)) // 嘗試注冊窗口類
{
MessageBox(NULL,"注冊窗口失敗","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 退出并返回FALSE
}
if (fullscreen) // 要嘗試全屏模式嗎?
{
DEVMODE dmScreenSettings; // 設備模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // 確保內(nèi)存清空為零
dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Devmode 結構的大小
dmScreenSettings.dmPelsWidth = width; // 所選屏幕寬度
dmScreenSettings.dmPelsHeight = height; // 所選屏幕高度
dmScreenSettings.dmBitsPerPel = bits; // 每象素所選的色彩深度
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// 嘗試設置顯示模式并返回結果。注: CDS_FULLSCREEN 移去了狀態(tài)條
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// 若模式失敗,提供兩個選項:退出或在窗口內(nèi)運行。
if (MessageBox(NULL,"全屏模式在當前顯卡上設置失敗!\n使用窗口模式?","XQ G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
//如果用戶選擇窗口模式,變量fullscreen 的值變?yōu)镕ALSE,程序繼續(xù)運行
fullscreen=FALSE; // 選擇窗口模式(Fullscreen=FALSE)
}
else
{
//如果用戶選擇退出,彈出消息窗口告知用戶程序?qū)⒔Y束。并返回FALSE告訴程序窗口未能成功創(chuàng)建。程序退出。
MessageBox(NULL,"程序?qū)⒈魂P閉","錯誤",MB_OK|MB_ICONSTOP);
return FALSE; // 退出并返回 FALSE
}
}
}
if (fullscreen) // 仍處于全屏模式嗎?
{
dwExStyle=WS_EX_APPWINDOW; // 擴展窗體風格
dwStyle=WS_POPUP; // 窗體風格
ShowCursor(FALSE); // 隱藏鼠標指針
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // 擴展窗體風格
dwStyle=WS_OVERLAPPEDWINDOW; // 窗體風格
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // 調(diào)整窗口達到真正要求的大小
// 創(chuàng)建窗口
if (!(hWnd=CreateWindowEx( dwExStyle, // 擴展窗體風格
"OpenG", // 類名字
title, // 窗口標題
dwStyle | // 必須的窗體風格屬性
WS_CLIPSIBLINGS | // 必須的窗體風格屬性
WS_CLIPCHILDREN, // 必須的窗體風格屬性
0, 0, // 窗口位置
WindowRect.right-WindowRect.left, // 計算調(diào)整好的窗口寬度
WindowRect.bottom-WindowRect.top, // 計算調(diào)整好的窗口高度
NULL, // 無父窗口
NULL, // 無菜單
hInstance, // 實例
NULL))) // 不向WM_CREATE傳遞任何東東
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"窗口創(chuàng)建錯誤","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
static PIXELFORMATDESCRIPTOR pfd= //pfd 告訴窗口我們所希望的東東,即窗口使用的像素格式
{
sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小
1, // 版本號
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必須支持OpenGL
PFD_DOUBLEBUFFER, // 必須支持雙緩沖
PFD_TYPE_RGBA, // 申請 RGBA 格式
bits, // 選定色彩深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 無Alpha緩存
0, // 忽略Shift Bit
0, // 無累加緩存
0, 0, 0, 0, // 忽略聚集位
16, // 16位 Z-緩存 (深度緩存)
0, // 無蒙板緩存
0, // 無輔助緩存
PFD_MAIN_PLANE, // 主繪圖層
0, // 不使用重疊層
0, 0, 0 // 忽略層遮罩
};
if (!(hDC=GetDC(hWnd))) // 取得設備描述表了么?
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"不能創(chuàng)建一個窗口設備描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Windows 找到相應的象素格式了嗎?
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"不能創(chuàng)建一種相匹配的像素格式","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // 能夠設置象素格式么?
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"不能設置像素格式","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
if (!(hRC=wglCreateContext(hDC))) // 能否取得OpenGL渲染描述表?
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"不能創(chuàng)建OpenGL渲染描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
if(!wglMakeCurrent(hDC,hRC)) // 嘗試激活著色描述表
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"不能激活當前的OpenGL渲然描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
ShowWindow(hWnd,SW_SHOW); // 顯示窗口
SetForegroundWindow(hWnd); // 略略提高優(yōu)先級
SetFocus(hWnd); // 設置鍵盤的焦點至此窗口
ReSizeGLScene(width, height); // 設置透視 GL 屏幕
if (!InitGL()) // 初始化新建的GL窗口
{
KillGLWindow(); // 重置顯示區(qū)
MessageBox(NULL,"初始化失敗","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
return TRUE; // 成功
}
LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄
UINT uMsg, // 窗口的消息
WPARAM wParam, // 附加的消息內(nèi)容
LPARAM lParam) // 附加的消息內(nèi)容
{
switch (uMsg) // 檢查Windows消息
{
case WM_ACTIVATE: // 監(jiān)視窗口激活消息
{
if (!HIWORD(wParam)) // 檢查最小化狀態(tài)
{
active=TRUE; // 程序處于激活狀態(tài)
}
else
{
active=FALSE; // 程序不再激活
}
return 0; // 返回消息循環(huán)
}
case WM_SYSCOMMAND: // 系統(tǒng)中斷命令
{
switch (wParam) // 檢查系統(tǒng)調(diào)用
{
case SC_SCREENSAVE: // 屏保要運行?
case SC_MONITORPOWER: // 顯示器要進入節(jié)電模式?
return 0; // 阻止發(fā)生
}
break; // 退出
}
case WM_CLOSE: // 收到Close消息?
{
PostQuitMessage(0); // 發(fā)出退出消息
return 0; // 返回
}
case WM_KEYDOWN: // 有鍵按下么?
{
keys[wParam] = TRUE; // 如果是,設為TRUE
return 0; // 返回
}
case WM_KEYUP: // 有鍵放開么?
{
keys[wParam] = FALSE; // 如果是,設為FALSE
return 0; // 返回
}
case WM_SIZE: // 調(diào)整OpenGL窗口大小
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width,HiWord=Height
return 0; // 返回
}
}
// 向 DefWindowProc傳遞所有未處理的消息。
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, // 當前窗口實例
HINSTANCE hPrevInstance, // 前一個窗口實例
LPSTR lpCmdLine, // 命令行參數(shù)
int nCmdShow) // 窗口顯示狀態(tài)
{
MSG msg; // Windowsx消息結構
BOOL done=FALSE; // 用來退出循環(huán)的Bool 變量
// 提示用戶選擇運行模式
fullscreen=FALSE; // FALSE為窗口模式
int scrWidth, scrHeight;
RECT rect;
scrWidth = GetSystemMetrics(SM_CXSCREEN);
scrHeight = GetSystemMetrics(SM_CYSCREEN);
GetWindowRect(hWnd, &rect);
SetWindowPos(hWnd, HWND_TOPMOST, (scrWidth - rect.right) / 2, (scrHeight - rect.bottom) / 2, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);
BOOL Res = CreateGLWindow("顏色實例", 640, 480, 16, fullscreen);
if (Res)
{
GetWindowRect(hWnd, &rect);
SetWindowPos(hWnd, HWND_TOPMOST, (scrWidth - rect.right) / 2, (scrHeight - rect.bottom) / 2, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);
}
else
{
return 0; // 如果窗口未能創(chuàng)建,程序退出
}
while(!done) // 保持循環(huán)直到 done=TRUE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // 有消息在等待嗎?
{
if (msg.message==WM_QUIT) // 收到退出消息?
{
done=TRUE; // 是,則done=TRUE
}
else // 不是,處理窗口消息
{
TranslateMessage(&msg); // 翻譯消息
DispatchMessage(&msg); // 發(fā)送消息
}
}
else // 如果沒有消息
{
// 繪制場景。監(jiān)視ESC鍵和來自DrawGLScene()的退出消息
if (active) // 程序激活的么?
{
if (keys[VK_ESCAPE]) // ESC 按下了么?
{
done=TRUE; // ESC 發(fā)出退出信號
}
else // 不是退出的時候,刷新屏幕
{
DrawGLScene(); // 繪制場景
SwapBuffers(hDC); // 交換緩存 (雙緩存)
}
}
if (keys[VK_F1]) // F1鍵按下了么?
{
keys[VK_F1]=FALSE; // 若是,使對應的Key數(shù)組中的值為 FALSE
KillGLWindow(); // 銷毀當前的窗口
fullscreen=!fullscreen; // 切換 全屏 / 窗口 模式
// 重建 OpenGL 窗口
/***********************************新添的代碼***********************************************************************************/
if (!CreateGLWindow("顏色實例",640,480,16,fullscreen))
/********************************************************************************************************************************/
{
return 0; // 如果窗口未能創(chuàng)建,程序退出
}
}
}
}
// 關閉程序
KillGLWindow(); // 銷毀窗口
return (msg.wParam); // 退出程序
}
項目演示:

項目完整下載地址:
鏈接: https://pan.baidu.com/s/1i4FmtqquRUY31lBDw1dEyQ 提取碼: xrcj
到此這篇關于C++ Opengl圖形顏色功能附源碼下載的文章就介紹到這了,更多相關C++ Opengl圖形顏色內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言實現(xiàn)學生宿舍信息管理系統(tǒng)課程設計
這篇文章主要為大家詳細介紹了C語言實現(xiàn)學生宿舍信息管理系統(tǒng)課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
C++ for循環(huán)與nullptr的小知識點分享
這篇文章主要是來和大家介紹一些C++中的小知識點,本文分享的是for循環(huán)與nullptr,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05
Qt利用QJson實現(xiàn)解析數(shù)組的示例詳解
這篇文章主要為大家詳細介紹了Qt如何利用QJson實現(xiàn)解析數(shù)組功能,文中的示例代碼講解詳細,對我們學習Qt有一定幫助,需要的小伙伴可以了解一下2022-10-10
先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)深入解析
以下是對先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)進行了詳細的分析介紹,需要的朋友可以過來參考下2013-07-07

