青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shuffy

不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

源代碼下載:OpenGL_ch2.rar 

WGL – Windows OpenGL擴展層

The WGL extension consists of a set of functions (wglCreateContext, wglDeleteContext etc.) and structures (such as PIXELFORMATDESCRIPTOR, GLYPHMETRICSFLOAT) etc. Thus every OpenGL implementation has a platform-specific portion which has to be set up and used according to the particular platform.

設備上下文

The Windows Graphical Device Interface (GDI) is capable of drawing to screen, to memory, to printers or to any other device that provides a GDI interface layer and that can process GDI calls. GDI accomplishes this by a rendering handle to the currently selected device, which is called the device context, or DC.

繪制上下文

A rendering context is the OpenGL equivalent of the GDI DC. All OpenGL calls are rendered to the device through a RC. The rendering context maintains OpenGL state variables such as current background color, current color etc. just as the DC maintains GDI state variables such as current pen, current brush etc.

像素格式

Pixel formats are the translation layer between OpenGL calls and the rendering operation that Windows performs.

舉個例子,若像素格式只支持很少一部分顏色值,則OpenGL在用RGB(128,120,135)繪制一個像素時,就可能使用轉換后的值(128,128,128)來繪制.

The pixel format selected essentially describes such things as how colors are displayed, depth of field resolution and what additional capabilities are supported by the rendering context created.

第一個基于MFCOpenGL應用程

開發環境:VC6.0

1, 首先下載需要的GLUT頭文件,DLLLib文件,下載鏈接: glutdlls37beta.zip (149 kilobytes),解壓縮后把gltu.h放到"VC98/Include/GL"下,把glut.libglut32.lib放到"VC9/Lib" 下glut32.dllglut.dll放到你創建的應用程序的運行目錄下

2, 創建一個MFC SDI應用程序,在項目屬性中加入所需要鏈接的庫文件

1, stdafx.h中加入下列語句:

//OpenGL Headers

#include 
<gl/gl.h>

#include 
<gl/glu.h>

#include 
<gl/glut.h>

#include 
<gl/glaux.h>

2, 打開ClassWizard,選擇CCY457OpenGLView類,為下述消息加入消息處理函數:WM_CREATE (for OnCreate), WM_DESTROY (for OnDestroy), WM_SIZE (for OnSize), WM_ERASEBACKGROUND (for OnEraseBkground).

3,在窗口創建之前我們必須設置窗口風格包含WS_CLIPCHILDREN WS_CLIPSIBLINGS,從而避免OpenGL繪制到其他窗口中去。這些應該放在PreCreateWindow()中。

BOOL CCY457OpenGLView::PreCreateWindow(CREATESTRUCT& cs)
{
    
// TODO: Modify the Window class or styles here by modifying
    
//  the CREATESTRUCT cs
    
//An OpenGL Window must be created with the following flags
    cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
    
return CView::PreCreateWindow(cs);
}

4, CCY457OpenGLView.h中加入如下語句:

    HGLRC m_hRC;    //Rendering Context
    CDC* m_pDC;        //Device Context
    BOOL InitializeOpenGL();    //Initialize OpenGL
    BOOL SetupPixelFormat();    //Set up the Pixel Format
    void RenderScene();            //Render the Scene

5, OnCreate中我們將通過建立像素格式和繪制上下文來初始化OpenGL. InitializeOpenGL()中會創建一個設備上下文(DC),為這個DC選擇一個像素格式,創建和這個DC相關的繪制上下文(RC,然后選擇這個RC.這個函數會調用SetupPixelFormat()來建立像素格式。

int CCY457OpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    
if (CView::OnCreate(lpCreateStruct) == -1)
        
return -1;
    
//Initialize OpenGL Here
    InitializeOpenGL();
    
return 0;
}

BOOL CCY457OpenGLView::InitializeOpenGL()
{
    
//Get a DC for the Client Area
    m_pDC = new CClientDC(this);
    
//Failure to Get DC
    if(m_pDC == NULL)
    {
        MessageBox(
"Error Obtaining DC");
        
return FALSE;
    }
    
//Failure to set the pixel format
    if(!SetupPixelFormat())
    {
        
return FALSE;
    }
    
//Create Rendering Context
    m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());
    
//Failure to Create Rendering Context
    if(m_hRC == 0)
    {
        MessageBox(
"Error Creating RC");
        
return FALSE;
    }
    
//Make the RC Current
    if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE)
    {
        MessageBox(
"Error making RC Current");
        
return FALSE;
    }
    
//Specify Black as the clear color
    ::glClearColor(0.0f,0.0f,0.0f,0.0f);
    
//Specify the back of the buffer as clear depth
    ::glClearDepth(1.0f);
    
//Enable Depth Testing
    ::glEnable(GL_DEPTH_TEST);
    
return TRUE;
}
//Setup Pixel Format
/////////////////////////////////////////////////////////////////////////////
BOOL CCY457OpenGLView::SetupPixelFormat()
{
  
static PIXELFORMATDESCRIPTOR pfd = 
    {
        
sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
        1,                              // version number
        PFD_DRAW_TO_WINDOW |            // support window
        PFD_SUPPORT_OPENGL |            // support OpenGL
        PFD_DOUBLEBUFFER,                // double buffered
        PFD_TYPE_RGBA,                  // RGBA type
        24,                             // 24-bit color depth
        000000,               // color bits ignored
        0,                              // no alpha buffer
        0,                              // shift bit ignored
        0,                              // no accumulation buffer
        0000,                     // accum bits ignored
        16,                             // 16-bit z-buffer
        0,                              // no stencil buffer
        0,                              // no auxiliary buffer
        PFD_MAIN_PLANE,                 // main layer
        0,                              // reserved
        000                         // layer masks ignored
    };
    
int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
    
if ( m_nPixelFormat == 0 )
    {
       
return FALSE;
    }
    
if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)
    {
       
return FALSE;
    }
    
return TRUE;
}

6, OnSize()中一般用來設置視口和視錐,因為這些是和窗口大小相關的。基本操作包括設置視口,選擇投影矩陣,設置模型視圖矩陣。

void CCY457OpenGLView::OnSize(UINT nType, int cx, int cy) 
{
    CView::OnSize(nType, cx, cy);
    GLdouble aspect_ratio; 
// width/height ratio
    
    
if ( 0 >= cx || 0 >= cy )
    {
        
return;
    }
    
// select the full client area
    ::glViewport(00, cx, cy);
    
// compute the aspect ratio
    
// this will keep all dimension scales equal
    aspect_ratio = (GLdouble)cx/(GLdouble)cy;
    
// select the projection matrix and clear it
    ::glMatrixMode(GL_PROJECTION);
    ::glLoadIdentity();
    
// select the viewing volume
    ::gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);
    
    
// switch back to the modelview matrix and clear it
    ::glMatrixMode(GL_MODELVIEW);
    ::glLoadIdentity();
}

7,在繪制場景時,一般包括如下步驟:1)清空緩存。2)繪制場景。3Flush掉渲染流水線。4)若設置了雙緩沖,則交換前后臺緩沖區。

void CCY457OpenGLView::OnDraw(CDC* pDC)
{
    CCY457OpenGLDoc
* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
// Clear out the color & depth buffers
    ::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    RenderScene();
    
// Tell OpenGL to flush its pipeline
    ::glFinish();
    
// Now Swap the buffers
    ::SwapBuffers( m_pDC->GetSafeHdc() );
}
void CCY457OpenGLView::RenderScene ()
{
//第一個玩具嘛,先空著,后面慢慢填
}

8,試試改變窗口的大小,你會看到很嚴重的閃爍,并且關閉程序后會報告內存泄露,因此我們這就來解決這兩個問題吧。

發生閃爍的原因是Windows先繪制背景,然后再是OpenGL繪制,因為我們已經讓OpenGL負責清空背景色,因此我們不需要Windows去清空背景了

BOOL CCY457OpenGLView::OnEraseBkgnd(CDC* pDC) 
{
    
//Tell Windows not to erase the background
    return TRUE;
}

     內存泄露的原因是我們在SetupPixelFormat()中使用了new運算符來為CClientDC對象分配內存,因此需要顯示delete掉。

void CCY457OpenGLView::OnDestroy() 
{
    CView::OnDestroy();
    
//Make the RC non-current
    if(::wglMakeCurrent (0,0== FALSE)
    {
        MessageBox(
"Could not make RC non-current");
    }
    
    
//Delete the rendering context
    if(::wglDeleteContext (m_hRC)==FALSE)
    {
        MessageBox(
"Could not delete RC");
    }
    
//Delete the DC
    if(m_pDC)
    {
        delete m_pDC;
    }
    
//Set it to NULL
    m_pDC = NULL;
}

 

作者:洞庭散人

出處:http://phinecos.cnblogs.com/    

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接:http://www.cnblogs.com/phinecos/archive/2008/11/04/1326687.html
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久国产精品99国产| 久久综合九色综合久99| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品婷婷| 亚洲欧洲另类国产综合| 亚洲欧美日韩综合| 欧美一二三区精品| 久久久久久尹人网香蕉| 久久久久久久波多野高潮日日| 新狼窝色av性久久久久久| 亚洲免费一区二区| 久久成人精品电影| 美女91精品| 亚洲国内欧美| 亚洲欧洲在线免费| 亚洲一区二区精品在线| 校园春色综合网| 老司机aⅴ在线精品导航| 欧美精品一区二区三区蜜桃 | 国产精品高潮粉嫩av| 另类酷文…触手系列精品集v1小说| 亚洲午夜精品17c| 欧美亚洲日本一区| 亚洲欧美日韩国产综合精品二区| 亚洲欧美日韩中文播放| 久久精品国产亚洲a| 欧美在线免费播放| 麻豆精品精华液| 久久久久久久久久久久久9999| 亚洲欧美综合v| 久久久久看片| 一区二区欧美在线| 亚洲香蕉伊综合在人在线视看| 日韩视频二区| 久久亚洲高清| 欧美片在线播放| 欧美日韩岛国| 1024国产精品| 亚洲欧美日韩国产精品| 欧美激情一区二区三区在线| 亚洲国产精品999| 中国成人黄色视屏| 久久综合伊人77777尤物| 欧美国产专区| 国产精品视频久久| av成人手机在线| 亚洲一区二区三区久久| 久久精品亚洲| 91久久久久| 亚洲国产高潮在线观看| 亚洲精品美女在线观看| 奶水喷射视频一区| 久久久视频精品| 午夜精品久久久久久久| 一区二区三区不卡视频在线观看| 欧美专区第一页| 免费亚洲一区二区| 国模吧视频一区| 久久久www成人免费精品| 午夜精品影院在线观看| 影音先锋在线一区| 伊人成人在线视频| 亚洲精品国久久99热| 免费美女久久99| 日韩一区二区精品视频| 麻豆精品网站| 欧美成人午夜77777| 性欧美精品高清| 在线一区二区三区做爰视频网站| 亚洲女女女同性video| 亚洲经典三级| 美女脱光内衣内裤视频久久影院| 国模精品一区二区三区色天香| 久久超碰97人人做人人爱| 亚洲午夜视频在线| 蘑菇福利视频一区播放| 韩日午夜在线资源一区二区| 久久er99精品| 亚洲中字在线| 国产精品一区二区久久精品| 在线午夜精品自拍| 久久精品一区| 欧美在线视频观看| 韩国成人福利片在线播放| 久久久久久色| 欧美在线网站| 亚洲精一区二区三区| 欧美国产激情| 欧美涩涩网站| 欧美亚洲一区三区| 亚洲二区精品| 日韩香蕉视频| 老司机精品视频一区二区三区| 亚洲国产日韩在线| 免费在线视频一区| 欧美大片在线观看一区| 香港成人在线视频| 欧美一激情一区二区三区| 亚洲二区在线观看| 亚洲精品1234| 国产精品人成在线观看免费 | 国产精品播放| 欧美午夜电影一区| 欧美亚洲一级片| 欧美一区二区三区免费看| 亚洲精品三级| 亚洲天堂视频在线观看| 亚洲高清视频的网址| 亚洲第一中文字幕| 欧美视频官网| 久久亚洲视频| 久久久xxx| 欧美一区二区免费视频| 久久三级视频| 午夜精品短视频| 久久精品夜色噜噜亚洲aⅴ| 亚洲网站在线| 久久国产视频网| 欧美高清一区二区| 亚洲性视频网址| 欧美一区二区三区播放老司机| 亚洲欧洲日本一区二区三区| av成人毛片| 一区二区三区在线视频播放| 亚洲美女91| 最新国产の精品合集bt伙计| 亚洲一区在线免费观看| 亚洲午夜三级在线| 久久天天躁夜夜躁狠狠躁2022| 欧美一区二区三区免费观看| 蜜桃av一区二区| 一本色道久久综合亚洲精品婷婷| 欧美中文在线视频| 亚洲男人的天堂在线| 欧美大片在线观看一区| 久热精品视频在线观看| 国产亚洲激情在线| 一区二区三区视频观看| 亚洲一区在线播放| 欧美激情第4页| 亚洲乱码视频| 日韩网站免费观看| 欧美精品在线一区二区三区| 久久久99国产精品免费| 国产精品国产精品| 日韩视频永久免费观看| 影音先锋中文字幕一区二区| 亚洲制服av| 亚洲欧美自拍偷拍| 国产精品久久久久77777| 亚洲五月婷婷| 亚洲一区二区在线看| 国产精品国产三级国产普通话三级 | 久久久久久久久久看片| 国产精品一区=区| 欧美在线高清视频| 午夜一区在线| 黄色亚洲在线| 久久久人成影片一区二区三区| 欧美国产日韩一区二区三区| 国产亚洲在线观看| 久久综合网络一区二区| 欧美1区3d| 亚洲一级一区| 国产精品婷婷| 欧美 日韩 国产在线| 亚洲电影下载| 久久国产99| 国内精品久久久久久久影视蜜臀 | 国产欧美在线看| 欧美一区二区久久久| 国产精品一区二区久久久久| 亚洲男人av电影| 久久综合狠狠| 99热这里只有成人精品国产| 欧美精品在线一区二区| 亚洲无亚洲人成网站77777| 亚洲欧美日韩国产另类专区| 亚洲成在线观看| 欧美久久久久久蜜桃| 在线亚洲美日韩| 亚洲欧美在线网| 亚洲肉体裸体xxxx137| 欧美日韩一区二区三区高清| 久久精品一二三区| 亚洲人成网在线播放| 老司机凹凸av亚洲导航| 99re66热这里只有精品3直播| 国产精品一区二区在线观看网站| 久久亚洲高清| 在线成人中文字幕| 欧美日韩一区二区欧美激情| 午夜在线a亚洲v天堂网2018| 欧美 亚欧 日韩视频在线| 午夜激情一区| 亚洲三级电影在线观看 | 狠狠综合久久| 国产精品嫩草影院av蜜臀| 久久国产精品毛片| 亚洲一区二区三区精品在线观看|