您还没有登陆到CGPAD.COM   现在登录   注册新用户
搜索 CGPAD.COM
 
 
 
张友邦    尘世如潮人如水 只叹江湖几人回
 http://span.cgpad.com
 
 
   空间首页  生活日记  原创作品  博客文章  共享资源  新闻网摘  我的收藏  社区活动  博客留言   进入后台
 
 
Perlin Noise(柏林噪声)
查看:2436  |  下载:806  |  评论:2  |  创建:2008-05-02 13:34:50
 
 

#include <windows.h>  // Header File For Windows
#include <gl\gl.h>   // Header File For The OpenGL32 Library
#include <gl\glu.h>   // Header File For The GLu32 Library
#include <gl\glaux.h>  // Header File For The Glaux Library
#include <stdio.h>
#include <olectl.h>             
#include <math.h>

HDC   hDC=NULL;  // Private GDI Device Context
HGLRC  hRC=NULL;  // Permanent Rendering Context
HWND  hWnd=NULL;  // Holds Our Window Handle
HINSTANCE hInstance;  // Holds The Instance Of The Application

bool keys[256];   // Array Used For The Keyboard Routine
bool active=TRUE;  // Window Active Flag Set To TRUE By Default
bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default

char* brand=NULL;  //显卡型号
char* vendor=NULL;  //显卡制造商
char* version=NULL;  //版本号

int fps(72);   //帧数


/////////////////////////////////////////////////////////////
// Perlin Noise Generator
/////////////////////////////////////////////////////////////
float persistence = 0.55f;
int Number_Of_Octaves = 3;


//一个噪声发生器
float Noise1(int x, int y)
{
  int n = x + y * 57;
  n = (n<<13) ^ n;
  return ( 1.0f - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0f);
}

//一个光滑噪声发生器
float SmoothNoise_1(int x, int y)
{
    float corners = ( Noise1(x-1, y-1)+Noise1(x+1, y-1)+Noise1(x-1, y+1)+Noise1(x+1, y+1) ) / 16.0f;
    float sides   = ( Noise1(x-1, y)  +Noise1(x+1, y)  +Noise1(x, y-1)  +Noise1(x, y+1) ) /  8.0f;
    float center  =  Noise1(x, y) / 4.0f;
    return corners + sides + center;
}

//插值函数
float Cosine_Interpolate(float a, float b, float x)
{
 double ft = x * 3.1415927;
 double f = (1 - cos(ft)) * 0.5f;

 return  a*(1-f) + b*f;

}

 

//插值噪声发生器
float InterpolatedNoise_1(float x, float y)
{

      int integer_X    = int(x);
      float fractional_X = x - integer_X;

      int integer_Y    = int(y);
      float fractional_Y = y - integer_Y;

      float v1 = SmoothNoise_1(integer_X,     integer_Y);
      float v2 = SmoothNoise_1(integer_X + 1, integer_Y);
      float v3 = SmoothNoise_1(integer_X,     integer_Y + 1);
      float v4 = SmoothNoise_1(integer_X + 1, integer_Y + 1);

      float i1 = Cosine_Interpolate(v1 , v2 , fractional_X);
      float i2 = Cosine_Interpolate(v3 , v4 , fractional_X);

      return Cosine_Interpolate(i1 , i2 , fractional_Y);
}

//最终的PERLIN NOISE
 float PerlinNoise_2D(float x, float y)
 {
      float total = 0.0f;
      float p = persistence;
      int n = Number_Of_Octaves - 1;

      for(int i=0;i<=n;i++)
   {
          float frequency = pow((float)2,i);
          float amplitude = pow(p,i);

          total = total + InterpolatedNoise_1(x * frequency, y * frequency) * amplitude;
      }

      return total;
 }

 

 

 


///////////////// 创建纹理 //////////////////////////////////

BOOL BuildTexture(char *szPathName, GLuint &texid)
{
  HDC      hdcTemp;                        // The DC To Hold Our Bitmap
  HBITMAP    hbmpTemp;                        // Holds The Bitmap Temporarily
  IPicture  *pPicture;                        // IPicture Interface
  OLECHAR    wszPath[MAX_PATH+1];                  // Full Path To Picture (WCHAR)
  char    szPath[MAX_PATH+1];                    // Full Path To Picture
  long    lWidth;                          // Width In Logical Units
  long    lHeight;                        // Height In Logical Units
  long    lWidthPixels;                      // Width In Pixels
  long    lHeightPixels;                      // Height In Pixels
  GLint    glMaxTexDim ;                      // Holds Maximum Texture Size

  if (strstr(szPathName, "http://"))                  // If PathName Contains http:// Then...
  {
    strcpy(szPath, szPathName);                    // Append The PathName To szPath
  }
  else                                // Otherwise... We Are Loading From A File
  {
    GetCurrentDirectory(MAX_PATH, szPath);              // Get Our Working Directory
    strcat(szPath, "\\");                      // Append "\" After The Working Directory
    strcat(szPath, szPathName);                    // Append The PathName
  }

  MultiByteToWideChar(CP_ACP, 0, szPath, -1, wszPath, MAX_PATH);    // Convert From ASCII To Unicode
  HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void**)&pPicture);

  if(FAILED(hr))                            // If Loading Failed
    return FALSE;                          // Return False

  hdcTemp = CreateCompatibleDC(GetDC(0));                // Create The Windows Compatible Device Context
  if(!hdcTemp)                            // Did Creation Fail?
  {
    pPicture->Release();                      // Decrements IPicture Reference Count
    return FALSE;                          // Return False (Failure)
  }

  glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);          // Get Maximum Texture Size Supported
 
  pPicture->get_Width(&lWidth);                    // Get IPicture Width (Convert To Pixels)
  lWidthPixels  = MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540);
  pPicture->get_Height(&lHeight);                    // Get IPicture Height (Convert To Pixels)
  lHeightPixels  = MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540);

  // Resize Image To Closest Power Of Two
  if (lWidthPixels <= glMaxTexDim) // Is Image Width Less Than Or Equal To Cards Limit
    lWidthPixels = 1 << (int)floor((log((double)lWidthPixels)/log(2.0f)) + 0.5f);
  else // Otherwise Set Width To "Max Power Of Two" That The Card Can Handle
    lWidthPixels = glMaxTexDim;
 
  if (lHeightPixels <= glMaxTexDim) // Is Image Height Greater Than Cards Limit
    lHeightPixels = 1 << (int)floor((log((double)lHeightPixels)/log(2.0f)) + 0.5f);
  else // Otherwise Set Height To "Max Power Of Two" That The Card Can Handle
    lHeightPixels = glMaxTexDim;
 
  //  Create A Temporary Bitmap
  BITMAPINFO  bi = {0};                        // The Type Of Bitmap We Request
  DWORD    *pBits = 0;                        // Pointer To The Bitmap Bits

  bi.bmiHeader.biSize      = sizeof(BITMAPINFOHEADER);        // Set Structure Size
  bi.bmiHeader.biBitCount    = 32;                  // 32 Bit
  bi.bmiHeader.biWidth    = lWidthPixels;              // Power Of Two Width
  bi.bmiHeader.biHeight    = lHeightPixels;            // Make Image Top Up (Positive Y-Axis)
  bi.bmiHeader.biCompression  = BI_RGB;                // RGB Encoding
  bi.bmiHeader.biPlanes    = 1;                  // 1 Bitplane

  //  Creating A Bitmap This Way Allows Us To Specify Color Depth And Gives Us Imediate Access To The Bits
  hbmpTemp = CreateDIBSection(hdcTemp, &bi, DIB_RGB_COLORS, (void**)&pBits, 0, 0);
 
  if(!hbmpTemp)                            // Did Creation Fail?
  {
    DeleteDC(hdcTemp);                        // Delete The Device Context
    pPicture->Release();                      // Decrements IPicture Reference Count
    return FALSE;                          // Return False (Failure)
  }

  SelectObject(hdcTemp, hbmpTemp);                  // Select Handle To Our Temp DC And Our Temp Bitmap Object

  // Render The IPicture On To The Bitmap
  pPicture->Render(hdcTemp, 0, 0, lWidthPixels, lHeightPixels, 0, lHeight, lWidth, -lHeight, 0);

  // Convert From BGR To RGB Format And Add An Alpha Value Of 255
  for(long i = 0; i < lWidthPixels * lHeightPixels; i++)        // Loop Through All Of The Pixels
  {
    BYTE* pPixel  = (BYTE*)(&pBits[i]);              // Grab The Current Pixel
    BYTE temp    = pPixel[0];                  // Store 1st Color In Temp Variable (Blue)
    pPixel[0]    = pPixel[2];                  // Move Red Value To Correct Position (1st)
    pPixel[2]    = temp;                      // Move Temp Value To Correct Blue Position (3rd)

    // This Will Make Any Black Pixels, Completely Transparent    (You Can Hardcode The Value If You Wish)
    if ((pPixel[0]==0) && (pPixel[1]==0) && (pPixel[2]==0))      // Is Pixel Completely Black
      pPixel[3]  = 0;                      // Set The Alpha Value To 0
    else                              // Otherwise
      pPixel[3]  = 255;                      // Set The Alpha Value To 255
  }

  glGenTextures(1, &texid);                      // Create The Texture

  // Typical Texture Generation Using Data From The Bitmap
  glBindTexture(GL_TEXTURE_2D, texid);                // Bind To The Texture ID
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);    // (Modify This For The Type Of Filtering You Want)
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // (Modify This For The Type Of Filtering You Want)
  gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, lWidthPixels, lHeightPixels, GL_RGBA, GL_UNSIGNED_BYTE, pBits);
  //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lWidthPixels, lHeightPixels, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBits);  // (Modify This If You Want Mipmaps)
 
  DeleteObject(hbmpTemp);                        // Delete The Object
  DeleteDC(hdcTemp);                          // Delete The Device Context

  pPicture->Release();                        // Decrements IPicture Reference Count

  return TRUE;                            // Return True (All Good)
}


///////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// Font Begin /////////////////////////////////////////////

GLuint base;    // Base Display List For The Font Set

GLvoid BuildFont(GLvoid)        // Build Our Bitmap Font
{
 HFONT font;          // Windows Font ID
 HFONT oldfont;         // Used For Good House Keeping

 base = glGenLists(96);        // Storage For 96 Characters

 font = CreateFont( -10,       // Height Of Font
      0,        // Width Of Font
      0,        // Angle Of Escapement
      0,        // Orientation Angle
      FW_BOLD,      // Font Weight
      FALSE,       // Italic
      FALSE,       // Underline
      FALSE,       // Strikeout
      ANSI_CHARSET,     // Character Set Identifier
      OUT_TT_PRECIS,     // Output Precision
      CLIP_DEFAULT_PRECIS,   // Clipping Precision
      ANTIALIASED_QUALITY,   // Output Quality
      FF_DONTCARE|DEFAULT_PITCH,  // Family And Pitch
      "Arial");     // Font Name

 oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
 wglUseFontBitmaps(hDC, 32, 96, base);    // Builds 96 Characters Starting At Character 32
 SelectObject(hDC, oldfont);       // Selects The Font We Want
 DeleteObject(font);         // Delete The Font
}

GLvoid KillFont(GLvoid)         // Delete The Font List
{
 glDeleteLists(base, 96);       // Delete All 96 Characters
}

GLvoid glPrint(const char *fmt, ...)     // Custom GL "Print" Routine
{
 char  text[256];        // Holds Our String
 va_list  ap;          // Pointer To List Of Arguments

 if (fmt == NULL)         // If There's No Text
  return;           // Do Nothing

 va_start(ap, fmt);         // Parses The String For Variables
     vsprintf(text, fmt, ap);      // And Converts Symbols To Actual Numbers
 va_end(ap);           // Results Are Stored In Text

 glPushAttrib(GL_LIST_BIT);       // Pushes The Display List Bits
 glListBase(base - 32);        // Sets The Base Character to 32
 glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text
 glPopAttrib();          // Pops The Display List Bits
}


///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// Font End ////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// 精准的计时器 ////////////////////////////////////////
float GetTime()
{
  static bool init = false;
  static bool hires = false;
  static __int64 freq = 1;
  if(!init)
  {
    hires = !QueryPerformanceFrequency((LARGE_INTEGER *)&freq);
    if(!hires)
      freq = 1000;
    init = true;
  }

  __int64 now;

  if(hires)
    QueryPerformanceCounter((LARGE_INTEGER *)&now);
  else
    now = GetTickCount();

  return (float)((double)now / (double)freq);
}

float last_time(0.0f);
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// 精准的计时器结束 ////////////////////////////////////


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)  // Resize And Initialize The GL Window
{
 if (height==0)          // Prevent A Divide By Zero By
 {
  height=1;          // Making Height Equal One
 }

 glViewport(0,0,width,height);      // Reset The Current Viewport

 glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix
 glLoadIdentity();         // Reset The Projection Matrix

 // Calculate The Aspect Ratio Of The Window
 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,1.0f,3000.0f);

 glMatrixMode(GL_MODELVIEW);       // Select The Modelview Matrix
 glLoadIdentity();         // Reset The Modelview Matrix
}


int InitGL(GLvoid)          // All Setup For OpenGL Goes Here
{
 glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
 glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
 glClearDepth(1.0f);         // Depth Buffer Setup
 glEnable(GL_DEPTH_TEST);       // Enables Depth Testing
 glDepthFunc(GL_LEQUAL);                               // The Type Of Depth Testing To Do
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
 
 //得到显卡信息
 brand=(char*)glGetString(GL_RENDERER);
    vendor=(char*)glGetString(GL_VENDOR);
 version=(char*)glGetString(GL_VERSION);

 BuildFont();  //建立字体
 

 return TRUE;          // Initialization Went OK
}


void ViewOrtho()       // Set Up An Ortho View
{
 glMatrixMode(GL_PROJECTION);     // Select Projection
 glPushMatrix();       // Push The Matrix
 glLoadIdentity();      // Reset The Matrix
 glOrtho( 0, 640 , 480 , 0, -3, 3 );    // Select Ortho Mode (640x480)
 glMatrixMode(GL_MODELVIEW);     // Select Modelview Matrix
 glPushMatrix();       // Push The Matrix
 glLoadIdentity();      // Reset The Matrix
}

void ViewPerspective()       // Set Up A Perspective View
{
 glMatrixMode( GL_PROJECTION );     // Select Projection
 glPopMatrix();       // Pop The Matrix
 glMatrixMode( GL_MODELVIEW );     // Select Modelview
 glPopMatrix();       // Pop The Matrix
}

int DrawGLScene(GLvoid)         // Here's Where We Do All The Drawing
{
 //计算 FPS
 static int counter=0;
 if(GetTime()-last_time>=1.0f)
 {
  fps=counter;
  counter=0;
  last_time=GetTime();
 }
 counter++;
 
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
 glLoadIdentity();         // Reset The Current Modelview Matrix
 
 //////// Draw Scene /////////////////////
 
 ViewOrtho();
 static float startx=0.0f;
 static float starty=0.0f;

 glColor3f(1.0f, 1.0f, 0.0f);
 glRecti(250, 170, 390, 310);

 for(int x=256;x<=256+128;x++)
  for(int y=176;y<=176+128;y++)
  {
   float color = PerlinNoise_2D(startx+x/10.0f, starty+y/10.0f);
   color = color / 2 + 0.5f;
   glColor3f(color, color, color);
   glBegin(GL_POINTS);
    glVertex2i(x, y);
   glEnd();
  }

 startx+=0.1f;
 starty+=0.1f;
 
 ViewPerspective();

 

 //////// Draw Text //////////////////////
 
 glDisable(GL_TEXTURE_2D);
 glDisable(GL_DEPTH_TEST);
 glTranslatef(0.0f,0.0f,-1.0f);      // Move One Unit Into The Screen
 glColor3f(1.0f, 1.0f, 1.0f);
 glRasterPos2f(-0.52f, 0.36f);
  glPrint("Perlin Noise by Azure (www.azure.com.cn)");
 
 glRasterPos2f(-0.52f, -0.30f);
 glPrint("Renderer:%s", brand);
 glRasterPos2f(-0.52f, -0.33f);
 glPrint("Vendor:%s", vendor);
 glRasterPos2f(-0.52f, -0.36f);
 glPrint("Version:%s", version);

 glRasterPos2f(0.38f, -0.37f);
 glPrint("FPS:%d", fps);

 glRasterPos2f(-0.52f, 0.33f);
    glColor3f(1.0f,1.0f,1.0f);

 glEnable(GL_DEPTH_TEST);
 //////// Draw Text End //////////////////
 
 
 
 
 
 
 
 return TRUE;          // Everything Went OK
}

GLvoid KillGLWindow(GLvoid)        // Properly Kill The Window
{
 

 KillFont();   //删除字体
 if (fullscreen)          // Are We In Fullscreen Mode?
 {
  ChangeDisplaySettings(NULL,0);     // If So Switch Back To The Desktop
  ShowCursor(TRUE);        // Show Mouse Pointer
 }

 if (hRC)           // Do We Have A Rendering Context?
 {
  if (!wglMakeCurrent(NULL,NULL))     // Are We Able To Release The DC And RC Contexts?
  {
   MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  }

  if (!wglDeleteContext(hRC))      // Are We Able To Delete The RC?
  {
   MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  }
  hRC=NULL;          // Set RC To NULL
 }

 if (hDC && !ReleaseDC(hWnd,hDC))     // Are We Able To Release The DC
 {
  MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  hDC=NULL;          // Set DC To NULL
 }

 if (hWnd && !DestroyWindow(hWnd))     // Are We Able To Destroy The Window?
 {
  MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  hWnd=NULL;          // Set hWnd To NULL
 }

 if (!UnregisterClass("OpenGL",hInstance))   // Are We Able To Unregister Class
 {
  MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  hInstance=NULL;         // Set hInstance To NULL
 }
}

/* This Code Creates Our OpenGL Window.  Parameters Are:     *
 * title   - Title To Appear At The Top Of The Window    *
 * width   - Width Of The GL Window Or Fullscreen Mode    *
 * height   - Height Of The GL Window Or Fullscreen Mode   *
 * bits   - Number Of Bits To Use For Color (8/16/24/32)   *
 * fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
 
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
 GLuint  PixelFormat;   // Holds The Results After Searching For A Match
 WNDCLASS wc;      // Windows Class Structure
 DWORD  dwExStyle;    // Window Extended Style
 DWORD  dwStyle;    // Window Style
 RECT  WindowRect;    // Grabs Rectangle Upper Left / Lower Right Values
 WindowRect.left=(long)0;   // Set Left Value To 0
 WindowRect.right=(long)width;  // Set Right Value To Requested Width
 WindowRect.top=(long)0;    // Set Top Value To 0
 WindowRect.bottom=(long)height;  // Set Bottom Value To Requested Height

 fullscreen=fullscreenflag;   // Set The Global Fullscreen Flag

 hInstance   = GetModuleHandle(NULL);    // Grab An Instance For Our Window
 wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window.
 wc.lpfnWndProc  = (WNDPROC) WndProc;     // WndProc Handles Messages
 wc.cbClsExtra  = 0;         // No Extra Window Data
 wc.cbWndExtra  = 0;         // No Extra Window Data
 wc.hInstance  = hInstance;       // Set The Instance
 wc.hIcon   = LoadIcon(NULL, IDI_WINLOGO);   // Load The Default Icon
 wc.hCursor   = LoadCursor(NULL, IDC_ARROW);   // Load The Arrow Pointer
 wc.hbrBackground = NULL;         // No Background Required For GL
 wc.lpszMenuName  = NULL;         // We Don't Want A Menu
 wc.lpszClassName = "OpenGL";        // Set The Class Name

 if (!RegisterClass(&wc))         // Attempt To Register The Window Class
 {
  MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;           // Return FALSE
 }
 
 if (fullscreen)            // Attempt Fullscreen Mode?
 {
  DEVMODE dmScreenSettings;        // Device Mode
  memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
  dmScreenSettings.dmSize=sizeof(dmScreenSettings);  // Size Of The Devmode Structure
  dmScreenSettings.dmPelsWidth = width;    // Selected Screen Width
  dmScreenSettings.dmPelsHeight = height;    // Selected Screen Height
  dmScreenSettings.dmBitsPerPel = bits;     // Selected Bits Per Pixel
  dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

  // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
  if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
  {
   // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
   if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
   {
    fullscreen=FALSE;  // Windowed Mode Selected.  Fullscreen = FALSE
   }
   else
   {
    // Pop Up A Message Box Letting User Know The Program Is Closing.
    MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
    return FALSE;         // Return FALSE
   }
  }
 }

 if (fullscreen)            // Are We Still In Fullscreen Mode?
 {
  dwExStyle=WS_EX_APPWINDOW;        // Window Extended Style
  dwStyle=WS_POPUP;          // Windows Style
  ShowCursor(FALSE);          // Hide Mouse Pointer
 }
 else
 {
  dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // Window Extended Style
  dwStyle=WS_OVERLAPPEDWINDOW;       // Windows Style
 }

 AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);  // Adjust Window To True Requested Size

 // Create The Window
 if (!(hWnd=CreateWindowEx( dwExStyle,       // Extended Style For The Window
        "OpenGL",       // Class Name
        title,        // Window Title
        dwStyle |       // Defined Window Style
        WS_CLIPSIBLINGS |     // Required Window Style
        WS_CLIPCHILDREN,     // Required Window Style
        0, 0,        // Window Position
        WindowRect.right-WindowRect.left, // Calculate Window Width
        WindowRect.bottom-WindowRect.top, // Calculate Window Height
        NULL,        // No Parent Window
        NULL,        // No Menu
        hInstance,       // Instance
        NULL)))        // Dont Pass Anything To WM_CREATE
 {
  KillGLWindow();        // Reset The Display
  MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;        // Return FALSE
 }

 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
  bits,          // 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) 
  0,           // No Stencil Buffer
  0,           // No Auxiliary Buffer
  PFD_MAIN_PLANE,        // Main Drawing Layer
  0,           // Reserved
  0, 0, 0          // Layer Masks Ignored
 };
 
 if (!(hDC=GetDC(hWnd)))       // Did We Get A Device Context?
 {
  KillGLWindow();        // Reset The Display
  MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;        // Return FALSE
 }

 if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
 {
  KillGLWindow();        // Reset The Display
  MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;        // Return FALSE
 }

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

 if (!(hRC=wglCreateContext(hDC)))    // Are We Able To Get A Rendering Context?
 {
  KillGLWindow();        // Reset The Display
  MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;        // Return FALSE
 }

 if(!wglMakeCurrent(hDC,hRC))     // Try To Activate The Rendering Context
 {
  KillGLWindow();        // Reset The Display
  MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;        // Return FALSE
 }

 ShowWindow(hWnd,SW_SHOW);      // Show The Window
 SetForegroundWindow(hWnd);      // Slightly Higher Priority
 SetFocus(hWnd);         // Sets Keyboard Focus To The Window
 ReSizeGLScene(width, height);     // Set Up Our Perspective GL Screen

 if (!InitGL())         // Initialize Our Newly Created GL Window
 {
  KillGLWindow();        // Reset The Display
  MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;        // Return FALSE
 }

 return TRUE;         // Success
}

LRESULT CALLBACK WndProc( HWND hWnd,   // Handle For This Window
       UINT uMsg,   // Message For This Window
       WPARAM wParam,   // Additional Message Information
       LPARAM lParam)   // Additional Message Information
{
 switch (uMsg)         // Check For Windows Messages
 {
  case WM_ACTIVATE:       // Watch For Window Activate Message
  {
   if (!HIWORD(wParam))     // Check Minimization State
   {
    active=TRUE;      // Program Is Active
   }
   else
   {
    active=FALSE;      // Program Is No Longer Active
   }

   return 0;        // Return To The Message Loop
  }

  case WM_SYSCOMMAND:       // Intercept System Commands
  {
   switch (wParam)       // Check System Calls
   {
    case SC_SCREENSAVE:     // Screensaver Trying To Start?
    case SC_MONITORPOWER:    // Monitor Trying To Enter Powersave?
    return 0;       // Prevent From Happening
   }
   break;         // Exit
  }

  case WM_CLOSE:        // Did We Receive A Close Message?
  {
   PostQuitMessage(0);      // Send A Quit Message
   return 0;        // Jump Back
  }

  case WM_KEYDOWN:       // Is A Key Being Held Down?
  {
   keys[wParam] = TRUE;     // If So, Mark It As TRUE
   return 0;        // Jump Back
  }

  case WM_KEYUP:        // Has A Key Been Released?
  {
   keys[wParam] = FALSE;     // If So, Mark It As FALSE
   return 0;        // Jump Back
  }

  case WM_SIZE:        // Resize The OpenGL Window
  {
   ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
   return 0;        // Jump Back
  }
 }

 // Pass All Unhandled Messages To DefWindowProc
 return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain( HINSTANCE hInstance,   // Instance
     HINSTANCE hPrevInstance,  // Previous Instance
     LPSTR  lpCmdLine,   // Command Line Parameters
     int   nCmdShow)   // Window Show State
{
 MSG  msg;         // Windows Message Structure
 BOOL done=FALSE;        // Bool Variable To Exit Loop

 // Ask The User Which Screen Mode They Prefer
// if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
// {
//  fullscreen=FALSE;       // Windowed Mode
// }

 fullscreen = TRUE;
 // Create Our OpenGL Window
 if (!CreateGLWindow("www.azure.com.cn",640,480,32,fullscreen))
 {
  return 0;         // Quit If Window Was Not Created
 }

 while(!done)         // Loop That Runs While done=FALSE
 {
  if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
  {
   if (msg.message==WM_QUIT)    // Have We Received A Quit Message?
   {
    done=TRUE;       // If So done=TRUE
   }
   else         // If Not, Deal With Window Messages
   {
    TranslateMessage(&msg);    // Translate The Message
    DispatchMessage(&msg);    // Dispatch The Message
   }
  }
  else          // If There Are No Messages
  {
   // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
   if (active)        // Program Active?
   {
    if (keys[VK_ESCAPE])    // Was ESC Pressed?
    {
     done=TRUE;      // ESC Signalled A Quit
    }
    else        // Not Time To Quit, Update Screen
    {
     DrawGLScene();     // Draw The Scene
     SwapBuffers(hDC);    // Swap Buffers (Double Buffering)
    }
   }

  }
 }

 // Shutdown
 KillGLWindow();         // Kill The Window
 return (msg.wParam);       // Exit The Program
}

 
 
 下载次数 文件大小 56K下载 512K下载 1M下载
 806次 57.51 KB 小于2秒 小于1秒 小于1秒
所有资源只对本网注册用户开放,新注册账号,2天以后才能下载资源。
 
登陆到CGPAD.COM
登陆ID: 
密码: 
验证码: 
  
     
 
注册新用户 | 找回密码
 
最近下载
tonygwj (MR.J) @ 2009-07-28 13:39:43
cyidea (cyidea) @ 2009-02-16 20:14:58
weilaishijie (未来世界) @ 2009-01-14 16:10:45
feagle (清风) @ 2008-12-01 22:56:33
 
栏目搜索
 
工具软件
  Win Rar 3.70 [官方下载]
  Adobe PDF Reader [官方下载]
热门下载
最新上传
 
对本文的评论  <<上一页 1 下一页>>   

 jerrykong (jerry)
 注册: 2008-11-14
 积分: 0 分
 等级: 等级修炼中
 您的签名信息

 
2008-11-14 17:38:07

楼主发的全是好东西啊



 

 cc2009 (cc)
 注册: 2009-02-18
 积分: 0 分
 等级: 等级修炼中
 cc

 
2009-02-18 22:07:25

能不能做波浪的分形模拟呢?多谢



 
 <<上一页 1 下一页>>   
 
 
版权所有 © 2005-2008 CGPAD.COM,湘ICP备07500998号,兼容浏览器:IE6IE7FireFoxOperaSafariChrome
Total Requests: 5271222, Total Visits: 3081994, Processing Time: 59ms,