金属顶点着色器绘制纹理的点

2024-04-29

我想执行 Metal(或 OpenGLES 3.0)着色器,通过混合绘制点基元。为此,我需要将纹理的所有像素坐标作为顶点传递给顶点着色器,该顶点计算要传递给片段着色器的顶点的位置。片段着色器仅输出启用混合的点的颜色。我的问题是,是否有一种有效的方法是将顶点坐标传递给顶点着色器,因为 1920x1080 图像的顶点太多,并且需要在一秒钟内完成 30 次?就像我们在计算着色器中使用dispatchThreadgroups命令所做的那样,不同之处在于计算着色器无法在启用混合的情况下绘制几何体。

编辑:这就是我所做的 -

  let vertexFunctionRed = library!.makeFunction(name: "vertexShaderHistogramBlenderRed")

    let fragmentFunctionAccumulator = library!.makeFunction(name: "fragmentShaderHistogramAccumulator")


    let renderPipelineDescriptorRed = MTLRenderPipelineDescriptor()
    renderPipelineDescriptorRed.vertexFunction = vertexFunctionRed
    renderPipelineDescriptorRed.fragmentFunction = fragmentFunctionAccumulator
    renderPipelineDescriptorRed.colorAttachments[0].pixelFormat = .bgra8Unorm
    renderPipelineDescriptorRed.colorAttachments[0].isBlendingEnabled = true
    renderPipelineDescriptorRed.colorAttachments[0].rgbBlendOperation = .add
    renderPipelineDescriptorRed.colorAttachments[0].sourceRGBBlendFactor = .one
    renderPipelineDescriptorRed.colorAttachments[0].destinationRGBBlendFactor = .one

    do {
        histogramPipelineRed = try device.makeRenderPipelineState(descriptor: renderPipelineDescriptorRed)
    } catch {
        print("Unable to compile render pipeline state Histogram Red!")
        return
    }

绘图代码:

  let commandBuffer = commandQueue?.makeCommandBuffer()
        let renderEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: renderPassDescriptor!)
        renderEncoder?.setRenderPipelineState(histogramPipelineRed!)
        renderEncoder?.setVertexTexture(metalTexture, index: 0)
        renderEncoder?.drawPrimitives(type: .point, vertexStart: 0, vertexCount: 1, instanceCount: metalTexture!.width*metalTexture!.height)
  renderEncoder?.drawPrimitives(type: .point, vertexStart: 0, vertexCount: metalTexture!.width*metalTexture!.height, instanceCount: 1)

和着色器:

  vertex MappedVertex vertexShaderHistogramBlenderRed (texture2d<float, access::sample> inputTexture [[ texture(0) ]],
                                                 unsigned int vertexId [[vertex_id]])
  {
        MappedVertex out;

constexpr sampler s(s_address::clamp_to_edge, t_address::clamp_to_edge, min_filter::linear, mag_filter::linear, coord::pixel);

ushort width = inputTexture.get_width();
ushort height = inputTexture.get_height();

float X = (vertexId % width)/(1.0*width);
float Y = (vertexId/width)/(1.0*height);

 int red = inputTexture.sample(s, float2(X,Y)).r;

 out.position = float4(-1.0 + (red * 0.0078125), 0.0, 0.0, 1.0);
 out.pointSize = 1.0;
 out.colorFactor = half3(1.0, 0.0, 0.0);

 return out;
 }

   fragment half4 fragmentShaderHistogramAccumulator ( MappedVertex in [[ stage_in ]]
                                              )
 {
    half3 colorFactor = in.colorFactor;
    return half4(colorFactor*(1.0/256.0), 1.0); 
}

也许您可以绘制一个实例化 1920x1080 次的点。就像是:

vertex float4 my_func(texture2d<float, access::read> image [[texture(0)]],
                      constant uint &width [[buffer(0)]],
                      uint instance_id [[instance_id]])
{
    // decompose the instance ID to a position
    uint2 pos = uint2(instance_id % width, instance_id / width);
    return float4(image.read(pos).r * 255, 0, 0, 0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

金属顶点着色器绘制纹理的点 的相关文章

随机推荐

  • Julia 中过时的软件包列表

    有没有办法列出 Julia 中所有过时的软件包 相当于pip3 list outdated在Python中 我做了几次搜索 1 https docs julialang org en v1 stdlib Pkg 2 https pkgdoc
  • 如何使用pytorch构建多任务DNN,例如超过100个任务?

    下面是使用 pytorch 为两个回归任务构建 DNN 的示例代码 这forward函数返回两个输出 x1 x2 用于大量回归 分类任务的网络怎么样 例如 100 或 1000 个输出 对所有输出 例如 x1 x2 x100 进行硬编码绝对
  • python string format() 与带有整数键的字典[重复]

    这个问题在这里已经有答案了 我想使用Python字符串format 充当快速而肮脏的模板 但是 那dict我想使用的键是整数 字符串表示形式 一个简化的例子如下 s hello there 5 d 5 you s format d 上面的代
  • 在 iOS 中保存加密密钥的安全方法

    在我的 iOS4 应用程序中 我在多个地方使用 AES 加密 整个应用程序必须非常安全 为了做到这一点 我必须在这个应用程序中硬编码几个密钥 然后当我需要加密某些东西时随机选择这些密钥 我的问题是如何存储这些私钥 使用硬编码它们是否安全NS
  • 如何对 numpy 数组进行采样并有效地对每个样本执行计算?

    假设我有一个一维数组 我想要的是使用移动窗口进行采样 并在窗口内将每个元素除以第一个元素 例如 如果我有 2 5 8 9 6 窗口大小为 3 结果将是 1 2 5 4 1 1 6 1 8 1 1 125 0 75 我现在所做的基本上是一个f
  • Android 中 Fragment 中的布局未浮动在键盘上方

    我有一个布局 其中有两个编辑文本和水平滚动条 片段中带有一些图标 使用相对布局约束 水平滚动视图永久固定到父级的底部 单击编辑时 默认情况下会出现软键盘 当发生这种情况时 我需要水平滚动视图浮动在软键盘上方 以便每个人都可以使用它 我已将以
  • 边界椭圆约束于水平/垂直轴

    背景 我正在尝试将地形图裁剪成围绕多个风力涡轮机的最小尺寸椭圆 以最小化地图的尺寸 执行此地图裁剪的程序可以裁剪椭圆 但仅限轴沿 x 轴和 y 轴对齐的椭圆 我知道边界椭圆问题的算法 https stackoverflow com ques
  • 如何在 DatePicker 上使用 Interactivity:Interaction.Triggers

    我正在尝试将 SelectedDateChanged 绑定到命令 以便我可以将其放置在我的 ViewModel 中 但无论如何它都不会接受此代码 http pastebin com T4q8hQBA http pastebin com T4
  • 奇怪的 UIView 坐标问题

    我正在编写一个通用应用程序 因此 我进行了设置 以便我的 XIB NIB 不是使用视图控制器创建的 而是单独创建的 然后通过将 XIB 上的类名设置为相应视图控制器的类名来链接到视图控制器 并且将文件所有者的视图链接到 XIB 上的视图 然
  • 自动旋转、UIWebView 和 UITabBarController

    我有以下视图层次结构 UITabBarController UINavigationController UIViewController only supports Portrait rotation UINavigationContro
  • 无法将“记住”内联方法调用到 @androidx.compose.runtime.Composable

    我有一个大项目 我决定向其中添加 jetpack compose 首先 我准备了一个独立的项目 其中包含一些 Composable组件 一切正常 然后 在编译期间向我的项目添加源和 preper 依赖项后 我开始收到此错误 org jetb
  • Java 数组中的最小值和最大值

    我的代码没有给出错误 但它没有显示最小值和最大值 代码是 Scanner input new Scanner System in int array new int 10 System out println Enter the numbe
  • 我是否需要在编译时添加 _REENTRANT 宏以使我的 errno 线程安全?

    我是否需要在编译时添加 REENTRANT 宏以使我的 errno 线程安全 如果不是 是所有版本的 gcc linux solaris 都是这样还是某些旧版本需要 我最近测试了一段未使用 REENTRANT 的代码 发现 errno 在多
  • SharePoint 发布 HTML 字段控件将相对 URL 转换为绝对 URL

    因此 在对是否应该在面向外部的 SharePoint 网站上使用 CEWP 还是 HTML 字段控件进行了大量研究之后 我们决定使用字段控件 非常感谢 AC 现在 我们遇到了一个问题 我读过的所有博客都说这不应该是一个问题 当我们将相对 U
  • Await.ready 和 Await.result 的区别

    我知道这是一个开放式问题 我深表歉意 我理解了Await ready回报Awaitable type while Await result回报T但我还是让他们感到困惑 两者有什么区别 一个是阻塞的 另一个是非阻塞的 它们都会阻塞直到 fut
  • 切片文字中的求值顺序

    我最近浏览了Go的 语言规范 https golang org ref spec Order of evaluation https golang org ref spec Order of evaluation但发现评估顺序与本文档中解释
  • mysql 扩展已弃用,并将在将来删除:使用 mysqli 或 PDO 代替 [重复]

    这个问题在这里已经有答案了 当我尝试从 PHP 连接到 MySQL 服务器时 我看到以下错误 已弃用 mysql 扩展已弃用 将来将被删除 在第 123 行的 path to filename php 中使用 mysqli 或 PDO 代替
  • 在 templateUrl 函数中使用 $rootScope

    我刚刚开始使用 angularJS 我有一个问题 如何访问 templateUrl 函数中使用 rootScope 定义的变量 这是我的代码 myApp config routeProvider function routeProvider
  • Laravel updateOrCreate 一对一关系

    在我的网络应用程序中我有这个模型 InstagramAccount php UserPageFeed php 每个 InstagramAccount 在 UserPageFeed 中都有一条记录 并且每个 UserPageFeed 都属于
  • 金属顶点着色器绘制纹理的点

    我想执行 Metal 或 OpenGLES 3 0 着色器 通过混合绘制点基元 为此 我需要将纹理的所有像素坐标作为顶点传递给顶点着色器 该顶点计算要传递给片段着色器的顶点的位置 片段着色器仅输出启用混合的点的颜色 我的问题是 是否有一种有