OGeek|极客世界-中国程序员成长平台

标题: ios - Scenekit 中自定义几何体的纹理坐标 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 17:30
标题: ios - Scenekit 中自定义几何体的纹理坐标

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

我的问题是,在创建几何图形时,SceneKit 会自动创建纹理坐标,所以当我为纹理的一个角指定 CGpoint(0,0) 时,它会自动将其映射到几何图形的左下角吗?还是我必须为我创建的几何图形手动指定纹理坐标/uv?

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

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

编辑:根据下面的 Locks 响应,我更改了片段着色器以帮助我对其进行故障排除。它给我的东西我相信是有道理的?见下图。我的紫外线似乎确实有问题。但为什么?看不懂。

enter image description here



Best Answer-推荐答案


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

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

关于ios - Scenekit 中自定义几何体的纹理坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34110837/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4