欢迎光临散文网 会员登陆 & 注册

OpenGL实例教程03:绘制三角形

2023-02-14 10:44 作者:阿西拜-江西  | 我要投稿

我们在哪?

  • 通过实例1,我们获得了一个支持OpenGL的窗口。

  • 通过实例2,我们初始化了OpenGL的函数指针,指向了显卡驱动中的具体实现,于是我们可以通过OpenGL代码让显卡执行绘制任务了。在实例1准备的窗口上绘制了两个点。

  • 现在需要绘制一个三角形。

如何绘制三角形?

有了前面的准备工作,我们现在的任务非常简单,绘制三角形和绘制点本质上差不多,只是数据和使用数据绘制的方式(状态机的某个状态)不同。

  • 准备数据(为了简单起见,将数据都设置在-1到1之间)

    • Vector3f Vertices[3];
      Vertices[0] = Vector3f(-0.5f, -0.5f, 0.0f);
      Vertices[1] = Vector3f(0.5f, -0.5f, 0.0f);
      Vertices[2] = Vector3f(0.0f, 0.5f, 0.0f);

  • 调用OpenGL函数,以三角形的方式解读数据并绘制

    • glDrawArrays(GL_TRIANGLES, 0, 3);

代码展示:

#include "../include/glew-2.1.0/glew.h"
#include "../include/freeglut3.4/freeglut.h"
#include "../include/ogldev_math_3d.h"

GLuint VBO;

static void RenderSceneCB()
{
    glClear(GL_COLOR_BUFFER_BIT); 

    
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /*0*/sizeof(GL_FLOAT)*3, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);//以三角形的方式解读数组中的数据,从0开始取3个顶点

    glDisableVertexAttribArray(0);

    glutSwapBuffers();        
}

static void InitializeGlutCallbacks()
{
    glutDisplayFunc(RenderSceneCB);
}

static void CreateVertexBuffer()
{
    Vector3f Vertices[3];// 包含3个顶点数据的数组

    Vertices[0] = Vector3f(-0.5f, -0.5f, 0.0f); //左下
    Vertices[1] = Vector3f(0.5f, -0.5f, 0.0f);  //右下
    Vertices[2] = Vector3f(0.0f, 0.5f, 0.0f);   //中上

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

    glutInitWindowSize(1024, 768);    
    glutInitWindowPosition(100, 100);   
    glutCreateWindow("Tutorial 03");    

    GLenum res = glewInit();
    if (res != GLEW_OK) {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
        return 1;
    }

    CreateVertexBuffer();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    InitializeGlutCallbacks();
    glutMainLoop();
}

运行效果:



OpenGL实例教程03:绘制三角形的评论 (共 条)

分享到微博请遵守国家法律