【问题标题】:Texture coordinates for custom geometry in ScenekitScenekit 中自定义几何体的纹理坐标
【发布时间】:2023-04-10 08:51:01
【问题描述】:

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

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

这个问题是这里发布的一个更大问题的一部分:Custom Shader SCNProgram iOS 9 Scenekit

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

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

【问题讨论】:

    标签: ios opengl-es ios9 scenekit


    【解决方案1】:

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

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

    【讨论】:

    • 我明白了。谢谢你的着色器技巧。太棒了。我尝试使用这个技巧。我相信这是有道理的,现在我不明白为什么当我把它放在主线程中时纹理会乱七八糟。
    猜你喜欢
    • 2018-03-05
    • 2018-08-06
    • 2016-11-25
    • 2019-09-24
    • 2021-08-01
    • 1970-01-01
    • 2018-09-10
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多