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
纹理正确重复
问题:
- 在自定义片段着色器中使用采样器时,为了使 contentsTransform 值也有效,我必须更改什么?
- 如果那不可能,实现它的最简单方法是什么? (缩放,repeating.redrawing 纹理不是一个选项)
谢谢。
当使用 SCNProgram
时 contentsTransform
属性 或 SCNMaterialProperty
没有效果(因为支持是在 SceneKit 的内置顶点和片段着色器中实现的)。
您需要将 2D 矩阵传递给自定义 SCNProgram
着色器并在那里手动转换纹理坐标。
不知道为什么,但我在使用客户片段着色器时无法重复纹理
这是我的片段
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
纹理正确重复
问题:
- 在自定义片段着色器中使用采样器时,为了使 contentsTransform 值也有效,我必须更改什么?
- 如果那不可能,实现它的最简单方法是什么? (缩放,repeating.redrawing 纹理不是一个选项)
谢谢。
当使用 SCNProgram
时 contentsTransform
属性 或 SCNMaterialProperty
没有效果(因为支持是在 SceneKit 的内置顶点和片段着色器中实现的)。
您需要将 2D 矩阵传递给自定义 SCNProgram
着色器并在那里手动转换纹理坐标。