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

3
我正在尝试在iOS9的scenekit上给自定义平面形状添加纹理。我需要纹理能够覆盖整个表面并伸展开来。我有一个SCNprogram上的顶点和片段着色器。但是似乎我做错了什么,我一整天都在摆弄这个问题,我得出结论,我指定的纹理坐标不正确。
我的问题是,在创建几何图形时,SceneKit是否会自动创建纹理坐标,以便当我为纹理的一个角指定CGpoint(0,0)时,它会自动映射到几何图形的左下角?还是我必须手动指定我创建的几何图形的纹理坐标/UV?
这个问题是一个更大的问题的一部分,发布在这里: Custom Shader SCNProgram iOS 9 Scenekit 请帮忙,我已经花了一整天的时间去尝试解决,但没有成功:(
编辑:根据Locks下面的回复,我已经改变了frag着色器以帮助我排除故障。我相信它给出的结果是有意义的?见下面的图片。我的UV似乎存在问题。但为什么呢?我无法理解。

enter image description here

1个回答

3

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

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

我明白了。感谢你的着色器技巧,真厉害。我尝试过使用这个技巧。我相信这是有道理的,现在我不明白的是为什么当我在主线程上应用纹理时会出现混乱。 - AdiTheExplorer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接