PIXELFORMATDESCRIPTOR

像素格式描述表:PIXELFORMATDESCRIPTOR

在OpenGL对窗口渲染之前,必须根据渲染需要对窗口进行配置。
需要硬件渲染还是软件渲染?
渲染使用单缓冲还是双缓冲?
是否需要深度缓冲区?
是否需要模板、目标Alpha或积累缓冲区?
.......
当为窗口设置这些参数之后,就无法对它们进行修改。为了从一个只有深度缓冲和颜色缓冲区的窗口切换到一个带有模板缓冲区的窗口,必须首先销毁第一个窗口,然后根据需要重新创建一个窗口。
  
[ OpenGL] 
PIXELFORMATDESCRIPTOR

The PIXELFORMATDESCRIPTOR structure describes the pixel format of a drawing surface.

typedef struct tagPIXELFORMATDESCRIPTOR 
{ // pfd   
   WORD   nSize;        //结构大小:   sizeof(PIXELFORMATDISCRIPTOR)
   WORD   nVersion;      //版本:    1    
   DWORD dwFlags;      //像素缓冲区属性
   BYTE   iPixelType;      //像素格式 
   BYTE   cColorBits;    //颜色缓冲区中位平面的数量
   BYTE   cRedBits;     //用多少位表示红色
   BYTE   cRedShift;     //红色位的移位计数
   BYTE   cGreenBits; 
   BYTE   cGreenShift; 
   BYTE   cBlueBits; 
   BYTE   cBlueShift; 
   BYTE   cAlphaBits; 
   BYTE   cAlphaShift; 
   BYTE   cAccumBits;      //积累缓冲区位数 
   BYTE   cAccumRedBits;   //积累缓冲区中红色的位数
   BYTE   cAccumGreenBits; 
   BYTE   cAccumBlueBits; 
   BYTE   cAccumAlphaBits; 
   BYTE   cDepthBits;    //深度缓冲区位数
   BYTE   cStencilBits;   //模板缓冲区位数
   BYTE   cAuxBuffers;    //多少个辅助缓冲区
   BYTE   iLayerType;    //过时或忽略
   BYTE   bReserved;     //上层或下层平面的数量
   DWORD dwLayerMask;    //过时或忽略
   DWORD dwVisibleMask;   //下平面的透明颜色
   DWORD dwDamageMask;   //过时或忽略
} PIXELFORMATDESCRIPTOR; 
  
//************************************************************************
//设置窗口像素格式
//************************************************************************  
GLuint   PixelFormat;    // Holds The Results After Searching For A Match
static PIXELFORMATDESCRIPTOR pfd=     // pfd Tells Windows How We Want Things To Be
{
    sizeof(PIXELFORMATDESCRIPTOR),    // Size Of This Pixel Format Descriptor
    1,                  // Version Number
    PFD_DRAW_TO_WINDOW |         // Format Must Support Window
    PFD_SUPPORT_OPENGL |         // Format Must Support OpenGL
    PFD_DOUBLEBUFFER,           // Must Support Double Buffering
    PFD_TYPE_RGBA,            // Request An RGBA Format
    32,                  // Select Our Color Depth
    0, 0, 0, 0, 0, 0,           // Color Bits Ignored
    0,                  // No Alpha Buffer
    0,                  // Shift Bit Ignored
    0,                  // No Accumulation Buffer
    0, 0, 0, 0,              // Accumulation Bits Ignored
    16,                  // 16Bit Z-Buffer (Depth Buffer)  
    1,                  // No Stencil Buffer
    0,                  // No Auxiliary Buffer
    PFD_MAIN_PLANE,            // Main Drawing Layer
    0,                  // Reserved
    0, 0, 0                // Layer Masks Ignored
};
if (!PixelFormat=ChoosePixelFormat(m_hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
{
   MessageBox("Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
   return FALSE;         // Return FALSE
}

if(!SetPixelFormat(m_hDC,PixelFormat,&pfd))   // Are We Able To Set The Pixel Format?
{
   MessageBox("Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
   return FALSE;         // Return FALSE
}

#include<GL/gl.h> #include<windows.h> #include<iostream> #include<GL/glu.h> using namespace std; LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return 0; } BOOL SetupPixelFormat(HDC hdc){ PIXELFORMATDESCRIPTOR pfd; int pixelformat; ZeroMemory(&pfd.bReserved,sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion=1; pfd.iPixelType=PFD_TYPE_RGBA; pfd.cColorBits=32; pfd.cDepthBits=32; pfd.iLayerType=PFD_MAIN_PLANE; pixelformat=ChoosePixelFormat(hdc,&pfd); if(pixelformat==0){ return FALSE; } if(SetPixelFormat(hdc,pixelformat,&pfd)==FALSE) return FALSE; return TRUE; } void InitOpenGL(HDC hdc){ HGLRC hrc=wglCreateContext(hdc); wglMakeCurrent(hdc,hrc); glClearColor(0.0f,0.0f,0.0f,1.0f); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, 800.0f / 600.0f, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ WNDCLASS wc; HWND hwnd; MSG msg; ZeroMemory(&wc,sizeof(WNDCLASS)); wc.lpfnWndProc=WndProc; wc.hInstance=hInstance; wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.lpszClassName="OpenGLWindow"; RegisterClass(&wc); hwnd=CreateWindow("OpenGLWindow","OpenGL 3D Window",WS_OVERLAPPEDWINDOW,100,100,800,600,NULL,NULL,hInstance,NULL); ShowWindow(hwnd, nCmdShow); HDC hdc = GetDC(hwnd); SetupPixelFormat(hdc); InitOpenGL(hdc); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.0f, 0.5f, 0.0f); glEnd(); SwapBuffers(hdc); } wglMakeCurrent(NULL, NULL); wglDeleteContext(wglGetCurrentContext()); ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); UnregisterClass("OpenGLWindow", hInstance); return msg.wParam; } 哪里有问题
08-30
#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int lastX = 0, lastY = 0; static float rotationX = 0.0f, rotationY = 0.0f; switch (msg) { case WM_LBUTTONDOWN: lastX = LOWORD(lParam); lastY = HIWORD(lParam); break; case WM_MOUSEMOVE: if (wParam & MK_LBUTTON) { int x = LOWORD(lParam); int y = HIWORD(lParam); rotationX += (y - lastY); rotationY += (x - lastX); lastX = x; lastY = y; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // 设置像素格式 BOOL SetupPixelFormat(HDC hdc) { PIXELFORMATDESCRIPTOR pfd; int pixelformat; ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.iLayerType = PFD_MAIN_PLANE; pixelformat = ChoosePixelFormat(hdc, &pfd); if (pixelformat == 0) { return FALSE; } if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE) return FALSE; return TRUE; } // 初始化 OpenGL void InitOpenGL(HDC hdc) { HGLRC hrc = wglCreateContext(hdc); wglMakeCurrent(hdc, hrc); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, 800.0f / 600.0f, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); } // 绘制立方体 void DrawCube() { glBegin(GL_QUADS); // 前面 glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); // 后面 glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(-0.5f, 0.5f, -0.5f); glVertex3f(0.5f, 0.5f, -0.5f); glVertex3f(0.5f, -0.5f, -0.5f); // 顶面 glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, 0.5f, -0.5f); // 底面 glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(0.5f, -0.5f, -0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glVertex3f(-0.5f, -0.5f, 0.5f); // 左面 glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, -0.5f); // 右面 glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f); glVertex3f(0.5f, 0.5f, -0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glEnd(); } // 主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; HWND hwnd; MSG msg; ZeroMemory(&wc, sizeof(WNDCLASS)); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = "OpenGLWindow"; RegisterClass(&wc); hwnd = CreateWindow("OpenGLWindow", "OpenGL Rotating Cube", WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); HDC hdc = GetDC(hwnd); SetupPixelFormat(hdc); InitOpenGL(hdc); static float rotationX = 0.0f, rotationY = 0.0f; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(rotationX, 1.0f, 0.0f, 0.0f); glRotatef(rotationY, 0.0f, 1.0f, 0.0f); DrawCube(); SwapBuffers(hdc); } wglMakeCurrent(NULL, NULL); HGLRC hrc = wglGetCurrentContext(); if (hrc != NULL) { wglDeleteContext(hrc); } ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); UnregisterClass("OpenGLWindow", hInstance); return msg.wParam; } 该代码有什么问题
最新发布
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值