我正在尝试纹理我在iOS9上的scenekit中创建的自定义平面形状。我需要将纹理展开并在整个表面上伸展。我在SCN程序上有一个顶点和片段着色器。但是看起来我做错了什么并整天摆弄这个问题,我得出的结论是,我指定的纹理坐标不正确。
我的问题是,在创建几何体时,SceneKit是否会自动创建纹理坐标,因此当我为纹理的一个角指定CGpoint(0,0)时,它会自动将其映射到几何体的左下角?或者我是否必须手动指定我创建的几何体的纹理坐标/ uv?
此问题是此处发布的较大问题的一部分:Custom Shader SCNProgram iOS 9 Scenekit
请帮忙,我整天都在修补但没有成功:(
编辑:根据下面的锁定响应,我更改了碎片着色器以帮助我排除故障。它给我的信念是否有道理?见下图。我的UV似乎确实存在问题。但为什么?我无法理解。
答案 0 :(得分:2)
是的,在创建自定义几何体时,您还需要为每个顶点创建UV坐标。对于您已经在创建自定义几何图形时所做的事情来说,这并不是太多,只需将以下几位放入其中。
var uvList:[vector_float2] = []
//fill UV list with texture coords
let uvData = NSData(bytes: uvList, length: uvList.count * sizeof(vector_float2))
let uvSource = SCNGeometrySource(data: uvData,
semantic: SCNGeometrySourceSemanticTexcoord,
vectorCount: uvList.count,
floatComponents: true,
componentsPerVector: 2,
bytesPerComponent: sizeof(Float),
dataOffset: 0,
dataStride: sizeof(vector_float2))
let geo = SCNGeometry(
sources: [vertexSource, normalSource, colourSource, uvSource],
elements: [indexElement])
然后检查纹理坐标是否正确,我会更改片段着色器以显示它们。像下面这样的事情(因为我已经编写了一个OpenGL着色器,已经有一段时间了。)
void main() {
gl_FragColor = vec4(texCoord.x, texCoord.y, 0, 1);
}
对象的红色和绿色阴影应该告知您模型上纹理坐标的位置。如果检查结果正常,则切换回从纹理中读取数据。