博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 顶点着色_金属顶点着色器绘制纹理点
阅读量:6452 次
发布时间:2019-06-23

本文共 2553 字,大约阅读时间需要 8 分钟。

我想执行使用混合绘制Points基元的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 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);

}

转载地址:http://qcyzo.baihongyu.com/

你可能感兴趣的文章
SQL-18 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by...
查看>>
官府“开源”下的群魔乱舞——简评第八届“开源中国开源世界”高峰论坛
查看>>
安装 virtualenv
查看>>
centos下访问NTFS分区 挂载NTFS文件系统
查看>>
linux wget 下载 断点续传 限速
查看>>
WIN Apache 的 httpd.conf 详解
查看>>
JDK各版本新增的主要特性
查看>>
python连接oracle的模块cx_Oracle安装和配置
查看>>
CAPropertyAnimation
查看>>
系统故障排除
查看>>
统计在线人数-学习
查看>>
less的简单介绍
查看>>
C++基础2 引用 函数扩展: 默认值 占位符 指针 重载 类:引用类指针 声明实现分开写...
查看>>
模拟百度搜索“2012世界末日”网页地震撕裂效果
查看>>
纯CSS打造的DIV弹出层效果
查看>>
Git分支
查看>>
percona 相关工具
查看>>
我的友情链接
查看>>
WordCloud 简介
查看>>
java面向对象的三种特征简述(随笔)
查看>>