QT+OpenGL学习笔记(2)

发布于 2024-08-25  3079 次阅读


OpenGL基础知识的学习告一段落,毕竟我想只用OpenGL绘制平面的矢量图形而已,接下来开始实验用qt、gdal、opengl进行矢量绘制。

多边形绘制

首先OpenGL虽然可以绘制多边形,但不支持凹多边形。而且这种固定管线的绘制方法已经被淘汰了,每次都要传输坐标信息给显存,对于大规模矢量的渲染来说是不现实的。

【OpenGL】十八、OpenGL 绘制多边形 ( 绘制 GL_POLYGON 模式多边形 )_glut绘制多边形-CSDN博客

	// 只显示正面 , 不显示背面
	//glEnable(GL_CULL_FACE);

	// 设置顺时针方向 CW : Clock Wind 顺时针方向
	// 默认是 GL_CCW : Counter Clock Wind 逆时针方向 
	//glFrontFace(GL_CW);

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        //glBegin(GL_POINTS);	// 绘制点
        //glBegin(GL_LINES);	// 绘制线
		//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
        //glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且收尾相连
        //glBegin(GL_TRIANGLES); // 绘制多个三角形
        //glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
		//glBegin(GL_TRIANGLE_FAN);	// 绘制三角形扇

		// 绘制多边形
        glBegin(GL_POLYGON);

		// 1. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
		glColor4ub(255, 255, 255, 255);
        glVertex3f(0.0f, 0.0f, -10.0f);

		// 2. 设置绿色 
		glColor4ub(0, 255, 0, 255);
		glVertex3f(-5.0f, 0.0f, -10.0f);

		// 3. 设置蓝色
		glColor4ub(0, 0, 255, 255);
		glVertex3f(-5.0f, -2.0f, -10.0f);

		// 4. 设置绿色 
		glColor4ub(0, 255, 0, 255);
		glVertex3f(0.0f, -2.0f, -10.0f);



		// 5. 设置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)
		glColor4ub(255, 255, 255, 255);
		glVertex3f(0.0f, 4.0f, -10.0f);

		// 6. 设置绿色 
		glColor4ub(0, 255, 0, 255);
		glVertex3f(-5.0f, 4.0f, -10.0f);

		
        // 绘制四边形结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

    }

可编程管线,也就是VBO,VAO的模式,局限性在于只能绘制点线三角形,我们需要把矢量多边形先剖分成三角形。CGAL库太重了,我选用Poly2Tri库。

三角形剖分 CLipper2和Poly2Tri库配置

本来打算用Clipper2库的,但是发现Clipper2不能进行三角形剖分,但是这个库功能还挺多的,先记录一下以防以后用。

https://github.com/AngusJohnson/Clipper2

CLipper2 编译记录 - yuchq - 博客园 (cnblogs.com)

Clipper2中的术语和基本概念-CSDN博客

cmake 引入第三方库(头文件目录、库目录、库文件)_qt cmake 将第三方库加入到自己工程-CSDN博客

Clipper2库给了VS工程文件,直接生成dll和lib,先在cmake用绝对路径导入。

# 包含头文件目录
include_directories("D:\\coding\\libs\\Clipper2-main\\CPP\\Clipper2Lib\\include")
# 导入库
link_libraries("D:\\coding\\libs\\Clipper2-main\\DLL\\CPP_DLL\\x64\\Debug")

三角形剖分直接用Poly2Tri

https://github.com/jhasse/poly2tri

编译时遇到大麻烦。首先是ninja编译,其次只能动态编译,浪费了四小时,写个笔记方便后人了

MSVC2022 poly2tri编译 - 哔哩哔哩 (bilibili.com)

剖分之后用opengl显示,具体就不记录了,代码写的挺清楚的

GISlxz/drawShpWithOpengl: draw polygon shp with opengl (github.com)

届ける言葉を今は育ててる
最后更新于 2024-09-12