如何编写OpenGL程序

                                                  如何编写OpenGL程序

    OpenGL是一个三维图形库,在程序中用它实时生成三维造型或三维动画是很方便的。
    YC++编译器是可以编译并链接OpenGL库的, YC++默认的头文件yca.h不包含OpenGL库,
因此需要在程序开始处使用YC++的新语法:

auto("opengl32.dll")
{
     #include        "gl.h"
};

auto("glu32.dll")
{
     #include        "glu.h"
};

   来指定OpenGL动态库和包含其相关的头文件。


/*****************************************************************************************************************/
下面这个例子的用法是:

将下列代码存入名字任取的文件, 如: gl.cpp
在yc++中, 用 <文件 打开或创建cpp源程序> 调入gl.cpp, 再用 <工具 执行> 运行gl.cpp
   或在dos中, 用 ycc gl.cpp 生成 gl.exe, 再运行gl.exe
在vc++中, 用 cl gl.cpp 生成 gl.exe, 再运行gl.exe

/*****************************************************************************************************************/

#ifdef YCC
auto("opengl32.dll")
{
     #include        "gl.h"
};

auto("glu32.dll")
{
     #include        "glu.h"
};
#else
#include       
extern "C"
{
#include        "include/gl.h"
#include        "include/glu.h"
#include        "include/ycapi.h"
}
#pragma         comment(lib, "gdi32.lib")
#pragma         comment(lib, "user32.lib")
#pragma         comment(lib, "opengl32.lib")
#pragma         comment(lib, "glu32.lib")
#pragma         comment(lib, "yxbapi.lib")
#endif


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    /创建主窗口. 用YC++的API函数创建, 它不需要注册. 也可以用Win32函数创建主窗口
    int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
    HWND hwnd = YXB_Window(MainWndProc,NULL,0,
      WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU,
      "使用OpenGL",110,50,800,600,NULL,WT_WIN);

    MSG  msg;
    while(GetMessage(&msg,NULL,0,0))
      {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
      }
    return 0;
}

int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
    RECT mRect;
    switch(iMessage)
      {
 case WM_SIZE:      InvalidateRect(hwnd,NULL,TRUE);   return FALSE;
 case WM_DESTROY:   PostQuitMessage(0);               return FALSE;

 case WM_PAINT:
      PAINTSTRUCT ps;
      BeginPaint(hwnd, &ps);
      YIMG yimg;
      memset(&yimg,0,sizeof YIMG);
      yimg.hdc = ps.hdc;     //通过这个设置, 可以将窗口客户区当作一幅图象来操作
      GetClientRect(hwnd, &mRect);
      YXB_ImageFill(&yimg, 0, 0, mRect.right, mRect.bottom, RGB(130,150,160));

      HGLRC hglrc;
      void OpenGL_Init(HDC hdc,int ww,int hh,HGLRC *hglrc);
      OpenGL_Init(yimg.hdc,mRect.right,mRect.bottom,&hglrc);

      void OpenGL_draw_scene();
      OpenGL_draw_scene();

      void OpenGL_End(HGLRC hglrc);
      OpenGL_End(hglrc);

      EndPaint(hwnd, &ps);
      return FALSE;
      }
    return DefWindowProc(hwnd,iMessage,wParam,lParam);
}

PIXELFORMATDESCRIPTOR pfd = {
       sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_SUPPORT_OPENGL | PFD_SUPPORT_GDI | PFD_DRAW_TO_BITMAP,
       PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 };

void OpenGL_Init(HDC hdc,int ww,int hh,HGLRC *hglrc)
{
int    pixelformat;

    if((pixelformat=ChoosePixelFormat(hdc,&pfd)) == 0)
      {
 if((pixelformat=ChoosePixelFormat(hdc,&pfd)) == 0)      return;
      }
    if(SetPixelFormat(hdc,pixelformat,&pfd) == FALSE)   return;

    *hglrc = wglCreateContext(hdc);
    wglMakeCurrent(hdc,*hglrc);

    glViewport(0,0,ww,hh);
    gluPerspective(35,1,3,7);
    glTranslatef(0.0, 0.0, -4.5);
}

void OpenGL_End(HGLRC hglrc)
{
    wglMakeCurrent(NULL,NULL);
    wglDeleteContext(hglrc);
}

void OpenGL_draw_scene()
{
    glDepthMask (GL_FALSE);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE);

    glBegin(GL_TRIANGLE_FAN);
      glColor4f(1.0, 0.0, 0.0, 1.0);
      glVertex3f(0.0, 1.0, 0.0);
      glColor4f(0.0, 1.0, 0.0, 1.0);
      glVertex3f(1.0, 0.0, 0.0);
      glColor4f(0.0, 0.0, 1.0, 1.0);
      glVertex3f(0, -1.0, 0.0);
      glColor4f(0.0, 1.0, 1.0, 1.0);
      glVertex3f(-1.0, 0.0, 0.0);
    glEnd();
    glFinish();




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我无法编写代码。以下是一个简单的OpenGL程序示例,可用于绘制一个矩形: ``` #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glBegin(GL_QUADS); glVertex2f(-0.5, -0.5); glVertex2f(-0.5, 0.5); glVertex2f(0.5, 0.5); glVertex2f(0.5, -0.5); glEnd(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL Program"); glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在该程序中,我们首先包含了OpenGL的头文件glut.h。然后,我们定义了一个名为“display”的函数,该函数将在窗口中绘制矩形。在该函数中,我们首先调用glClear函数来清除颜色缓冲区,然后调用glColor3f函数来设置当前颜色为红色。接下来,我们使用glBegin和glEnd函数来指定绘制一个矩形的四个顶点,并在glFlush函数中刷新缓冲区。 在main函数中,我们首先调用glutInit函数来初始化GLUT库,然后使用glutInitDisplayMode函数来设置显示模式。我们还使用glutInitWindowSize和glutInitWindowPosition函数来设置窗口的大小和位置。接下来,我们使用glutCreateWindow函数创建一个窗口,并使用glClearColor函数来设置窗口的背景颜色。我们还使用gluOrtho2D函数来设置正交投影矩阵,以便将屏幕坐标系映射到OpenGL坐标系中。最后,我们使用glutDisplayFunc函数将display函数注册为窗口的绘制回调函数,并使用glutMainLoop函数启动GLUT的事件循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值