三维gis中用纹理限定多边形地理区域

在三维 gis 中经常需要在指定的多边形地理范围内做一些操作,比如地形的多边形裁剪、压平多边形区域内的倾斜摄影模型、在指定地理范围内绘制等间距的点等。这都涉及到限定多边形区域的问题。

所谓的限定多边形地理区域,核心问题在于判断某个片元是否处于多边形区域内。虽然说在CPU中通过几何算法可以判断某个点是否处于多边形区域内,但是并不适用于实时计算机图形渲染,因为空间是连续的,而点位是离散的,不可能把一个区域内的所有的地理坐标点都取完,然后依次在CPU中判断;而且在CPU中判断多边形和点的包含关系需要对凸多边形和凹多边形加以区分,较为繁琐而且性能不高。相对来说用纹理限定多边形区域更加通用,该方式不用区分凸多边形和凹多边形、纹理可以在着色器里使用,性能也更高。

 

在自定义多边形区域内做某些操作

多边形角点的原始坐标为世界坐标系下的位置,为了把多边形绘制在一张纹理上并在后续用于判断包含关系。我们要把多边形角点的世界坐标在局部坐标系(比如ENU坐标系)下转换为相对坐标;同时获得相对坐标X和Y的最大、最小值表示一个范围 u_regionBounds,传入到顶点着色器中用于计算纹理坐标。

 

世界坐标转换为相对坐标 

 

相对坐标的范围 

绘制表示多边形区域的纹理时,在顶点着色阶段:根据角点坐标 position 在范围 u_regionBounds 中的相对位置得到 [ 0, 1 ] 的纹理坐标,然后转到 [ -1, 1 ] 区间表示裁剪坐标。片元着色器直接给一个红色即可,使用时通过坐标值的R分量是否为1判断片元是否位于多边形区域内。

      attribute vec3 position;uniform vec4 u_regionBounds;void main(){vec2 regionBoundsDimension = u_regionBounds.zw - u_regionBounds.xy;vec2 xy = (position.xy - u_regionBounds.xy) / regionBoundsDimension * 2.0 - 1.0;gl_Position = vec4(xy.x, xy.y, 0.5, 1.0);}

绘制多边形区域的顶点着色器 

      void main(){gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}

绘制多边形区域的片元着色器 

在调用draw call渲染多边形到一张纹理时,设置渲染状态( render state ) 的视口大小( viewport )为图片的纹理的尺寸。这次绘制得到如下图所示的红色多边形纹理。

 

多边形区域纹理 

上面的 “多边形区域纹理” 只是记录了多边形区域的形状,把它作为 uniform 变量输入到另一次 draw call 的着色器中,用于判断多边形区域和片元的包含关系。这次在顶点着色器中也是用相对坐标和对应范围计算出纹理坐标插值给片元着色器;在片元着色阶段,从多边形区域纹理上取颜色值,如果 R 分量不为1就判定为不在多边形区域内,被剔除或者以别的方式处理该片元。

          vec2 boundsDimension = u_regionBounds.zw - u_regionBounds.xy;v_texCoord = (a_position.xy - u_bounds.xy) / boundsDimension;

使用多边形纹理 - 顶点阶段 - 计算某个片元在多边形区域纹理上的纹理坐标 

          float r = texture2D(u_regionTexture, v_texCoord).r;if (r < 0.9) {discard;}

使用多边形纹理 - 片元阶段 - 判断片元是否位于多边形区域内 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/226176.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习part12多态

99-面向对象(进阶)-面向对象的特征三&#xff1a;多态性_哔哩哔哩_bilibili 1.多态&#xff08;仅限方法&#xff09; 父类引用指向子类对象。 调用重写的方法&#xff0c;就会执行子类重写的方法。 编译看引用表面类型&#xff0c;执行看实际变量类型。 2.父子同名属性是否…

同旺科技 USB 转 RS-485 适配器 -- 隔离型

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有&#xff1a; ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11 系统32 / 64位&#xff1b; ● 支持Windows …

Vue3-基于husky的代码检查工作流

husky是一个git hooks工具&#xff08;git的钩子工具&#xff0c;可以在特定时机执行特定的命令&#xff09; 代码检查 背景&#xff1a;想要使代码上传到git仓库前进行代码检查&#xff0c;所以提前下载好git 打开项目终端&#xff0c;点击右上角选择进入Git Bash控制 1.如…

AWVS 使用方法归纳

1.首先确认扫描的网站&#xff0c;以本地的dvwa为例 2.在awvs中添加目标 输入的地址可以是域名也可以是ip&#xff0c;只要本机可以在浏览器访问的域名或ip即可 添加地址及描述之后&#xff0c;点击保存&#xff0c;就会展现出目标设置选项 business criticality译为业务关键…

Ubuntu 20.0 + mysql 8.0 用户和密码修改

第一步 下载&#xff08;简单,注意联网&#xff09;Ubuntu 终端输入以下两行命令 (1) 数据库的服务端及客户端数据库的开发软件包 sudo apt-get install mysql-server mysql-client (2) 数据库的开发软件包 sudo apt-get install libmysqlclient-dev 第二步 查看是否安装成功 …

ELK日志系统

&#xff08;一&#xff09;ELK 1、elk&#xff1a;是一套完整的日志集中处理方案&#xff0c;由三个开源的软件简称组成 2、E&#xff1a;ElasticSearch&#xff08;ES&#xff09;&#xff0c;是一个开源的&#xff0c;分布式的存储检索引擎&#xff08;索引型的非关系型数…

MX6ULL学习笔记 (一)交叉工具链的安装

前言&#xff1a; ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译 器&#xff0c;Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编译的是 ARM 架构的代码&#xff0c;因为我们编译的代码是需要烧写到ARM板子…

字符串逆序问题

写一个函数&#xff0c;可以将任意输入的字符串逆序&#xff08;要可以满足多组输入&#xff09; 这个题有三个点 1.要读入键盘输入的字符串&#xff0c;所以要用到字符串输入函数 2.可以进行多组输入 3.把输入的n组字符串都逆序 #define _CRT_SECURE_NO_WARNINGS 1 #incl…

SEAM-STRESS

模型 PCM means ‘Pixel Correlation Module’ 辅助信息 作者未提供代码

Redis(二):常见数据类型:String 和 哈希

引言 Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维⾮常重要&#xff0c;同时掌握每 种数据结构的常⻅命令&#xff0c;会在使⽤ Redis 的时候做到游刃有余。 Redis 的命令有上百种&#xff0c;我们不可能全部死记硬背下来&#xff0c;但是…

服务器中深度学习环境的配置

安装流程 11.17 日&#xff0c;周末去高校参加学术会议&#xff0c;起因&#xff0c; 由于使用了某高校内的公共有线网络&#xff0c; 远程连接服务器后&#xff0c;黑客利用 ssh 开放的 22 端口&#xff0c; 篡改了主机的配置&#xff0c; 使得只要一连上网络&#xff0c; 服…

心大数据结构题型

选择题 2021 数据处理的单位&#xff1a;数据元素 矩阵压缩存储 2022 ①单链表头插法选择 ②矩阵压缩存储&#xff0c;行优先 ③删除链表节点的时间复杂度 ④稀疏矩阵存储 ⑤平衡二叉树时间复杂度 ⑥栈和队列的出队&#xff0c;问栈的大小至少多少 ⑦拓扑排序 ⑧参考书 360…