学习ios Metal(2)—尺寸可调的点的绘制

2024-01-05 01:48

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

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

       

       本节源码:https://github.com/sjy234sjy234/Learn-Metal/tree/master/MetalPoint。metal图形渲染引擎,内置是支持绘制尺寸可调的点的,绘制出来是一个方形点,首先,metal的drawPrimitives方法,一共支持5种MTLPrimitiveType类型:

typedef NS_ENUM(NSUInteger, MTLPrimitiveType) {MTLPrimitiveTypePoint = 0,MTLPrimitiveTypeLine = 1,MTLPrimitiveTypeLineStrip = 2,MTLPrimitiveTypeTriangle = 3,MTLPrimitiveTypeTriangleStrip = 4,} NS_ENUM_AVAILABLE(10_11, 8_0);

        先在Objective-C中给出支持颜色的Vertex的定义:

typedef struct
{vector_float4 position;vector_float4 color;
} Vertex;

        在PointRenderer类中给出需要绘制的点的缓存分配:

//buffer definition
@property (nonatomic, strong) id<MTLBuffer> pointVertexBuffer;//buffer setup
- (void)buildResources
{static const Vertex pointVertices[] ={{ .position = { -0.5, -0.5, 0, 1 }, .color = { 1, 0, 0, 1 } },{ .position = { -0.5,  0.5, 0, 1 }, .color = { 0, 1, 0, 1 } },{ .position = {  0.5, -0.5, 0, 1 }, .color = { 0, 0, 1, 1 } },{ .position = {  0.5,  0.5, 0, 1 }, .color = { 0, 1, 0, 1 } }};_pointVertexBuffer = [_metalContext.device newBufferWithBytes:pointVerticeslength:sizeof(pointVertices)options:MTLResourceOptionCPUCacheModeDefault];
}

        最后在draw函数中调用drawPrimitives函数绘制MTLPrimitiveTypePoint即可:

[commandEncoder drawPrimitives: MTLPrimitiveTypePoint vertexStart: 0 vertexCount: 4];

        控制点的尺寸是在shader里面进行的,下面是point.metal的shader文件里面的代码,实现了点的尺寸和颜色的设置:

#include <metal_stdlib>
using namespace metal;struct Vertex
{float4 position [[position]];float4 color;
};struct PVertex{float4 position [[position]];float4 color;float size[[point_size]];
};vertex PVertex point_vertex_main(device Vertex *vertices [[buffer(0)]],uint vid [[vertex_id]])
{PVertex outVertex;outVertex.position = vertices[vid].position;outVertex.color = vertices[vid].color;outVertex.size = 30;return outVertex;
}fragment float4 point_fragment_main(PVertex inVertex [[stage_in]])
{return inVertex.color;
}

        其中的关键是在vertex_main传给fragment_main的变量PVertex有一个声明内置变量float size[[point_size]],修改size的值就可以调整绘制点的尺寸。

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



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

相关文章

使用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 ...]