Scenekit 中自定义几何体的纹理坐标

Texture coordinates for custom geometry in Scenekit

我正在尝试对我在 iOS9 上的 scenekit 中创建的自定义平面形状进行纹理处理。我需要纹理在整个表面上展开和伸展。我在 SCN 程序上有一个顶点和片段着色器。但似乎我做错了什么,整天摆弄这个,我得出的结论是我指定的纹理坐标不知何故不正确。

我的问题是,在创建几何体时,SceneKit 是否会自动创建纹理坐标,因此当我为纹理的一个角指定 CGpoint(0,0) 时,它会自动将其映射到几何体的左下角?或者我是否必须为我创建的几何体手动指定纹理 coordinates/uv?

此问题是此处发布的更大问题的一部分:Custom Shader SCNProgram iOS 9 Scenekit

请帮忙,我花了一整天的时间修补但没有成功:(

编辑:根据下面的 Locks 响应,我更改了片段着色器以帮助我解决问题。我相信它给了什么是有道理的?见下图。我的 UV 似乎确实有问题。但为什么?看不懂。

是的,在创建自定义几何体时,您还需要为每个顶点创建 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);  
}

对象的红色和绿色阴影应该会告诉您模型上的纹理坐标。如果检查正常,则切换回从纹理读取数据。