学习ios Metal(3)—宽度可调的线条的绘制

2024-01-05 01:48

本文主要是介绍学习ios Metal(3)—宽度可调的线条的绘制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        metal的基础知识入门,首推Metal By Example系列:http://metalbyexample.com/。博主的相关文章,主要给出工程实际遇到的典型问题及其解决方案。

        

        本节源码:https://github.com/sjy234sjy234/Learn-Metal/tree/master/MetalLine。

        根据苹果官方的说法,metal是一个底层的图形API,因此它与opengles不同,没有提供任何上层封装的常用功能的实现。其中绘制有宽度的线条,在opengles是内置支持的,但是metal内置并不支持。如上一节所说,MTLPrimitiveType中包含MTLPrimitiveTypeLine类型,但是调用drawPrimitives进行线条绘制时,只能得到固定宽度为1pixel的线条,不能进行宽度调整:https://github.com/sjy234sjy234/Learn-Metal/tree/master/MetalLinePrimitive。下面给出一种利用矩形模拟有宽度的线条的方法进行宽度可调的线条的绘制。

        首先介绍一下原理,会涉及到一点点的几何数学。假设在二维平面上,需要绘制宽度为W的线段P1P2,其中P1(x1, y1)、P2(x2, y2)坐标已知,宽度W已知。如图所示,只需要绘制两个实心的三角形PaPbPc和PaPcPd即可。

                    

        代码中实现计算Pa, Pb, Pc, Pd这4个点时,采用了向量的方式:

    float thickness=0float4 position1=vertices[lineIndex1].position;float4 position2=vertices[lineIndex2].position;.02;float4 v = position2 - position1;float2 p0 = float2(position1.x,position1.y);float2 v0 = float2(v.x,v.y);float2 v1 = thickness * normalize(v0) * float2x2(float2(0,-1),float2(1,0));float2 pa = p0 + v1;float2 pb = p0 - v1;float2 pc = p0 - v1 + v0;float2 pd = p0 + v1 + v0;

         参见博主给出的源码,每一条线段可以看成一个绘制的实例,每个绘制实例由2个三角形构成,下面是对于每个实例,根据vertex_main中传入的vid(0~5)来确定具体要传递给fragment_main的是Pa, Pb, Pc, Pd中的哪一个点。即每条宽线段是由2个三角形、4个点和6个index(vid)来解释的,需要对实例的绘制有所理解。

    Vertex outVertex;switch(vid){case 0:outVertex.position = float4(pa.x,pa.y,position1.z,position1.w);break;case 1:outVertex.position = float4(pb.x,pb.y,position1.z,position1.w);break;case 2:outVertex.position = float4(pc.x,pc.y,position2.z,position2.w);break;case 3:outVertex.position = float4(pa.x,pa.y,position1.z,position1.w);break;case 4:outVertex.position = float4(pc.x,pc.y,position2.z,position2.w);break;case 5:outVertex.position = float4(pd.x,pd.y,position2.z,position2.w);break;}outVertex.color={1.0,0.0,0.0,1.0};return outVertex;

        PS:关于实例绘制的基础请参考:http://metalbyexample.com/的第11章。demo中给出的是直接在ndc坐标系中绘制的直线,具体到绘制三维模型的线框图的实现时,既要考虑遮挡关系,又要考虑正反面,博主会在后续给出三维模型的线框图的渲染实现。

这篇关于学习ios Metal(3)—宽度可调的线条的绘制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/571274

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]