美文网首页从0开始的视觉学习
[demo1].来一个最简单的三角形吧

[demo1].来一个最简单的三角形吧

作者: NealDN | 来源:发表于2020-07-04 22:47 被阅读0次

跳去目录


首先,我们需要搭建一个基本的窗口

1. 初始化glut模块
glutInit(&argc, argv);
2. 加载配置模块

​ 需要加载的有

  1. GLUT_DOUBLE 双缓冲窗口

  2. GLUT_RGBA RGBA颜色模式(后面尝试一下能否家在HSV颜色模式)

  3. GLUT_DEPTH 深度测试模块

  4. GLUT_STENCIL 模版缓冲区

    /**
         * GLUT_DOUBLE 双缓冲窗口 是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式经常用来生成动画效果
         * GLUT_RGBA RGBA颜色模式 RGBA通道,R G B A 的范围分别为 0-1
         * GLUT_DEPTH 深度测试 标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试
         * GLUT_STENCIL 模版缓冲区 确保有一个可用的模版缓冲区
         */
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    
3.设置窗口大小 (后面的视口大小尽量与视图大小一致)
glutInitWindowSize(600, 400);
4.给这个窗口取个名字并创建这个窗口
glutCreateWindow("Triangle");
5.设置一个方法,用于捕获窗口改变时的消息
/**
 * @param w 捕获到的宽度
 * @param h 捕获到的的高度
 */
void ChangeSize(int w, int h)
{
    
}

glutReshapeFunc(ChangeSize);
6.注册一个方法,用于设置显示的内容(屏幕刷新的时候)
void RenderScene(void)
{
    
}

glutDisplayFunc(RenderScene);
7.初始化GLEW库,并检查驱动初始化过程中是否出现问题,以确保OpenGL API是完整的,可用的
GLenum status = glewInit();
    if (status != GLEW_OK) {
        printf("GLEW Occur an error: %s \n", glewGetErrorString(status));
        return 1;
    }
8.设置渲染环境(准备工作)
void SetupRC()
{
    
}


SetupRC();
9.加载并启动MainLoop配置
glutMainLoop();

至此,基本窗口就搭建完毕了,接下来开始写窗口内的内容


接下来,配置一下窗口大小发生变化时的操作

void ChangeSize(int w, int h)
{
    glViewport(0, 0, w, h)
}

当初始化窗口或拉动窗口边界改变窗口大小时,将窗口大小改变为初始化的大小或拉动到的大小,如果不设置这一步的话,


然后进行绘制的准备

  1. 设置画板的背景颜色

    //设置成了水蓝色
    glClearColor(212/255.0, 242/255.0, 231/255.0, 1);
    
  2. 创建一个全局的着色器,用来绘制图案,并初始化

    GLShaderManager shaderManager;
    shaderManager.InitializeStockShaders()
    
  3. 设置图形顶点数据

    GLfloat vTops[] = {
            -0.4, -0.3, 0,
            0.6, -0.7, 0,
            0.2, 0.5, 0
        };
    
  4. 创建一个全局容器,用来描绘路径

    GLBatch triangleBatch;
    
  5. 设置绘制方式与绘制顶点个数,并将顶点数据拷贝进容器内

    /**
         * GL_TRIANGLES 三角形
         */
    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vTops);
    
  6. 发送准备结束的信号,进入绘图阶段

    triangleBatch.End();
    

最后开始画图

  1. 清空缓冲区(可能保留有之前的状态,需要清空)

    /**
         * GL_COLOR_BUFFER_BIT 颜色缓冲区
         * GL_DEPTH_BUFFER_BIT 深度缓冲区
         * GL_STENCIL_BUFFER_BIT 模版缓冲区
         */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
    
  2. 选中着色器(就像ps那样),并着色器的属性(主要是设置颜色)

    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vPencil);
    
  3. 调用开始绘制的命令,并切换显示器的缓冲区(现在一般的显示器都是双缓冲区,在显示的时候会进行新的绘制,绘制完毕后会显示这次的绘制,并切换缓冲区并进行新的绘制)

    triangleBatch.Draw();
    glutSwapBuffers();
    
  4. 这个时候,三角形就出现在屏幕上啦 👏👏👏👏 Nice Job~

Triangle.png

Demo在这里


跳去目录

相关文章

  • [demo2].进阶啦,来一个可以移动的多边形吧

    跳去目录 首先,来绘制一个多边形 在 [demo1].来一个最简单的三角形吧 的demo的基础上,将vTops里的...

  • [demo1].来一个最简单的三角形吧

    跳去目录 首先,我们需要搭建一个基本的窗口 1. 初始化glut模块 2. 加载配置模块 ​ 需要加载的有 G...

  • 【十天自制软渲染器】DAY 03:画一个三角形(向量叉乘算法 &

    前面两天画了点和线,今天我们来画一个最简单也是最强大的面——三角形。 本文主要讲解三角形绘制算法的推导和思路(只涉...

  • WebGL绘制个最简单的三角形

    在webgl中的hello world就是绘制个三角形,本例绘制了一个最简单的三角形效果图: 代码:

  • git入门

    一、git init ①创建一个项目目录,例“mkdir demo1” ②进入该目录,"cd demo1" ③输入...

  • NSDate 和NSDateFormatter详解

    一、Demo1: 有NSDate对象,作简单的格式化//创建一个NSDate对象 二、Demo2: 从NSStri...

  • 小班的手工课

    发现孩子们最简单的折还不会,本来要折猫头,然后换成最简单的三角形,再以游戏的方式小组合作黏贴在纸上~

  • 2022-11-26

    大家好,今天我要分享的是面积,面积呢多少度?最简单求的三角形,三角形可以组成任何图形,最容易组成图形的是直角,三角...

  • CSS实现空心三角形

    背景:WEB开发中,三角形的日常应用,以三角形箭头最为常见,其用CSS来实现非常简单。 三角形的实现原理:是宽高都...

  • IOS基础知识-宏定义使用

    写一个简单的宏定义: 指令与作用: 运算符: 例如: #define demo1(n) "123"#n出现在宏定义...

网友评论

    本文标题:[demo1].来一个最简单的三角形吧

    本文链接:https://www.haomeiwen.com/subject/munpqktx.html