OpenGL基础知识

这篇博客介绍了初学者如何使用OpenGL进行图形绘制,包括矩形、三角形和三菱锥的创建,并展示了图形旋转的效果。作者强调了具备C语言基础对于理解OpenGL的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩形,三角形,三菱锥的绘制

  1. 首次接触OpenGL,发现它作为一个规格的专业的图形程序接口,学会使用它对自己有很大帮助。
  2. 前期自学看书,边敲边思考,有一定的c语言基础,发现可以很快理解。
    (一)、矩形
#include<windows.h>
#define GLUT_DISABLE_ATEXIT_HACK 
#include<gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h>
void RenderScene()//用于在窗口中绘制需要的图形
{
    glClear(GL_COLOR_BUFFER_BIT);//用当前清除色清除颜色缓冲区,即设定窗口的背景色
    glColor3f(1.0f,0.0f,0.0f);//设置当前绘图使用的RGB颜色
    glRectf(0.0f,40.0f,40.0f,0.0f);//使用当前颜色绘制一个填充的矩形,四个参数表示矩形左上角点和右下角点的坐标
    glFlush();//刷新OpenGL命令队列
 } 
 //是窗口大小改变时调用的登记函数
 void ChangeSize(int w,int h)
{
    if(h==0) h=1;
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h) 
        glOrtho(-100.0f,100.0f,-100.0f*h/w,100.0f*h/w,-100.0f,100.0f);
    else
    glOrtho(-100.0f*w/h,-100.0f*w/h,-100.0f,100.0f,-100.0f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 void SetupRC()//用于初始化,常用来设置场景渲染状态
 {
    glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口的清除色为白色
 }
 void main()
 {
    //初始化GLUT库OpenGL窗口的显示模式
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutCreateWindow("GLRect");//创建一个名为GLRect的窗口
    //设置当前窗口的显示回调函数和窗口再整形回调函数
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    SetupRC();
    //启动主GLUT事件处理循环
    glutMainLoop();
 }
  • 运行结果如图
    这里写图片描述

    (二)、三角形

#include<windows.h>
#define GLUT_DISABLE_ATEXIT_HACK 
#include<gl/gl.h>
#include<gl/glut.h>
//旋转参数
static GLfloat xRot=0.0f;
static GLfloat yRot=0.0f;
//确定多边形绕法的方向
BOOL bWinding=TRUE;
//初始化窗口
void SetupRC()
{
    glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void ChangeSize(int w,int h)
{
    if(h==0) h=1;
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h)
        glOrtho(-100.0f,100.0f,-100.0f*h/w,100.0f*h/w,-100.0f,100.0f);
    else
        glOrtho(-100.0f*w/h,-100.0f*w/h,-100.0f,100.0f,-100.0f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void RenderScene()
{
    glClear(GL_COLOR_BUFFER_BIT);
    //旋转图形
    glPushMatrix();
    glRotatef(xRot,1.0f,0.0f,0.0f);
    glRotatef(yRot,0.0f,1.0f,0.0f);
    //设置点的大小以及线宽
    glPointSize(5);
    glLineWidth(5);
    //设置多边形绕法的方向是顺时针还是逆时针
    if(bWinding)
        glFrontFace(GL_CW);
    else
        glFrontFace(GL_CCW);
    //绘制三角形
    glBegin(GL_TRIANGLES);
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(0,60,0);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f(-60,-60,0);
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f(60,-60,0);
    glEnd();
    glPopMatrix();
    glutSwapBuffers();//刷新命令缓冲区
}
void SpecialKeys(int key,int x,int y)
{
    if(key==GLUT_KEY_UP) xRot-=5.0f;
    if(key==GLUT_KEY_DOWN) xRot+=5.0f;
    if(key==GLUT_KEY_LEFT) yRot-=5.0f;
    if(key==GLUT_KEY_RIGHT) yRot+=5.0f;
    if(xRot>356.0f) xRot=0.0f;
    if(xRot<-.10f) xRot=355.0f;
    if(yRot>356.0f) yRot=0.0f;
    if(y<-1.0f) yRot=355.0f;
    //刷新窗口
    glutPostRedisplay();
}
void ProcessMenu(int value)
{
    switch(value)
    {
    case 1://修改多边形正面为填充模式
           glPolygonMode(GL_FRONT,GL_FILL);
           break;
    case 2:
           //修改多边形正面为线模式
           glPolygonMode(GL_FRONT,GL_LINE);
           break;
    case 3:
           //修改多边形正面为点充模式
           glPolygonMode(GL_FRONT,GL_POINT);
           break;
    case 4:
           //修改多边形反面为点充模式
            glPolygonMode(GL_FRONT,GL_FILL);
            break;
    case 5:
           //修改多边形反面为线模式
            glPolygonMode(GL_FRONT,GL_LINE);
           break;
    case 6:
           //修改多边形反面为点充模式
           glPolygonMode(GL_FRONT,GL_POINT);
           break;
    case 7://设置多边形的阴影模式为平面明暗模式
           glShadeModel(GL_FLAT);
    case 8:
           //设置多边形的阴影模式为光滑明暗模式
           glShadeModel(GL_SMOOTH);
           break;
    case 9:
           bWinding=!bWinding;
           break;
    default:
           break;
    }
    glutPostRedisplay();
}
int main(int argc,char* argv[])
{
    int nModeMenu;
    int nMainMenu;
    int nColorMenu;
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutCreateWindow("多边形演示");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);
    //创建一个子菜单并定义菜单回调函数
    nModeMenu=glutCreateMenu(ProcessMenu);
    //添加菜单项,1表示选择菜单条目时传递的参数值
    glutAddMenuEntry("正面多边形填充模式",1);
    glutAddMenuEntry("正面线框模型",2);
    glutAddMenuEntry("正面点模式",3);
    glutAddMenuEntry("反面多边形填充模式",4);
    glutAddMenuEntry("反面线框模型",5);
    glutAddMenuEntry("反面点模式",6);
    //增加一个子菜单
    nColorMenu=glutCreateMenu(ProcessMenu);
    glutAddMenuEntry("平面明暗模式",7);
    glutAddMenuEntry("光滑明暗模式",8);
    //创建主菜单
    nMainMenu=glutCreateMenu(ProcessMenu);
    glutAddSubMenu("多边形模式",nModeMenu);
    glutAddSubMenu("颜色模式",nColorMenu);
    glutAddMenuEntry("改变绕法",9);
    //将创建的菜单与右键关联,即把菜单设置为右键弹出式菜单
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    SetupRC();
    glutMainLoop();
    return 0;
}

运行结果如图* 通过方向键可以让图形旋转*

通过方向键可以让图形旋转

(三)、三菱锥

#include<windows.h>
#define GLUT_DISABLE_ATEXIT_HACK   
#include<gl/gl.h>
#include<gl/glut.h>
//旋转参数
static GLfloat xRot=0.0f;
static GLfloat yRot=0.0f;
BOOL bDepth=TRUE;//深度测试开关
BOOL bCull=TRUE;//剔除开关
void SetupRC()
{
    //设置窗口背景颜色为黑色
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    //指定多边形的阴影模式为平面阴暗模式
    glShadeModel(GL_FLAT);
}
void ChangeSize(int w,int h)
{
    if(h==0) h=1;
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h) 
        glOrtho(-100.0f,100.0f,-100.0f*h/w,100.0f*h/w,-100.0f,100.0f);
    else
        glOrtho(-100.0f*w/h,-100.0f*w/h,-100.0f,100.0f,-100.0f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
//在窗口中绘制图形
void RenderScene()
{
    //清除颜色及深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    //是否开启设度测试
    if(bDepth)
        glEnable(GL_DEPTH_TEST);
    else
        glDisable(GL_DEPTH_TEST);
    //是否打开剔除
    if(bCull)
        glEnable(GL_CULL_FACE);
    else
        glDisable(GL_CULL_FACE);
    //旋转图形
    glPushMatrix();
    glRotatef(xRot,1.0f,0.0f,0.0f);
    glRotatef(yRot,0.0f,1.0f,0.0f);
    //指定顺时针绕法的多边形为多边形正面
    glFrontFace(GL_CW);
    //绘制三菱锥的三个棱面,他们的颜色分别为红,绿,蓝
    glBegin(GL_TRIANGLE_FAN);
         glVertex3f(0.0,0.0,80.0);
         glVertex3f(0.0,50.0,0.0);
         glColor3f(1.0,0.0,0.0);
         glVertex3f(50.0,-50.0,0.0);
         glColor3f(0.0,1.0,0.0);
         glVertex3f(-50.0,-50.0,0.0);
         glColor3f(0.0,0.0,1.0);
         glVertex3f(0.0,50.0,0.0);
    glEnd();
    glFrontFace(GL_CCW);
    //绘制三菱锥的底面,其颜色为黄色
    glBegin(GL_TRIANGLE_FAN);
        glVertex3f(0.0,50.0,0.0);
        glVertex3f(50.0,-50.0,0.0);
        glColor3f(1.0,1.0,0.0);
        glVertex3f(-50.0,-50.0,0.0);
    glEnd();
    glPopMatrix();
    //刷新命令缓冲区
    glutSwapBuffers();
}
void SpecialKeys(int key,int x,int y)
{
    if(key==GLUT_KEY_UP) xRot-=5.0f;
    if(key==GLUT_KEY_DOWN) xRot+=5.0f;
    if(key==GLUT_KEY_LEFT) yRot-=5.0f;
    if(key==GLUT_KEY_RIGHT) yRot+=5.0f;
    if(xRot>356.0f) xRot=0.0f;
    if(xRot<-1.0f) xRot=355.0f;
    if(yRot>356.0f) yRot=0.0f;
    if(yRot<-1.0f) yRot=355.0f;
    //刷新窗口
    glutPostRedisplay();
}
void processMenu(int value)
{
    switch(value)
    {
    case 1:bDepth=!bDepth;
        break;
    case 2:bCull=!bCull;
        break;
    default:
        break;
    }
    glutPostRedisplay();
}
int main(int argc,char* argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutCreateWindow("三菱锥");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);
    //创建右键菜单
    glutCreateMenu(processMenu);
    glutAddMenuEntry("深度测试",1);
    glutAddMenuEntry("剔除背面",2);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    SetupRC();
    glutMainLoop();
    return 0;
}

运行结果如图* 通过方向键可以让图形旋转*
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值