1. 程式人生 > >OpenGL原始碼之五繪製3D圖形

OpenGL原始碼之五繪製3D圖形

#include <Windows.h> //Windows的標頭檔案
#include <gl/glut.h> //包含OpenGL實用庫


HGLRC hRC=NULL; //視窗著色描述表控制代碼
HDC hDC=NULL;//OpenGL渲染描述表控制代碼
HWND hWnd=NULL; //儲存視窗控制代碼
HINSTANCE hInstance; //儲存程式例項


bool keys[256];//儲存鍵盤按鍵的陣列
bool active=TRUE;//視窗的活動標誌,預設為TRUE
bool fullscreen=TRUE; //全屏標誌預設,預設設定成全屏模式


GLfloat rtri;//用於三角形的角度
GLfloat rquad;//用於四邊形的角度


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//WndProc的定義


//重置OpenGL視窗大小
GLvoid ResizeGLScene(GLsizei width,GLsizei height)
{
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.0f);//黑色背景
glClearDepth(1.0f);//設定深度快取
glEnable(GL_DEPTH_TEST);//啟用深度測試
glDepthFunc(GL_LEQUAL);//所作深度測試的型別
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//告訴系統對透視進行修正


return TRUE;
}


//進行繪製
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除螢幕和深度快取
glLoadIdentity();//重置當前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,並移入螢幕6.0


glRotatef(rtri,0.0f,1.0f,0.0f);//繞Y軸旋轉金字塔
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,1.0f);//左下(前側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(1.0f,-1.0f,1.0f);//右下(前側面)


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,1.0f);//左下(右側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(1.0f,-1.0f,-1.0f);//右下(右側面)


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,-1.0f);//左下(後側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(-1.0f,-1.0f,-1.0f);//右下(後側面)


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,-1.0f);//左下(左側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(-1.0f,-1.0f,1.0f);//右下(左側面)


glEnd();//三角形繪製結束


glLoadIdentity();//重置模型觀察矩陣
glTranslatef(1.5f,0.0f,-7.0f);//先右移再移入螢幕
glRotatef(rquad,1.0f,1.0f,1.0f);//繞XYZ軸旋轉立方體

glBegin(GL_QUADS); //繪製正方形
glColor3f(0.0f,1.0f,0.0f);//將當前色設定為綠色
//頂面
glVertex3f(1.0f,1.0f,-1.0f);//右上
glVertex3f(-1.0f,1.0f,-1.0f);//左上
glVertex3f(-1.0f,1.0f,1.0f);//左下
glVertex3f(1.0f,1.0f,1.0f);//右下


//橙色
glColor3f(1.0f,0.5f,0.0f);
    //底面
glVertex3f(1.0f,-1.0f,-1.0f);//右上
glVertex3f(-1.0f,-1.0f,-1.0f);//左上
glVertex3f(-1.0f,-1.0f,1.0f);//左下
glVertex3f(1.0f,-1.0f,1.0f);//右下


//紅色
glColor3f(1.0f,0.0f,0.0f);
//前面
glVertex3f(1.0f,1.0f,1.0f);//右上
glVertex3f(-1.0f,1.0f,1.0f);//左上
glVertex3f(-1.0f,-1.0f,1.0f);//左下
glVertex3f(1.0f,-1.0f,1.0f);//右下


//黃色
glColor3f(1.0f,1.0f,0.0f);
//後面
glVertex3f(1.0f,1.0f,-1.0f);//右上
glVertex3f(-1.0f,1.0f,-1.0f);//左上
glVertex3f(-1.0f,-1.0f,-1.0f);//左下
glVertex3f(1.0f,-1.0f,-1.0f);//右下


//藍色
glColor3f(0.0f,0.0f,1.0f);
//左面
glVertex3f(-1.0f,1.0f,1.0f);//右上
glVertex3f(-1.0f,1.0f,-1.0f);//左上
glVertex3f(-1.0f,-1.0f,-1.0f);//左下
glVertex3f(-1.0f,-1.0f,1.0f);//右下


//紫羅蘭色
glColor3f(1.0f,0.0f,1.0f);
//右面
glVertex3f(1.0f,1.0f,1.0f);//右上
glVertex3f(1.0f,1.0f,-1.0f);//左上
glVertex3f(1.0f,-1.0f,-1.0f);//左下
glVertex3f(1.0f,-1.0f,1.0f);//右下


glEnd();


//<控制旋轉速度>
rtri +=0.02f;   //增加三角形的旋轉變數
rquad -=0.015f; //減少四邊形的旋轉變數


return TRUE;
}


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;
}


if(hDC && !ReleaseDC(hWnd,hDC)) //能否釋放DC
{
MessageBox(NULL,"釋放DC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
hDC = NULL;
}


if(hWnd && !DestroyWindow(hWnd)) //能否銷燬視窗
{
MessageBox(NULL,"釋放視窗控制代碼失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
hWnd = NULL;
}


if(!UnregisterClass("OpenGL",hInstance)) //能否登出視窗類
{
MessageBox(NULL,"不能登出視窗類。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
hInstance = NULL;
}
}


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;
WindowRect.bottom=(long)height;


fullscreen = fullscreenflag;//設定全域性全屏標誌


hInstance         = GetModuleHandle(NULL);//取得視窗的例項
wc.style          = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;//移動時重畫,併為視窗取得DC
wc.lpfnWndProc    = WndProc;//WndProc處理訊息
wc.cbClsExtra     = 0;//無額外視窗資料Specifies the number of extra bytes to allocate following the window-class structure. 
wc.cbWndExtra     = 0; //無額外視窗資料Specifies the number of extra bytes to allocate following the window instance.
wc.hInstance      = hInstance;//設定例項
wc.hIcon          = LoadIcon(NULL,IDI_WINLOGO);//裝入預設圖示
wc.hCursor        = LoadCursor(NULL,IDC_ARROW);//裝入滑鼠指標
wc.hbrBackground  = NULL;         //GL不需要背景
wc.lpszMenuName   = NULL ;         //不需要選單
wc.lpszClassName  = "OpenGL";     //設定類名字


if(!RegisterClass(&wc)) //嘗試註冊視窗類
{
MessageBox(NULL,"註冊視窗失敗","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


if(fullscreen)
{
DEVMODE dmScreenSettings; //裝置模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));//確保記憶體清空為零
dmScreenSettings.dmSize=sizeof(dmScreenSettings);//Devmode結構的大小
dmScreenSettings.dmPelsWidth = width;//所選螢幕寬度
dmScreenSettings.dmPelsHeight = height;//所選螢幕高度
dmScreenSettings.dmBitsPerPel = bits; //每畫素所選的色彩濃度
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;


//嘗試設定顯示模式並返回結果。注:CDS_FULLSCREEN移去了狀態條。
if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
//若模式失敗,提供兩個選項:退出或在視窗內執行。
if(MessageBox(NULL,"全屏模式在當前顯示卡上設定失敗!\n使用視窗模式?",
"提示",MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
{
fullscreen = FALSE;//選擇視窗模式
}
else
{
//彈出一個對話方塊,告訴使用者程式結束
MessageBox(NULL,"程式將被關閉","錯誤",MB_OK | MB_ICONSTOP);
return 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);//調整視窗達到真正要求的大小


//窗體自適應各種解析度以居中方式顯示
LONG nX, nY;


nX = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2;
nY = (::GetSystemMetrics(SM_CYSCREEN) - height) / 2;


if(!(hWnd = CreateWindowEx(dwExStyle, //擴充套件窗體風格
"OpenGL", //類名字
title,    //視窗標題
WS_CLIPSIBLINGS | WS_CLIPCHILDREN| //必須的窗體風格屬性
dwStyle,   //選擇的窗體屬性
nX,nY,   //視窗位置
WindowRect.right - WindowRect.left, //計算調整好的視窗寬度
WindowRect.bottom - WindowRect.top, //計算調整好的窗體高度
NULL, //無父視窗
NULL, //無選單
hInstance, //例項
NULL))) //不向WM_CREATE傳遞任何東西
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能建立一個視窗裝置描述表","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


static PIXELFORMATDESCRIPTOR pfd = //pdf告訴視窗希望的東西,即視窗使用的畫素格式
{
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,                 //Reserved
0,0,0              //忽略層遮罩
};


if(!(hDC = GetDC(hWnd))) //是否取得裝置描述表
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能建立一種相匹配的畫素格式","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


if(!(PixelFormat = ChoosePixelFormat(hDC,&pfd))) //Windows是否找到相應的畫素格式
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能設定畫素格式","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


if(!SetPixelFormat(hDC,PixelFormat,&pfd)) //是否能夠設定畫素格式
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能設定畫素格式","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


if (!(hRC = wglCreateContext(hDC))) //能否取得著色描述表
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能建立OpenGL渲染描述表","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


if(!wglMakeCurrent(hDC,hRC)) //嘗試啟用著色描述表
{
KillGLWindow();
MessageBox(NULL,"不能啟用當前的OpenGL渲染描述表","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


ShowWindow(hWnd,SW_SHOW);//顯示視窗
SetForegroundWindow(hWnd);//提供優先級別
SetFocus(hWnd);//設定鍵盤的焦點至此視窗
ResizeGLScene(width,height);//設定透視GL螢幕


if (!InitGL()) //初始化新建的GL視窗
{
KillGLWindow();
MessageBox(NULL,"Initialization","ERROR",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}


return TRUE;
}


//處理所有的視窗訊息
LRESULT CALLBACK WndProc(HWND hWnd,//視窗的控制代碼
UINT uMsg,//視窗的訊息
WPARAM wParam,//附加的訊息內容
LPARAM lParam) //附加的訊息內容
{
switch(uMsg) //檢查檢查Windows訊息
{
case WM_ACTIVATE:  //監視視窗啟用訊息
{
if(!HIWORD(wParam)) //檢查最小化狀態
{
active = TRUE; //程式處於啟用狀態
}
else
{
active = FALSE;//程式不再啟用
}


return 0;//返回訊息迴圈
}


case WM_SYSCOMMAND: //系統中斷命令
{
switch(wParam) //檢查系統呼叫
{
case  SC_SCREENSAVE: //屏保執行
case SC_MONITORPOWER: //顯示器進入節電模式
return 0; //阻止發生
}
break; //退出
}
case WM_CLOSE: //收到Close訊息
{
PostQuitMessage(0);//發出退出訊息
return 0;
}
case WM_KEYDOWN: //有鍵按下
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP: //有鍵放開
{
keys[wParam] = FALSE;
return 0;
}
case WM_SIZE: //調整OpenGL視窗大小
{
ResizeGLScene(LOWORD(lParam),HIWORD(lParam));//LOWORD=width,HIWORD=height
return 0;
}
}


//向DefWindowProc傳遞所有未處理的訊息
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}


//Windows程式的入口,呼叫視窗建立例程,處理視窗訊息,並監視人機互動。
int WINAPI WinMain(HINSTANCE hInstance,//當前視窗例項
  HINSTANCE hPrevInstance, //前一個視窗例項
  LPSTR lpCmdLine, //命令列引數
  int nCmdShow) //視窗顯示狀態
{
MSG msg;//Windows訊息結構
BOOL done=FALSE;//用來退出迴圈的BOOL變數
//提示使用者選擇執行模式
if (MessageBox(NULL,"你想在全屏模式下執行麼?","設定全屏模式",MB_YESNO | MB_ICONQUESTION) == IDNO)
{
fullscreen = FALSE; //設定為視窗模式
}


//建立OpenGL視窗
if(!CreateGLWindow("OpenGL程式框架",640,480,16,fullscreen))
{
return 0;       //失敗退出
}


while(!done)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //是否有訊息在等待
{
if(msg.message == WM_QUIT) //收到退出訊息
{
done = TRUE;
}
else //處理視窗訊息
{
TranslateMessage(&msg);  //翻譯訊息
DispatchMessage(&msg);   //傳送訊息
}
}
else //如果沒有訊息
{
//繪製場景。監視ESC鍵和來自DrawGLScene()的退出訊息
if(active)
{
if(keys[VK_ESCAPE])
{
done = TRUE;
}
else //沒有退出,重新整理螢幕
{
DrawGLScene();//繪製場景
SwapBuffers(hDC);//交換快取(雙快取)
}
}
if(keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen = !fullscreen;//切換全屏/視窗模式
//重建OpenGL視窗
if(!CreateGLWindow("3D旋轉例項",640,480,16,fullscreen))
{
return 0;
}
}
}
}


//關閉程式
KillGLWindow(); //銷燬視窗
return (msg.wParam); //退出程式

相關推薦

OpenGL原始碼繪製3D圖形

#include <Windows.h> //Windows的標頭檔案 #include <gl/glut.h> //包含OpenGL實用庫 HGLRC hRC=NULL; //視窗著色描述表控制代碼 HDC hDC=NULL;//OpenGL渲染描述表控制代碼 HWND hWnd=N

opengl學習筆記 ——繪製複雜圖形

                本小節的程式碼參考了 http://www.cppblog.com/doing5552/arc

OpenGL ES繪製3D圖形

package com.example.tyxiong.myapplication; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bun

python matlibplot繪製3D圖形

散點圖使用scatter from mpl_toolkits.mplot3d import Axes3D import numpy as np from matplotlib import pyplot as plt

(十)利用processing繪製3D圖形

3D圖形的旋轉: //import processing.opengl.*; void setup(){   size(800, 600, P3D);   noStroke();   fill(25

OpenGL學習第一個3D模型demo

直接上程式碼 1.main.cpp // // main.cpp // GL_First3Ddemo // // #include <iostream> #include <GL/glew.h> #include &l

OpenGL入門()使用頂點繪製圖形

寫在前面 最近對OpenGL程式設計又雙叒產生了濃厚的興趣,決定把學習OpenGL過程中學到的知識都整理到部落格中來,一來方便日後檢視,而來也是為了和諸位大佬共勉。有不當的地方還望諸位批評指正,謝謝。 本系列部落格將使用freeglut3.0.0和glew2

OpenGL_Qt學習筆記_04(3D圖形繪製和旋轉)

     繪製四稜錐      四稜錐由5個面構成一個封閉的立體圖,其中4個共頂點的側面是三角形,底面是個四邊形。如果我們要繪製一個3D的四稜錐只需要繪製這5個面即可,繪製的方法和前一篇文章OpenGL_Qt學習筆記之_03(平面圖形的著色和旋轉)的相同。只不過這裡的頂點座標是3維的,所以影象深度那一維不

圖解opengl 3D 圖形繪製例項

VC6 下載http://blog.csdn.net/bcbobo21cn/article/details/44200205opengl環境配置http://blog.csdn.net/bcbobo21cn/article/details/51044614#t4以下的dem

Qt OpenGL:學習現代3D圖形程式設計二,玩轉色彩

        除了給三角形賦予單一的顏色,我們還有兩種方法來改變三角形表面的顏色,一種是利用片段的位置來計算顏色,另一種是利用每個頂點的資料來計算顏色。 一、利用片段位置計算顏色         片

tensorflow原始碼學習 -- 同步訓練和非同步訓練

 同步和非同步訓練是由optimizer來決定的。         1. 同步訓練         同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org

OpenGL基礎繪製

OpenGL繪製函式! 繪製方式 說明 GL_POINTS點) 繪製點 GL_LINES(線段) 連個點一組進行點的繪製,如果只有一個點就會捨棄這個點

Android系統原始碼分析--View繪製流程-setContentView

上一篇分析了四大元件之ContentProvider,這也是四大元件最後一個。因此,從這篇開始我們分析新的篇章--View繪製流程,View繪製流程在Android開發中佔有非常重要的位置,只要有檢視的顯示,都離不開View的繪製,所以瞭解View繪製原理對於應用開發以及系統的學習至關重要。由於View

【181122】OpenGL程式設計攝像漫遊VC程式碼演示原始碼

原始碼下載簡介 OpenGL程式設計之攝像漫遊VC原始碼演示,這是學程式編遊戲系列叢書中的一個例項,原始碼無錯,編譯順利。視窗中運動的雷達和飛機是可以用鍵盤控制的,↑進 ↓退 →右 ←左 UP仰 DOWM俯,程式執行後會自動搜尋視訊渲染模式,如果找不到,會給出提示,程式也就不能執行,好好研究

ndroid系統原始碼分析--View繪製流程-inflate

上一章我們分析了Activity啟動的時候呼叫setContentView載入佈局的過程,但是分析過程中我們留了兩個懸念,一個是將資原始檔中的layout中xml佈局檔案通過inflate載入到Activity中的過程,另一個是開始測量、佈局和繪製的過程,第二個我們放到measure過程中分析,這一篇先

Android OpenGL ES 簡明開發教程_真正的3D圖形

摘要:該系列文章均轉載自/content/540025.html由於原文好像無法開啟,正好自己有記錄,所以正好分享出來。Mesh(網格,三角面)是構成空間形體的基本元素,前面的正方形也是由兩個Mesh構成的。本篇將介紹使用Mesh構成四面體,椎體等基本空間形體。Design設計在使用Ope

opengl學習路三十,延遲著色法

Note 本節暫未進行完全的重寫,錯誤可能會很多。如果可能的話,請對照原文進行閱讀。如果有報告本節的錯誤,將會延遲至重寫之後進行處理。 我們現在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向著色法(Forward Shading)

批處理檔案(bat)繪製3D球體

前言: 本文章分享利用bat檔案繪製3D球體效果,具體效果可關注我的抖音,檢視短視訊介紹。 程式碼實現: chcp 437 if "%1"=="" ( for %%a in ( FontSize:00080008 FontF

RabbitMQ客戶端原始碼分析()ConsumerWorkSerivce與WorkPool

RabbitMQ-java-client版本 com.rabbitmq:amqp-client:4.3.0 RabbitMQ版本宣告: 3.6.15 WorkPool WorkPool可以認

OpenGL狀態管理和繪製幾何物體頂點陣列

1. 頂點陣列可以減少函式呼叫次數, 還可以避免冗餘資料 2. 使用頂點陣列對幾何圖形進行渲染需要3個步驟 a. 啟用最多可達8個數組,每個陣列用於儲存不同型別的資料:頂點座標,表面法線,RGBA顏色,輔助顏色,顏色索引,霧座標,紋理座標以及多邊形的邊界標誌 b. 把