自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

peanutpig

hero no way home

  • 博客(52)
  • 资源 (1)
  • 收藏
  • 关注

原创 osgearth加载3dtiles(亲测可行) 及源码分析

(它的_content是空的);然后根据根json 上的children的个数, 再创建 N个 ThreeDTileNode(它的_content挂的是ThreeDTilesetContentNode);这个N个ThreeDTileNode 可以理解为 就是子文件夹的个数;他的_content可以理解为 子文件夹上的主json。在下一次遍历中会判断是否有返回值;把根json在主线程加载完毕后;下一帧的时候,会调用。并没有一直遍历的接口;它创建的对象,是放在。代表每个文件夹下的主json;

2024-03-04 17:23:15 739

原创 osgearth加载glb模型(亲测可行)

我们想在osgearth加载glb模型,但是一直找不到一种好的方法;其实有一种非常简单的方法。Registry 类;在类的构造函数中添加如下函数。但是如果只是简单的添加,是无法加载到场景中的。编译,然后运用到osgearth中,就可以了。下一步我们要打开我们的osg源码,然后找到。现在我就将该方法仔细说明一下。

2024-03-04 15:44:14 320

原创 如何判断一个点是否在多边形区域内

设多边形的顶点依次为A1,A2…An,要判断的点为P,那么分别计算向量PA1叉乘向量PA2,向量PA2叉乘向量PA3,…,向量PA(n-1)叉乘向量PAn,向量PAn叉乘向量PA1,如果这些叉乘的结果都同向的话,那么这个点就在多边形的内部。判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。

2023-04-07 15:46:54 223

原创 readRenderTargetPixels转canvas再转纹理

通过 canvas 的 context 设置数据。然后就得到了 含有canvas变量的纹理。通过canvas 到纹理。

2023-03-30 16:39:01 235

原创 GIS地形裁剪

2023-03-30 07:41:21 137

原创 osgearth 加载天地图(亲测可行)

【代码】osgearth 加载天地图(亲测可行)

2023-03-28 08:29:23 764 1

原创 cesium osgearth 屏幕空间误差理解

maxGeometricError是地球赤道的周长/像素数(表示:一个像素代表多少米)该角度是 瓦片二分之一高度下世界高度 除以 相机距离瓦片的距离的。sseDenominator是相机fovy角度的tan值的2倍。height 表示屏幕高 多少像素。

2023-03-24 14:28:12 459

原创 webgl 将纹理转换回 图像

gl 可以通过webgl纹理的变量 _context._gl 获得。可以将img.src 字符串直接复制到浏览器搜索栏查看。

2023-03-17 11:11:39 231

原创 右手和左手坐标系的区别

右手坐标系: 左手坐标系:

2023-02-17 10:43:10 143

原创 cesium 创建初始影像代码位置

cesium用来下载影像图片的代码位置:

2023-02-16 15:29:49 72

原创 cesium 使用天地图

天地图的 key 可以到 天地图官网申请。我的天地图账号是如下。

2023-02-16 15:26:04 511 1

原创 THREE.MeshBasicMaterial 的 vertexShader

我们使用MeshBasicMaterial 时,其实threejs本身是自带了shader的,下面就是它本身自带的顶点着色器的代码:

2023-01-31 11:32:08 130

原创 THREE.MeshBasicMaterial 的 fragmentShader

我们使用MeshBasicMaterial 时,其实threejs本身是自带了shader的,下面就是它本身自带的片段着色器的代码:#endif#else#endif。

2023-01-31 11:29:37 195

原创 threejs shader中的视图矩阵理解

在shader中 常常会出现一个 viewMatrix;在相机内部会进行声明,在自己写的shader就可以直接使用。

2022-12-14 11:15:18 195

原创 cesium 显示线框模式

cesium 地形瓦片 使用线框模式显示在cesium源码GlobeSurfaceTileProvider.js 文件内,找到wireframe,然后将他设置成true。 结果如下图所示:

2022-12-06 13:50:35 791 1

原创 rgb颜色压缩---rgb颜色转int值

function RGBToHex (color) { var hex = color.toString(16); if (hex.length == 1) { hex = '0' + hex } return hex; } function getHEX(color) { retu

2022-11-24 09:07:00 439

原创 threejs 显示 THREE.WebGLRenderTarget 纹理图片

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2022-11-22 08:46:57 523

原创 gl_FragDepth写入深度值,gl_FragCoord读取深度值

输入变量gl_FragCoord能让我们读取当前片段的窗口空间坐标,并获取它的深度值,但是它是一个只读(Read-only)变量。我们不能修改片段的窗口空间坐标,但实际上修改片段的深度值还是可能的。GLSL提供给我们一个叫做gl_FragDepth的输出变量,我们可以使用它来在着色器内设置片段的深度值。gl_FragCoord的x和y分量是片段的窗口空间(Window-space)坐标,其原点为窗口的左下角。gl_FragCoord的z分量等于对应片段的深度值。

2022-11-18 11:08:22 700

原创 VS2017设置程序依赖的dll环境路径

设置所有依赖的路径: PATH=F:\OsgEarth\OpenSceneGraph-3.6.5\build\bin;VS2017设置程序其他的依赖的dll 的环境路径。这样可以减少我们工程中配置环境的烦恼。

2022-11-17 09:13:15 1122

原创 osg 判断多边形凹凸

bool hasHollowPoint(std::vector<osg::Vec3d> allPoints){std::vector<osg::Vec3d> pHollowPoints;auto num = allPoints.size();osg::Vec3d pHollowNor = (allPoints[num - 1] - allPoints[0]) ^ (allPoints[1] - allPoints[0]);osg::Vec3d Nor;fo

2022-01-26 16:13:19 530

原创 CMAKE find_package osg

set(OSG_DIR /home/dx/data/test/learnOsg/Depend/Debug)find_package(OpenSceneGraph COMPONENTS osg osgViewer osgGA osgDB osgManipulator osgSim osgParticle osgText osgUtil osgWidget osgShadow osgFX REQUIRED)include_directories( ${PROJECT_BINARY_DI.

2022-01-18 18:33:41 390

原创 vulkan-队列族

Vulkan 的几乎所有操作,从绘制到加载纹理都需要将操作指令提交给一个队列,然后才能执行。Vulkan 有多种不同类型的队列,它们属于不同的队列族,每个队列族的队列只允许执行特定的一部分指令。比如,可能存在只允许执行计算相关指令的队列族和只允许执行内存传输相关指令的队列族。我们需要检测设备支持的队列族,以及它们中哪些支持我们需要使用的指令。为了完成这一目的,我们添加了一个叫做 findQueueFamilies 的函数,这一函数会查找出满足我们需求的队列族。目前而言,我们需要的队列族只需要

2022-01-17 15:16:43 173

原创 vulkan-校验层

校验层是什么?Vulkan API 的设计是紧紧围绕最小化驱动程序开销进行的,所以,默认情况下,Vulkan API 提供的错误检查功能非常有限。很多很基本的错误都没有被 Vulkan 显式地处理,遇到错误程序会直接崩溃或者发生未被明确定义的行为。Vukan 需要我们显式地定义每一个操作,所以就很容易在使用过程中产生一些小错误,比如使用了一个新的 GPU 特性,却忘记在逻辑设备创建时请求这一特性。然而,这并不意味着我们不能将错误检查加入 API 调用。Vulkan 引入了校验层来优雅地解

2022-01-17 15:00:52 151

原创 vulkan-实例

VkApplicationInfo appInfo{};appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;appInfo.pApplicationName = "Hello Triangle";appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);appInfo.pEngineName = "No Engine";appInfo.engineVersion = VK_MAKE_VER

2022-01-17 14:35:35 150

原创 qt QTreeWidget

QTreeWidget* treewidget = new QTreeWidget; treewidget->setHeaderHidden(true); treewidget->expandAll(); _terrainItem = new QTreeWidgetItem(treewidget); _terrainItem->setText(0,""); treewidget->addTopLevelIte...

2022-01-14 14:05:23 245

原创 vulkan杂记-描述符池和描述符集

上一章我们介绍了用于描述可以绑定的描述符类型的描述符布局。在这一章节,我们为每一个 vkBuffer 创建描述符集,将其和 uniform 缓冲描述符进行绑定。描述符池描述符集不能被直接创建,需要通过描述符池来分配。我们添加一个叫做 createDescriptorPool 的函数来进行描述符池的创建:描述符集不能被直接创建,需要通过描述符池来分配。我们通过 VkDescriptorPoolSize 结构体来对描述符池可以分配的描述符集进行定义:VkDescriptorPoolSi

2022-01-12 15:07:08 227

原创 vulkan杂记-描述符布局

我们已经可以传递顶点属性给顶点着色器,但对于一些所有顶点都共享的属性,比如顶点的变换矩阵,将它们作为顶点属性为每个顶点都传递一份显然是非常浪费的。Vulkan 提供了资源描述符来解决这一问题。描述符是用来在着色器中访问缓冲和图像数据的一种方式。我们可以将变换矩阵存储在一个缓冲中,然后通过描述符在着色器中访问它。使用描述符需要进行下面三部分的设置:• 在管线创建时指定描述符布局• 从描述符池分配描述符集• 在渲染时绑定描述符集描述符布局用于指定可以被管线访问的资源类型,类似渲染

2022-01-12 10:35:49 244

原创 vulkan杂记-暂存缓冲

上一篇中,我们的顶点缓冲使用的内存类型并不是适合显卡读取的最佳内存类型。最适合显卡读取的内存类型具有 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 标记,含有这一标记的内存类型通常 CPU 无法直接访问。在本章节,我们会创建两个顶点缓冲。一个用于 CPU 加载数据,一个用于显卡设备读取数据。我们通过缓冲复制指令将 CPU 加载到的缓冲中的数据复制到显卡可以快速读取的缓冲中去。传输队列缓 冲 复 制 指 令 需 要 提 交 给 支 持 传 输 操 作 的

2022-01-12 09:20:29 99

原创 OpenCV string 转 图片

std::string strPicture = “...”;cv::Mat mat2(1, strPicture.size(), CV_8U, (char*)strPicture.data());cv::Mat psrc = cv::imdecode(mat2, CV_LOAD_IMAGE_COLOR);cv::Mat dst;psrc.convertTo(dst, CV_8UC3);cv::cvtColor(dst,dst,CV_BGR2RGB);QImage pixmap((c.

2022-01-12 08:55:00 1521

原创 vulkan杂记-顶点缓存

Vulkan 的缓冲是可以存储任意数据的可以被显卡读取的内存。和之前我们见到的 Vulkan 对象不同,缓冲对象并不自动地为它们自己分配内存。填写 VkBufferCreateInfo 结构体:VkBufferCreateInfo b u f f e r I n f o = {};b u f f e r I n f o . sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;bufferInfo . size = sizeof ( vertices [

2022-01-11 13:40:22 152

原创 vulkan杂记-子流程依赖

渲染流程的子流程会自动进行图像布局变换。这一变换过程由子流程的依赖所决定。子流程的依赖包括子流程之间的内存和执行的依赖关系。虽然我们现在只使用了一个子流程,但子流程执行之前和子流程执行之后的操作也被算作隐含的子流程。在 渲 染 流 程 开 始 和 结 束 时 会 自 动 进 行 图 像 布 局 变 换,但 在 渲 染 流程 开 始 时 进 行 的 自 动 变 换 的 时 机 和 我 们 的 需 求 不 符, 变 换 发 生 在 管线 开 始 时,但 那 时 我 们 可 能 还 没

2022-01-10 14:28:32 286

原创 vulkan杂记-信号量

drawFrame 函数用于执行下面的操作:• 从交换链获取一张图像• 对帧缓冲附着执行指令缓冲中的渲染指令• 返回渲染后的图像到交换链进行呈现操作上面这些操作每一个都是通过一个函数调用设置的, 但每个操作的实际执行却是异步进行的。函数调用会在操作实际结束前返回,并且操作的实际执行顺序也是不确定的。而我们需要操作的执行能按照一定的顺序,所以就需要进行同步操作。栅栏 (fence) 和信号量 (semaphore) 的不同之处是,我们可以通过调用 vkWaitForFences

2022-01-10 14:19:05 143

原创 vulkan杂记-栅栏fence

栅栏 (fence) 和信号量 (semaphore) 类似,可以用来发出信号和等待信号。我们为每一帧创建一个 VkFence 对象:s t d : : v e c t o r <VkSemaphore> imageAvailableSemaphores ;2s t d : : v e c t o r <VkSemaphore> renderFinishedSemaphores ;3s t d : : v e c t o r <VkFence> i n F l

2022-01-10 13:57:49 287

原创 四元数、欧拉角互相转换

void QuatToHPR(osg::Quat q, double& heading, double& pitch, double& roll){double test = q.y() * q.z() + q.x() * q.w();if (test > 0.4999){ // singularity at north poleheading = 2.0 * atan2(q.y(), q.w());pitch = osg::PI_2;roll ...

2021-12-31 11:19:55 277

原创 osgearth经纬度坐标系转换

假设您在经纬度(wgs84)中有一个点,您需要在UTM区域15N中表示它:(从wgs84坐标系转换到其他经纬度坐标系)const SpatialReference* wgs84 = SpatialReference::get("wgs84");const SpatialReference* utm15 = SpatialReference::get("+proj=utm +zone=15 +ellps=GRS80 +units=m");GeoPoint wgsPoint( wgs84, -

2021-12-31 10:02:45 2672

原创 osg frame

osg的顶点坐标和索引信息是由osg::Geometry类负责保存的,那么负责将Geometry对象的数据传递给State对象的,就是渲染树的叶节点RenderLeaft了。在Geometry类的绘制过程中,则将自己记录的数据信息传递给State对象,由它负责完成顶点的载入和处理工作。而渲染树在其中的作用,就是抽取每个渲染树节点RenderBin中的渲染叶RenderLeaf对象,交由osg::State整合它在状态树中继承的全部渲染状态,并将几何体数据传递给OpenGL管线,完成绘制的工作。

2021-12-21 09:47:59 142

原创 OpenGL 杂记

当我们在顶点着色器输出一个裁切空间顶点位置到gl_Position时,OpenGL自动进行一个透视除法,将裁切空间坐标的范围-w到w转为-1到1,这要将x、y、z元素除以向量的w元素来实现。也就是说gl_Position从顶点着色起 到 片元着色起 会除以 w 。当一个点比光的远平面还要远时,它的投影坐标的z坐标大于1.0。这种情况下,GL_CLAMP_TO_BORDER环绕方式不起作用,因为我们把坐标的z元素和深度贴图的值进行了对比;在深度缓冲区中包含深度值介于0.0和1.0之间.

2021-12-19 13:38:09 229

原创 格拉姆-施密特正交化

vec3 T = 代表三维空间中的 一条线vec3 N // N 代表法线T = normalize(T - dot(T, N) * N);vec3 B = cross(T, N);mat3 TBN = mat3(T, B, N);

2021-12-17 17:41:37 708

原创 数据归一化

数据归一化到[a,b]区间范围的方法:(1)首先找到样本数据Y的最小值min及最大值max(2)计算系数为:k=(b-a)/(max-min)(3)得到归一化到[a,b]区间的数据:y=a+k(x-min)

2021-12-17 17:21:37 98

原创 vscode c++配置

tasks.json 主要用于编译{"version": "2.0.0","tasks": [{"type": "shell","label": "rs_debug","command": "cd ./DebugBuild ; make -j 4","args": [],"options": {},"problemMatcher": [],"group": "build"},{"type": "shell","label": "rs_r

2021-12-17 13:14:03 758

Learning_Vulkan.tar.xz

vulkan教程

2021-07-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除