Bootstrap

VC++ OpenGL 使用

---- OpenGL 程, 识。 使 Visual C 程, VC 助。 OpenGL 求。 5 行:

----1 式;2 RC3 使 RC 前;4 型;5 壶。

---- Visual C +, 目。 OpenGL 库, Build Settings LINK ( Ctrl Tab ) Object/Library Opengl32.lib glu32.lib glaux.lib, 定。 stdafx.h 行:

        include < gl/gl.h >

        include < gl/glu.h >

        include < gl/glaux.h >

----OpenGL WS_CLIPCHILDREN WS_CLIPSIBLINGS OnPreCreate 数, 型。

BOOL COPView::PreCreateWindow(CREATESTRUCT cs)

{cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);

return CView::PreCreateWindow(cs);

}

---- 式, RC 要。 BOOL SetWindowPixelFormat(HDC hDC) 示:

BOOL COPView::SetWindowPixelFormat(HDC hDC)

{

PIXELFORMATDESCRIPTOR pixelDesc;

pixelDesc.nSize   = sizeof(PIXELFORMATDESCRIP

 TOR);

pixelDesc.nVersion  = 1;

pixelDesc.dwFlags   = PFD_DRAW_TO_WINDOW |

PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL |

PFD_SUPPORT_GDI |PFD_STEREO_DONTCARE;

pixelDesc.iPixelType  = PFD_TYPE_RGBA;

pixelDesc.cColorBits = 32;

pixelDesc.cRedBits = 8;

pixelDesc.cRedShift = 16;

pixelDesc.cGreenBits = 8;

pixelDesc.cGreenShift = 8;

pixelDesc.cBlueBits = 8;

pixelDesc.cBlueShift = 0;

pixelDesc.cAlphaBits = 0;

pixelDesc.cAlphaShift = 0;

pixelDesc.cAccumBits= 64;  

pixelDesc.cAccumRedBits = 16;

pixelDesc.cAccumGreenBits = 16;

pixelDesc.cAccumBlueBits = 16;

pixelDesc.cAccumAlphaBits= 0;

pixelDesc.cDepthBits = 32;

pixelDesc.cStencilBits= 8;

pixelDesc.cAuxBuffers = 0;

pixelDesc.iLayerType= PFD_MAIN_PLANE;

pixelDesc.bReserved = 0;

pixelDesc.dwLayerMask= 0;

pixelDesc.dwVisibleMask= 0;

pixelDesc.dwDamageMask= 0;

m_GLPixelIndex = ChoosePixelFormat( hDC, pixelDesc);

if (m_GLPixelIndex==0) // Let's choose a default index.

 {

  m_GLPixelIndex = 1;    

if (DescribePixelFormat(hDC, m_GLPixelIndex, sizeof

(PIXELFORMATDESCRIPTOR), pixelDesc)==0)

 {

return FALSE;

}

}

if (SetPixelFormat( hDC, m_GLPixelIndex,

                           pixelDesc)==FALSE)

  {

  return FALSE;

  }

  return TRUE;

}

---- 中:

int m_GLPixelIndex; // protected

---- 后, ClassWizard OnCreate WM_CREATE 下:

  int COPView::OnCreate

(LPCREATESTRUCT lpCreateStruct)

{

  if (CView::OnCreate(lpCreateStruct) == 1)

  return 1;

  HWND hWnd = GetSafeHwnd();

  HDC hDC = ::GetDC(hWnd);

  if (SetWindowPixelFormat(hDC)==FALSE)

    return 0;

  if (CreateViewGLContext(hDC)==FALSE)

                        return 0;

    return 0;

     }

---- RC RC

---- CreateViewGLContext(HDC hDC) HGLRC m_hGLContext

BOOL COPView::CreateViewGLContext(HDC hDC)

{

m_hGLContext = wglCreateContext(hDC);

  if (m_hGLContext == NULL)

  {

    return FALSE;

   }

  if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)

  {

    return FALSE;

    }

    return TRUE;

}

    加 入 函 数OnDestroy 来 响 应WM_DESTROY:

void COPView::OnDestroy()

{

      if(wglGetCurrentContext()!=NULL)

                {

                wglMakeCurrent(NULL, NULL) ;

                }

                if (m_hGLContext!=NULL)

                {

                 wglDeleteContext(m_hGLContext);

                 m_hGLContext = NULL;

                }

      CView::OnDestroy();

}

---- 后, COPView 数:

COPView::COPView()

{

                 m_hGLContext = NULL;

                m_GLPixelIndex = 0;

}

---- 在, OpenGL 了, MFC 序。

---- 型, ClassWizard OnSize WM_SIZE 示:

void COPView::OnSize(UINT nType, int cx, int cy)

  {

  CView::OnSize(nType, cx, cy);

  GLsizei width, height; GLdouble aspect;

  width = cx; height = cy;

  if (cy==0)

  aspect = (GLdouble)width;

  else

  aspect = (GLdouble)width/(GLdouble)height;

  glViewport(0, 0, width, height);

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

  gluPerspective(45, aspect, 1, 10.0);

  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity();

  }

 加 入 函 数:void COPView::OnPaint()

   {

  CPaintDC dc(this); // device context for painting

  COPDoc pDoc = GetDocument();

  pDoc >RenderScene();

  }

---- RenderScene()

void COPDoc::RenderScene(void)

{ glClear(GL_COLOR_BUFFER_BIT); glFlush(); }

---- , 西。

---- GLDisplayListNames

enum GLDisplayListNames { ArmPart1ArmPart2 };

---- 用。 OnNewDocument() 下:

BOOL COPDoc::OnNewDocument()

if (!CDocument::OnNewDocument())

        return FALSE;

        glNewList(ArmPart1, GL_COMPILE);

GLfloat RedSurface[]   = { 1.0f, 0.0f, 0.0f, 1.0f};

GLfloat GreenSurface[] = { 0.0f, 1.0f, 0.0f, 1.0f};

GLfloat BlueSurface[]  = { 0.0f, 0.0f, 1.0f, 1.0f};

GLfloat LightAmbient[]  = { 0.1f, 0.1f, 0.1f, 0.1f };

GLfloat LightDiffuse[]  = { 0.7f, 0.7f, 0.7f, 0.7f };

GLfloat LightSpecular[] = { 0.0f, 0.0f, 0.0f, 0.1f };

GLfloat LightPosition[] = { 5.0f, 5.0f, 5.0f, 0.0f };

glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);

glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);

  glEnable(GL_LIGHT0);

  glMaterialfv(GL_FRONT_AND_BACK,

              GL_AMBIENT, RedSurface);

  glBegin(GL_POLYGON);

  glNormal3d(  1.0,  0.0,  0.0);

  glVertex3d(  1.0,  1.0,  1.0); glVertex3d( 

1.0, 1.0,  1.0);

  glVertex3d(  1.0, 1.0, 1.0); glVertex3d

            (  1.0,  1.0, 1.0); // 画 第 一 个 面

  glEnd();

  glBegin(GL_POLYGON);

  glNormal3d( 1.0,  0.0,  0.0);

  // 此 处 同 上 画 第 二 个 面。

     立 方 体 的 中 心 为 坐 标 原 点。

  glEnd();

  glMaterialfv(GL_FRONT_AND_BACK,

              GL_AMBIENT, GreenSurface);

  // 此 处 同 上 画 第 三、 四 个 面,

     注 意 平 面 法 向 和 坐 标。

  glMaterialfv(GL_FRONT_AND_BACK,

              GL_AMBIENT, BlueSurface);

  // 此 处 同 上 画 第 五、 六 个 面。

  glEndList();

  glNewList(ArmPart2, GL_COMPILE);

  glMaterialfv(GL_FRONT_AND_BACK,

              GL_AMBIENT, GreenSurface);

  auxSolidTeapot(1.0);// 用 辅 助 库 函 数 画 茶 壶。

  glEndList();

  return TRUE;

    }

---- 了。 RenderScene 数:

void COPDoc::RenderScene(void)

        {

 double m_angle1=60.0;   double m_angle2=30.0;

 glClear

(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

 glPushMatrix();

 glTranslated(3.0, 0.0, 8.0); glRotated( m_angle1, 0, 0, 1);

                          glRotated( m_angle2, 0, 1, 0);

 glCallList(ArmPart1);

 glPopMatrix();

 glPushMatrix();

 glTranslated(0.0, 0.0, 8.0);

 glCallList(ArmPart2);

 glPopMatrix();

         glFlush();

}

 

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;