Metal / Scenekit - 采样器上的重复纹理

Metal / Scenekit - Repeating texture on sampler

不知道为什么,但我在使用客户片段着色器时无法重复纹理

这是我的片段

fragment float4 bFragment( VertexOut vertexOut [[stage_in]],
                           texture2d<float, access::sample> textureInput [[texture(0)]],)
    {
constexpr sampler sampler2d(coord::normalized, address::repeat, filter::linear, address::repeat);

float4 outputColor;
outputColor = textureInput.sample(sampler2d, vertexOut.texCoord);

return float4(outputColor.x , outputColor.y , outputColor.z , 1.0);

}

这是我传递纹理的方式:

let imageProperty = SCNMaterialProperty(contents: texture)
imageProperty.wrapS  = .repeat
imageProperty.wrapT  = .repeat
imageProperty.contentsTransform = SCNMatrix4MakeScale(screenRatio * numberOfRepetitionsOnX, numberOfRepetitionsOnX , 1)
node.geometry!.firstMaterial!.setValue(imageProperty, forKey: "textureInput")

图像不重复,只是夹在物体上,不管纹理的大小。

如果我在没有客户着色器的情况下使用相同的设置:

let myMaterial = SCNMaterial()
myMaterial.lightingModel = .constant
myMaterial.diffuse.contents = texture 
myMaterial.diffuse.wrapS = .repeat
myMaterial.diffuse.wrapT = .repeat
myMaterial.diffuse.contentsTransform = SCNMatrix4MakeScale(screenRatio * numberOfRepetitionsOnX, numberOfRepetitionsOnX , 1)
node.geometry!.firstMaterial! = myMaterial

纹理正确重复

问题:

谢谢。

当使用 SCNProgramcontentsTransform 属性 或 SCNMaterialProperty 没有效果(因为支持是在 SceneKit 的内置顶点和片段着色器中实现的)。

您需要将 2D 矩阵传递给自定义 SCNProgram 着色器并在那里手动转换纹理坐标。