qt opengl 绘制点、线、三角形、多边形(二)


一、相关宏定义参数

#define GL_POINTS 0x0000        // 点
#define GL_LINES 0x0001         // 直线线段,按添加点的顺序,每2个点组成一条线段
#define GL_LINE_LOOP 0x0002     // 直线线段,按添加点的顺序,相邻的两个点连接,且第一个点与最后一个点也连接(多边形)
#define GL_LINE_STRIP 0x0003    // 与GL_LINE_LOOP类似,区别在于 第一个点与最后一个点 不 连接
#define GL_TRIANGLES 0x0004     // 按添加点的顺序, 每3个点组成三角(面)
#define GL_TRIANGLE_STRIP 0x0005// 三角(面) ,区别见后面代码演示
#define GL_TRIANGLE_FAN 0x0006  // 三角(面),区别见后面代码演示
#define GL_QUADS 0x0007         // 
#define GL_QUAD_STRIP 0x0008    // 
#define GL_POLYGON 0x0009       // 

二、代码及示例图

1. 点 LG_POINTS 0x0000

void MOpenGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    //点大小
    glPointSize(6.0f);
    //启动绘制(点)
    glBegin(GL_POINTS);
    {
        //
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, 0.0f, 0.0f);

        glVertex3f(-0.5f, 0.0f, 0.0f);

        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 0.0f, 0.0f);

        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.5f, 0.0f, 0.0f);

        glVertex3f(1.0f, 0.0f, 0.0f);
    }
    //结束绘制
    glEnd();
}

在这里插入图片描述

2. 线 GL_LINES 0x0001

//启动绘制(线段)
glBegin(GL_LINES);
{
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex3f(-1.0f, 0.0f, 0.0f);
    glVertex3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, -1.0f, 0.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
}
//结束绘制
glEnd();

在这里插入图片描述

3. 线 GL_LINE_LOOP 0x0002

//启动绘制(多边形直线)
glBegin(GL_LINE_LOOP);
{
    glColor3f(1,0,0);
    glVertex2f(-1.0f, 0.0f);

    glColor3f(0,1,0);
    glVertex2f(0.0f, -1.0f);

    glColor3f(0,0,1);
    glVertex2f(1.0f, 0.0f);

    glColor3f(1,1,1);
    glVertex2f(0.0f, 1.0f);
}
//结束绘制
glEnd();

在这里插入图片描述

4. GL_LINE_STRIP 0x0003

//启动绘制(连续的线段)
glBegin(GL_LINE_STRIP);
{
    glColor3f(1,0,0);
    glVertex2f(-0.5f, 0.0f);

    glColor3f(0,1,0);
    glVertex2f(0.0f, -0.5f);

    glColor3f(0,0,1);
    glVertex2f(0.5f, 0.0f);

    glColor3f(1,1,1);
    glVertex2f(0.0f, 0.5f);
}
//结束绘制
glEnd();

在这里插入图片描述

5. GL_TRIANGLES 0x0004

先将所用的点画出

	//点大小
    glPointSize(6.0f);
    //
    glBegin(GL_POINTS);
    {
        glColor3f(0, 0, 0);
        
        glVertex3f( -0.9f, 0.2f, 0.0f);
        glVertex3f( -0.7f, -0.2f, 0.0f);
        glVertex3f( -0.5f, 0.2f, 0.0f);
        
        glVertex3f( -0.3f, -0.2f, 0.0f);
        glVertex3f( -0.1f, 0.2f, 0.0f);
        glVertex3f( 0.1f, -0.2f, 0.0f);
        
        glVertex3f( 0.3f, 0.2f, 0.0f);
        glVertex3f( 0.5f, -0.2f, 0.0f);
        glVertex3f( 0.7f, 0.2f, 0.0f);
    }
    glEnd();

GL_TRIANGLS绘制三角形规则如下:
若添加的N个坐标点顺序为 { P0, P1, P2, … , P n-2, P n-1, P ~n ~}
组成的三角形为:{ P0, P1, P2 } 、{ P3, P4, P5 } 、… 、{ Pn-5, Pn-4, Pn-3 } 、{ Pn-2, Pn-1, Pn }

// 启动绘制(三角形)
glBegin(GL_TRIANGLES);
{
    glColor3f(0, 0, 0);
    glVertex3f( -0.9f, 0.2f, 0.0f);
    glColor3f(1, 0, 0);
    glVertex3f( -0.7f, -0.2f, 0.0f);
    glColor3f(0, 1, 0);
    glVertex3f( -0.5f, 0.2f, 0.0f);
    
    glColor3f(1, 1, 0);
    glVertex3f( -0.3f, -0.2f, 0.0f);
    glColor3f(0, 0, 1);
    glVertex3f( -0.1f, 0.2f, 0.0f);
    glColor3f(1, 0, 1);
    glVertex3f( 0.1f, -0.2f, 0.0f);

    glColor3f(0, 1, 1);
    glVertex3f( 0.3f, 0.2f, 0.0f);
    glColor3f(1, 1, 1);
    glVertex3f( 0.5f, -0.2f, 0.0f);
    glColor3f(0, 0, 0);
    glVertex3f( 0.7f, 0.2f, 0.0f);
}
glEnd();

在这里插入图片描述

6. GL_TRIANGLE_STRIP 0x0005

与第5小节所用的代码不变,仅glBegin(GL_TRIANGLE);改为glBegin(GL_TRIANGL_STRIP);所得结果如下图。

GL_TRIANGL_STRIP绘制三角形规则如下:
若添加的N个坐标点顺序为 { P0, P1, P2, … , P n-2, P n-1, P n }
组成的三角形为:{ P0, P1, P2 } 、{ P1, P2, P3 } 、{ P2, P3, P4} 、… 、{ Pn-3, Pn-2, Pn-1} 、{ Pn-2, Pn-1, Pn}

在这里插入图片描述

7. GL_TRIANGLE_FAN 0x0006

与第5小节所用的代码不变,仅glBegin(GL_TRIANGLE);改为glBegin(GL_TRIANGL_FAN);所得结果如下图。

GL_TRIANGL_STRIP绘制三角形规则如下:
若添加的N个坐标点顺序为 { P0, P1, P2, … , P n-2, P n-1, P n }
组成的三角形为:{ P0, P1, P2 } 、{ P0, P2, P3 } 、… 、{ P0, Pn-2, Pn-1 } 、、{ P0, Pn-1, Pn }

在这里插入图片描述

8. GL_QUADS 0x0007

标记所用点位

//点大小
glPointSize(6.0f);
//
glBegin(GL_POINTS);
{
	//这里画点添加顺序与画四边形顺序不一致,这里只是为了画出用到的点,方便理解,与画四边形无任何关联
    glColor3f(0, 0, 0);
    glVertex3f(-1.0f, -0.55f, 0.0f);
    glVertex3f(-1.0f, -0.95f, 0.0f);
    glVertex3f(-0.6f, -0.55f, 0.0f);
    glVertex3f(-0.6f, -0.95f, 0.0f);
    glVertex3f(-0.2f, -0.55f, 0.0f);
    glVertex3f(-0.2f, -0.95f, 0.0f);
    glVertex3f(0.2f, -0.95f, 0.0f);
    glVertex3f(0.2f, -0.55f, 0.0f);
    glVertex3f(0.6f, -0.55f, 0.0f);
    glVertex3f(0.6f, -0.95f, 0.0f);
    glVertex3f(1.0f, -0.95f, 0.0f);
    glVertex3f(1.0f, -0.55f, 0.0f);
}
glEnd();
//!GL_QUADS四边形
glBegin(GL_QUADS);
{
    glColor3f(0, 0, 0);
    glVertex3f(-1.0f, -0.55f, 0.0f);
    glColor3f(1, 0, 0);
    glVertex3f(-1.0f, -0.95f, 0.0f);

    glColor3f(1, 1, 0);
    glVertex3f(-0.6f, -0.55f, 0.0f);
    glColor3f(0, 1, 0);
    glVertex3f(-0.6f, -0.95f, 0.0f);


    glColor3f(0, 0, 1);
    glVertex3f(-0.2f, -0.55f, 0.0f);
    glColor3f(1, 0, 1);
    glVertex3f(-0.2f, -0.95f, 0.0f);

    glColor3f(0, 1, 1);
    glVertex3f(0.2f, -0.95f, 0.0f);
    glColor3f(1, 1, 1);
    glVertex3f(0.2f, -0.55f, 0.0f);


    glColor3f(0, 0, 0);
    glVertex3f(0.6f, -0.55f, 0.0f);
    glColor3f(0, 0, 1);
    glVertex3f(1.0f, -0.55f, 0.0f);

    glColor3f(0, 1, 0);
    glVertex3f(0.6f, -0.95f, 0.0f);
    glColor3f(0, 1, 0);
    glVertex3f(1.0f, -0.95f, 0.0f);

}
glEnd();

在这里插入图片描述

如上图和示例代码,绘制了12个点及由这12点分别组成的3个四边形,图中标注了点坐标添加顺序。
从上图可以分析出如下特征:

  1. 添加N个顶点,每4个组成一个四边形。(若N%4不为0,那只能画出N/4个四边形,多出的N%4个顶点无用)
  2. 四边形是按照顶点添加顺序绘制的
    (这部分是个人理解,不确定是否有错)

9. GL_QUAD_STRIP 0x0008

延用第8小节所用的代码,仅glBegin(GL_QUADS);改为glBegin(GL_QUAD_STRIP);所得结果如下图。
在这里插入图片描述

从图中可以发现,顶点是可以共用的,好比两栋楼相邻的一面共用一堵墙。
图中有 { P0, P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11} 等12个顶点。
组成的四边形:{ P0,P1 ,P2 ,P3 }、{ P2,P3 ,P4 ,P5 }、{ P4,P5 ,P6 ,P7 }、{ P6,P7 ,P8 ,P9 }、{ P8,P9 ,P10 ,P11 }
绘制顺序:
… 1. 定义每个四边形中,第一个点是P0,第二个点是 P1,第三个点是 P2,第四个点是 P3
… 2. 绘制路线: P0 --》 P1 --》P3 、P0 --》 P2 --》P3 ,形成的四边形就是最终结果
(这部分是个人理解,不确定是否有错)

10. GL_POLYGON 0x0009

   //多边形
    glBegin(GL_POLYGON);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f(-0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f(-1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f(-0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f(-0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f(-0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f(-0.3f, 0.60f, 0.0f);
        //2
        glColor3f(1, 1, 1);
        glVertex3f(-0.4f, 0.75f, 0.0f);
        //1
        glColor3f(0.0f, 0.0f, 0.0f);
        glVertex3f(-0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-0.7f, 0.75f, 0.0f);

    }
    glEnd();

    glBegin(GL_POINTS);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f(-0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f(-1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f(-0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f(-0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f(-0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f(-0.3f, 0.60f, 0.0f);
        //2
        glColor3f(1, 1, 1);
        glVertex3f(-0.4f, 0.75f, 0.0f);
        //1
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(-0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-0.7f, 0.75f, 0.0f);
    }
    glEnd();

    //多边形
    glBegin(GL_POLYGON);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f( 0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f( 1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f( 0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f( 0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f( 0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f( 0.3f, 0.60f, 0.0f);
        //2
        glColor3f(1, 1, 1);
        glVertex3f( 0.4f, 0.45f, 0.0f);
        //1
        glColor3f(0.0f, 0.0f, 0.0f);
        glVertex3f( 0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f( 0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f( 0.7f, 0.45f, 0.0f);

    }
    glEnd();

    glBegin(GL_POINTS);
    {
        //1
        glColor3f(0, 0, 0);
        glVertex3f( 0.8f, 0.6f, 0.0f);
        //2
        glColor3f(1, 0, 0);
        glVertex3f( 1.0f, 0.75f, 0.0f);
        //3
        glColor3f(0, 1, 0);
        glVertex3f( 0.8f, 0.90f, 0.0f);
        //3
        glColor3f(1, 1, 0);
        glVertex3f( 0.3f, 0.90f, 0.0f);
        //2
        glColor3f(0, 0, 1);
        glVertex3f( 0.1f, 0.75f, 0.0f);
        //1
        glColor3f(1, 0, 1);
        glVertex3f( 0.3f, 0.60f, 0.0f);
        //2
        glColor3f(0.5f, 0.5f, 0.5f);
        glVertex3f( 0.4f, 0.45f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 1.0f);
        glVertex3f( 0.5f, 0.6f, 0.0f);
        //1
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f( 0.6f, 0.6f, 0.0f);
        //2
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f( 0.7f, 0.45f, 0.0f);
    }
    glEnd();

在这里插入图片描述

按顺序绘制,只能绘制凸多边形,不能绘制凹多边形


总结

以上内容为个人学习理解,可能存在错误。

可以使用以下代码来在 Qt 中使用 OpenGL 绘制三角形: ```cpp #include <QtGui/QOpenGLFunctions> #include <QtGui/QOpenGLShaderProgram> #include <QtGui/QOpenGLVertexArrayObject> #include <QtGui/QOpenGLBuffer> class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { initializeOpenGLFunctions(); // 创建着色器程序 m_program = new QOpenGLShaderProgram(this); m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, R"( #version 330 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); } )"); m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, R"( #version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); } )"); m_program->link(); // 创建顶数组对象和顶缓冲对象 m_vao = new QOpenGLVertexArrayObject(this); m_vao->create(); m_vao->bind(); m_vbo = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer); m_vbo->create(); m_vbo->bind(); float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; m_vbo->allocate(vertices, sizeof(vertices)); // 设置顶属性指针 m_program->bind(); m_program->enableAttributeArray(0); m_program->setAttributeBuffer(0, GL_FLOAT, 0, 3, 0); // 解绑 m_vao->release(); m_vbo->release(); m_program->release(); } void paintGL() override { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); m_program->bind(); m_vao->bind(); glDrawArrays(GL_TRIANGLES, 0, 3); m_vao->release(); m_program->release(); } private: QOpenGLShaderProgram *m_program; QOpenGLVertexArrayObject *m_vao; QOpenGLBuffer *m_vbo; }; ``` 这段代码使用 QtOpenGL 模块来创建一个继承自 QOpenGLWidget 的自定义 OpenGL 窗口,然后在 initializeGL() 函数中初始化着色器程序、顶数组对象和顶缓冲对象,最后在 paintGL() 函数中绘制三角形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值