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

Shuffy

不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

源代碼下載:OpenGL_ch2.rar 

WGL – Windows OpenGL擴(kuò)展層

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.

設(shè)備上下文

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.

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

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.

第一個(gè)基于MFCOpenGL應(yīng)用程

開(kāi)發(fā)環(huán)境:VC6.0

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

2, 創(chuàng)建一個(gè)MFC SDI應(yīng)用程序,在項(xiàng)目屬性中加入所需要鏈接的庫(kù)文件

1, stdafx.h中加入下列語(yǔ)句:

//OpenGL Headers

#include 
<gl/gl.h>

#include 
<gl/glu.h>

#include 
<gl/glut.h>

#include 
<gl/glaux.h>

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

3,在窗口創(chuàng)建之前我們必須設(shè)置窗口風(fēng)格包含WS_CLIPCHILDREN WS_CLIPSIBLINGS,從而避免OpenGL繪制到其他窗口中去。這些應(yīng)該放在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中加入如下語(yǔ)句:

    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中我們將通過(guò)建立像素格式和繪制上下文來(lái)初始化OpenGL. InitializeOpenGL()中會(huì)創(chuàng)建一個(gè)設(shè)備上下文(DC),為這個(gè)DC選擇一個(gè)像素格式,創(chuàng)建和這個(gè)DC相關(guān)的繪制上下文(RC,然后選擇這個(gè)RC.這個(gè)函數(shù)會(huì)調(diào)用SetupPixelFormat()來(lái)建立像素格式。

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()中一般用來(lái)設(shè)置視口和視錐,因?yàn)檫@些是和窗口大小相關(guān)的。基本操作包括設(shè)置視口,選擇投影矩陣,設(shè)置模型視圖矩陣。

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,在繪制場(chǎng)景時(shí),一般包括如下步驟:1)清空緩存。2)繪制場(chǎng)景。3Flush掉渲染流水線。4)若設(shè)置了雙緩沖,則交換前后臺(tái)緩沖區(qū)。

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 ()
{
//第一個(gè)玩具嘛,先空著,后面慢慢填
}

8,試試改變窗口的大小,你會(huì)看到很嚴(yán)重的閃爍,并且關(guān)閉程序后會(huì)報(bào)告內(nèi)存泄露,因此我們這就來(lái)解決這兩個(gè)問(wèn)題吧。

發(fā)生閃爍的原因是Windows先繪制背景,然后再是OpenGL繪制,因?yàn)槲覀円呀?jīng)讓OpenGL負(fù)責(zé)清空背景色,因此我們不需要Windows去清空背景了

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

     內(nèi)存泄露的原因是我們?cè)?/span>SetupPixelFormat()中使用了new運(yùn)算符來(lái)為CClientDC對(duì)象分配內(nèi)存,因此需要顯示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/    

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
原文鏈接: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>
            久久精品国产2020观看福利| 狠色狠色综合久久| 国产女优一区| 久久裸体艺术| 久久九九国产精品| 久久最新视频| 国产精品一区二区三区免费观看| 欧美jizz19性欧美| 欧美大片一区| 午夜在线观看免费一区| 在线视频精品一| 亚洲精品国产精品久久清纯直播| 久久久久久久激情视频| 在线观看成人网| 久久综合色播五月| 在线视频国产日韩| 欧美成年人视频网站| 狂野欧美一区| 亚洲国产日韩欧美在线99| 国产伦精品一区二区三区高清版| 久久久久久综合| 性伦欧美刺激片在线观看| 亚洲欧美日韩国产另类专区| 久久国产精品99国产| 免费欧美高清视频| 国产精品视区| 亚洲精品一二区| 亚洲资源av| 久久综合给合久久狠狠色| 亚洲精品免费在线观看| 日韩午夜剧场| 久久综合给合| 国产精品欧美日韩| 日韩网站在线观看| 欧美日韩一区二区三区四区在线观看| 免费视频一区| 欧美三级视频| 黄网站免费久久| 亚洲综合精品自拍| 欧美二区在线看| 亚洲欧美一区二区激情| 欧美日韩1234| 国产亚洲永久域名| 亚洲在线不卡| 亚洲精品欧美精品| 久热re这里精品视频在线6| 国产精品亚洲一区二区三区在线| 亚洲欧洲精品一区| 美日韩精品免费| 欧美一区二区三区四区在线观看 | 欧美视频在线一区二区三区| 国产一区二三区| 亚洲制服av| 亚洲高清视频在线观看| 久久久另类综合| 国产日韩精品在线播放| 亚洲一区国产| 欧美成人精品在线| 午夜亚洲性色福利视频| 欧美巨乳在线观看| 国产亚洲一区二区在线观看| 亚洲午夜精品| 中日韩男男gay无套 | 国产精品v欧美精品v日韩精品| 一本一本久久| 国产欧美一区二区三区沐欲| 伊人久久久大香线蕉综合直播| 欧美一区二区视频97| 一区二区三区高清不卡| 欧美日韩国产高清| 亚洲福利视频一区二区| 免费欧美日韩| 欧美成人a视频| 亚洲欧洲一区二区天堂久久| 葵司免费一区二区三区四区五区| 久久精品在这里| 亚洲国产免费看| 亚洲精品中文字幕女同| 国产精品ⅴa在线观看h| 欧美在线视频免费观看| 亚洲黄色有码视频| 欧美xxx成人| 亚洲一级黄色| 香港久久久电影| 亚洲国产精品传媒在线观看| 蜜月aⅴ免费一区二区三区 | 亚洲国产一区二区a毛片| 欧美激情a∨在线视频播放| 一本久久综合亚洲鲁鲁| 亚洲一区二区黄| 一区二区三区自拍| 男人插女人欧美| 欧美激情影音先锋| 一本色道久久精品| 99精品视频免费观看视频| 国产午夜精品美女视频明星a级 | 亚洲欧洲日韩在线| 国产精品成人va在线观看| 欧美一区二区高清| 久久一区中文字幕| 亚洲欧美制服另类日韩| 看欧美日韩国产| 亚洲综合色网站| 老司机免费视频久久| 亚洲综合精品一区二区| 欧美大色视频| 裸体素人女欧美日韩| 欧美午夜片在线观看| 欧美在线一二三区| 欧美精品久久一区二区| 午夜激情综合网| 麻豆国产精品va在线观看不卡| 亚洲视频自拍偷拍| 销魂美女一区二区三区视频在线| 亚洲国产成人91精品| 亚洲午夜久久久久久久久电影网| 韩国自拍一区| 宅男噜噜噜66一区二区| 亚洲精品日本| 欧美一区二区高清在线观看| 99热这里只有成人精品国产| 久久久噜噜噜久久中文字免| 亚洲欧美卡通另类91av | 麻豆精品在线播放| 日韩写真在线| 免费成人在线观看视频| 久久久久中文| 日韩一级精品| 国产性天天综合网| 一本大道久久a久久精品综合| 亚洲国产综合在线看不卡| 欧美国产综合| 久久亚洲精品一区二区| 欧美日韩精品是欧美日韩精品| 久久亚洲不卡| 韩国三级电影一区二区| 欧美一区亚洲| 久久国产精品一区二区三区四区| 欧美日韩综合在线| 日韩手机在线导航| 亚洲欧洲日韩女同| 麻豆成人在线播放| 亚洲第一二三四五区| 亚洲狠狠婷婷| 男人插女人欧美| 91久久夜色精品国产九色| 亚洲人久久久| 欧美成人免费观看| 亚洲国产精品一区二区第四页av| 在线高清一区| 欧美a级大片| 亚洲国产清纯| 日韩一区二区久久| 欧美激情一区二区三区| 亚洲人成7777| 亚洲欧美春色| 国产老女人精品毛片久久| 欧美亚洲综合网| 在线一区日本视频| 欧美在线免费视屏| 在线精品一区二区| 欧美交受高潮1| 一区二区三区日韩在线观看| 亚洲一区成人| 一色屋精品视频在线看| 欧美理论电影在线观看| 亚洲一区二区三| 久久久久久久久久久成人| 怡红院精品视频| 欧美理论片在线观看| 亚洲免费在线视频一区 二区| 久久天堂国产精品| 9久草视频在线视频精品| 欧美视频一区二| 久久精品九九| 99精品视频一区| 久久视频精品在线| 99国产精品一区| 国产精品免费在线| 免费亚洲一区二区| 午夜精品美女自拍福到在线| 模特精品在线| 亚洲精品美女在线观看| 亚洲国产日韩欧美在线图片 | 亚洲大片av| 在线视频欧美一区| 好吊妞这里只有精品| 欧美精品一区在线发布| 欧美一区二区日韩| 99精品欧美一区二区三区综合在线| 久久精品一区二区三区四区 | 91久久精品网| 先锋资源久久| 亚洲欧洲一区二区天堂久久 | 欧美久久久久久久| 久久国产精品高清| 这里只有精品视频在线| 亚洲国产另类 国产精品国产免费| 欧美亚洲一区二区在线观看| 亚洲免费久久|