《OpenGL入门教程》上的代码复现

首先是Windows10 + Visual Studio 2019 搭建OpenGL环境可以查看如下链接:

萌新向!!!Windows10 + Visual Studio 2019 搭建OpenGL环境(图文教程) - 哔哩哔哩 (bilibili.com)

//使用PC端浏览器打开,Android端似乎被删除了

其次是《OpenGL入门教程》原文链接:_OpenGL入门教程 - 百度文库 (baidu.com)       

或者在我的主页的资源处下载该文件,链接如下:《OpenGL入门教程》十二讲详解与代码分析-图像处理文档类资源-CSDN文库

目录

第一讲

第一个OpenGL程序

 第二讲

例一、画一个圆 

例二、画一个五角星

例三、画出正弦函数的图形

第三讲

 1、关于点

 2、关于直线

 3.1、关于多边形

 3.2、关于镂空多边形

 第四讲

1、RGBA颜色

2、索引颜色

3、指定清除屏幕用的颜色

4、指定着色模型 

第五讲

太阳,地球和月亮 

第六讲

 2、实现连续动画

 4、计算帧速

第七讲

光照演示

第八讲

彩色四面体

第九讲

 二、二维图形混合举例

 二、实现三维混合

第十讲

抓取窗口图片保存为BMP文件

4、glDrawPixels的用法和举例 

5、glCopyPixels的用法和举例

第十一讲

5、示例程序

第十二讲

2、Alpha测试

3、模板测试


第一讲

第一个OpenGL程序

代码:

#include <Windows.h>
#include <GL/glut.h>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

 第二讲

例一、画一个圆 

 代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>

const int n = 20;
const GLfloat R = 0.5f;
const GLfloat Pi = 3.1415926536f;

void myDisplay(void)
{
    int i;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);//将GL_POLYGON改为GL_LINE_LOOP、GL_POINTS等其它方式,观察输出的变化情况
    for (i = 0; i < n; ++i)
        glVertex2f(R * cos(2 * Pi / n * i), R * sin(2 * Pi / n * i));
    glEnd();
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

 结果:

(使用GL_POLYGON)

(使用GL_LINE_LOOP)

(使用GL_POINTS) 

 例二、画一个五角星

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>

const GLfloat Pi = 3.1415926536f;
void myDisplay(void)
{
    GLfloat a = 1 / (2 - 2 * cos(72 * Pi / 180));
    GLfloat bx = a * cos(18 * Pi / 180);
    GLfloat by = a * sin(18 * Pi / 180);
    GLfloat cy = -a * cos(18 * Pi / 180);
    GLfloat
        PointA[2] = { 0, a },
        PointB[2] = { bx, by },
        PointC[2] = { 0.5, cy },
        PointD[2] = { -0.5, cy },
        PointE[2] = { -bx, by };

    glClear(GL_COLOR_BUFFER_BIT);
    // 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出
    glBegin(GL_LINE_LOOP);
    glVertex2fv(PointA);
    glVertex2fv(PointC);
    glVertex2fv(PointE);
    glVertex2fv(PointB);
    glVertex2fv(PointD);
    glEnd();
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

例三、画出正弦函数的图形

 代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>

const GLfloat factor = 0.1f;
void myDisplay(void)
{
    GLfloat x;
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINES);
    glVertex2f(-1.0f, 0.0f);
    glVertex2f(1.0f, 0.0f);        // 以上两个点可以画x轴
    glVertex2f(0.0f, -1.0f);
    glVertex2f(0.0f, 1.0f);        // 以上两个点可以画y轴
    glEnd();
    glBegin(GL_LINE_STRIP);
    for (x = -1.0f / factor; x < 1.0f / factor; x += 0.01f)
    {
        glVertex2f(x * factor, sin(x) * factor);
    }
    glEnd();
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

第三讲

 1、关于点

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPointSize(5.0f);
    glBegin(GL_POINTS);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.5f, 0.5f);
    glEnd();
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

 2、关于直线

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_LINE_STIPPLE);
    glLineStipple(2, 0x0F0F);
    glLineWidth(10.0f);
    glBegin(GL_LINES);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.5f, 0.5f);
    glEnd();
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

3.1、关于多边形

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
    glPolygonMode(GL_BACK, GL_LINE);  // 设置反面为线形模式
    glFrontFace(GL_CCW);              // 设置逆时针方向为正面
    glBegin(GL_POLYGON);              // 按逆时针绘制一个正方形,在左下方
    glVertex2f(-0.5f, -0.5f);
    glVertex2f(0.0f, -0.5f);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(-0.5f, 0.0f);
    glEnd();
    glBegin(GL_POLYGON);              // 按顺时针绘制一个正方形,在右上方
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.0f, 0.5f);
    glVertex2f(0.5f, 0.5f);
    glVertex2f(0.5f, 0.0f);
    glEnd();
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

 3.2、关于镂空多边形

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>

void myDisplay(void)
{
    static GLubyte Mask[128] =
    {
        0x00, 0x00, 0x00, 0x00,   //这是最下面的一行
        0x00, 0x00, 0x00, 0x00,
        0x03, 0x80, 0x01, 0xC0,   //麻
        0x06, 0xC0, 0x03, 0x60,   //烦
        0x04, 0x60, 0x06, 0x20,   //的
        0x04, 0x30, 0x0C, 0x20,   //初
        0x04, 0x18, 0x18, 0x20,   //始
        0x04, 0x0C, 0x30, 0x20,   //化
        0x04, 0x06, 0x60, 0x20,   //,
        0x44, 0x03, 0xC0, 0x22,   //不
        0x44, 0x01, 0x80, 0x22,   //建
        0x44, 0x01, 0x80, 0x22,   //议
        0x44, 0x01, 0x80, 0x22,   //使
        0x44, 0x01, 0x80, 0x22,   //用
        0x44, 0x01, 0x80, 0x22,
        0x44, 0x01, 0x80, 0x22,
        0x66, 0x01, 0x80, 0x66,
        0x33, 0x01, 0x80, 0xCC,
        0x19, 0x81, 0x81, 0x98,
        0x0C, 0xC1, 0x83, 0x30,
        0x07, 0xE1, 0x87, 0xE0,
        0x03, 0x3F, 0xFC, 0xC0,
        0x03, 0x31, 0x8C, 0xC0,
        0x03, 0x3F, 0xFC, 0xC0,
        0x06, 0x64, 0x26, 0x60,
        0x0C, 0xCC, 0x33, 0x30,
        0x18, 0xCC, 0x33, 0x18,
        0x10, 0xC4, 0x23, 0x08,
        0x10, 0x63, 0xC6, 0x08,
        0x10, 0x30, 0x0C, 0x08,
        0x10, 0x18, 0x18, 0x08,
        0x10, 0x00, 0x00, 0x08   // 这是最上面的一行
    };
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_POLYGON_STIPPLE);
    glPolygonStipple(Mask);
    glRectf(-0.5f, -0.5f, 0.0f, 0.0f);  // 在左下方绘制一个有镂空效果的正方形
    glDisable(GL_POLYGON_STIPPLE);
    glRectf(0.0f, 0.0f, 0.5f, 0.5f);    // 在右上方绘制一个无镂空效果的正方形
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

//另外一种更方便的做法
//首先,用Windows自带的画笔程序新建一副图片,取名为mask.bmp,
//注意保存时,应该选择“单色位图”。在“图象”->“属性”对话框中,设置图片的高度和宽度均为32。
//用放大镜观察图片,并编辑之。黑色对应二进制零(镂空),白色对应二进制一(不镂空),编辑完毕后保存。
//然后,就可以使用以下代码来获得这个Mask数组了。
//static GLubyte Mask[128];
//FILE * fp;
//fp  = fopen("mask.bmp", "rb");
//if (!fp )
//exit(0);
//if (fseek(fp, -(int)sizeof(Mask), SEEK_END))
//exit(0);
//if (!fread(Mask, sizeof(Mask), 1, fp))
//exit(0);
//fclose(fp);

结果:

 第四讲

1、RGBA颜色

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f, 1.0f, 1.0f);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

2、索引颜色

        因为博主的VS里面没有aux这个包,所以颜色索引就跳过了。

3、指定清除屏幕用的颜色

代码:

#include <Windows.h>
#include <GL/glut.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>

void myDisplay(void)
{
    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

结果:

4、指定着色模型 

代码:

#include <Windows.h>
#include <GL/glut.h
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值