将纹理采样器传递到金属文件

问题描述 投票:0回答:1

以下是一个简单的片段着色器

fragment float4 FragmentShader_PS(
VertexOut_PS input [[stage_in]]
,texture2d<float, access::sample> tex2dInput [[texture(0)]]
,sampler passedSamplerObject [[sampler(0)]])
{
float2 curTexCoord(input.texCoord.x, input.texCoord.y);
float4 curSamp = tex2dInput.sample(passedSamplerObject, curTexCoord);
return curSamp;
}

我可以使用快速边代码访问它。在下面的代码片段中,您可以看到我正在使用 SCNProgram 将着色器附加到 SceneKit 中的平面,并且我正在为纹理采样器指定要放置到平面上的图像。

快速代码:

let gridProgram = {
let p = SCNProgram()
p.vertexFunctionName = "VertexShader_PS"
p.fragmentFunctionName = "FragmentShader_PS"
p.isOpaque = false;
return p
}()
    
currentMaterial.program = gridProgram
    
if let cornersImage = UIImage(named: "corners2") {
currentMaterial.setValue(SCNMaterialProperty(contents: cornersImage),   forKey: "tex2dInput")
}

到目前为止非常简单,好吧,现在我想弄清楚的是如何将采样器传递给片段着色器(passedSamplerObject)上的采样器参数,这是否可以使用简单的调用以及 SCNProgram 代码,如:

currentMaterial.setValue(// place the reference to the MTLSamplerState here

第二个问题,是否可能,是否有在 SCNSHadable 函数中将纹理采样器从 cpu 发送到 GPU 的示例代码?即作为 .shaderModifier 的一部分? 或者我是否必须建立金属设备,制作命令队列,引用管道描述符上的顶点和片段函数,然后使用金属设备制作带有采样器描述符的采样器,如果这是这样做的方法,那么有一个代码示例,因为我无法通过快速代码创建采样器来弄清楚如何在金属文件中的特定片段函数上正确引用采样器参数..

shader scenekit metal
1个回答
0
投票

您无需单独设置图像和采样器,而是设置单个

SCNMaterialProperty

SCNMaterialProperty
上,您可以将
contents
属性更改为任何内容(纹理、颜色、视频等),您还可以配置像
wrapS
这样的属性,SceneKit 将使用这些属性来配置采样器。

SCNShadable.h
头文件有更多信息和示例。

© www.soinside.com 2019 - 2024. All rights reserved.