菜鸟教程小白 发表于 2022-12-12 22:09:13

ios - SceneKit:增加用于 SCNNode Material 的纹理的清晰度?


                                            <p><p>我们的应用程序允许用户上传自定义图像作为 SCNNodes 的 Material ,您可以从下面的屏幕截图和代码中看到。</p>

<p>屏幕截图 1 显示 Material 使用比例为 1 时的 SCNNodes。</p>

<p>屏幕截图 2 显示了相同的节点,比例为 2。</p>

<p>虽然使用 2 的比例会显着锐化纹理/ Material ,但由于 <code>wrapS</code> 和 <code>wrapT</code> 属性,它也会重复图像。对这些属性使用 <code>Mirror</code> 或 <code>Clamp</code> 而不是 <code>Repeat</code> 没有帮助。</p>

<p>在 SceneKit 或 UIKit 中,您提供更高分辨率的图像并按比例缩小以提高不同设备的清晰度。例如,对于一个 50x50 的按钮,您提供一个 100x100 的图像。您可以通过在底部的 UIKit 组件中查看相同图像的锐度来查看相同图像的 UIKit 锐度和 SceneKit 锐度之间的对比。</p>

<p>1) 您如何将相同的原理应用于 SceneKit?</p>

<p>2) 更重要的是,如何在避免重复行为的同时实现截图 2 的纹理/ Material 清晰度?</p>

<p><strong>代码:</strong></p>

<pre><code>// Create box geometry
let box = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.0)
box.firstMaterial!.diffuse.contents = style.getContents() // This returns a UIImage
box.firstMaterial!.specular.contents = UIColor.whiteColor()

// Increase resolution for image styles
let scale = Float(2)
if style.type == .Image {
    box.firstMaterial!.diffuse.contentsTransform = SCNMatrix4MakeScale(scale, scale, scale)
    //box.firstMaterial!.locksAmbientWithDiffuse = true
    box.firstMaterial!.diffuse.wrapS = .Repeat
    box.firstMaterial!.diffuse.wrapT = .Repeat
    box.firstMaterial!.diffuse.mipFilter = .Linear
}
</code></pre>

<p><strong>纹理:</strong></p>

<p> <a href="/image/9gLLt.png" rel="noreferrer noopener nofollow"><img src="/image/9gLLt.png" alt="enter image description here"/></a>
<a href="/image/tl1bO.png" rel="noreferrer noopener nofollow"><img src="/image/tl1bO.png" alt="enter image description here"/></a>
<a href="/image/bCByi.png" rel="noreferrer noopener nofollow"><img src="/image/bCByi.png" alt="enter image description here"/></a> </p>

<p><strong>屏幕截图 1:</strong>
<a href="/image/pyFrh.jpg" rel="noreferrer noopener nofollow"><img src="/image/pyFrh.jpg" alt="enter image description here"/></a> </p>

<p><strong>屏幕截图 2:</strong>
<a href="/image/NRHKm.jpg" rel="noreferrer noopener nofollow"><img src="/image/NRHKm.jpg" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您需要考虑图像将在屏幕上占据的实际像素、最接近相机的位置以及最大程度的透视失真。</p>

<p>因此,举例来说,靠近相机的立方体,在场景的左侧,可能有一个非常靠近相机“镜头”的边缘,并且占据了(例如)大部分 y屏幕的轴(高度)。如果这是您游戏中的常见场景,那么以猜测(实际)像素为单位的大小可以让您了解需要多大的纹理才能获得清晰度。</p>

<p>这是 3D 引擎中存在 LOD(细节级别)功能的原因之一,因此并非场景中的所有对象都需要始终具有最佳、最高质量的纹理,也不需要最大数量的多边形来表达它们的形状。</p>

<p>大多数 3D 引擎中还有不同类型的纹理处理算法,用于平滑处理。如果它们存在于 SceneKit 中,将它们关闭也将是获得清晰(呃)纹理的一大优势。</p>

<h2>几何细节层次</h2>

<p>(不直接适用于您的请求,但显示了它是如何工作的)</p>

<p> <a href="https://developer.apple.com/reference/scenekit/scnlevelofdetail" rel="noreferrer noopener nofollow">https://developer.apple.com/reference/scenekit/scnlevelofdetail</a> </p>

<h2>纹理“缩放”(mip 映射)</h2>

<p>这更适用。这个“技巧”真的很老了,我记得从第一张 3D 卡片开始。它使您的纹理更小:</p>

<p> <a href="https://developer.apple.com/reference/scenekit/scnmaterialproperty/1395398-mipfilter" rel="noreferrer noopener nofollow">https://developer.apple.com/reference/scenekit/scnmaterialproperty/1395398-mipfilter</a> </p>

<p>第二次看,我认为这是非常自动的:</p>

<p>从上面的页面:</p>

<blockquote>
<p>&#34;SceneKit automatically creates several mipmap levels for the material
property’s image contents, each at a fraction of the original image’s
size. When rendering, SceneKit automatically samples texels from the
mipmap level closest to the size being rendered.&#34;</p>
</blockquote></p>
                                   
                                                <p style="font-size: 20px;">关于ios - SceneKit:增加用于 SCNNodeMaterial 的纹理的清晰度?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39541747/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39541747/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - SceneKit:增加用于 SCNNode Material 的纹理的清晰度?