相关疑难解决方法(0)

在SceneKit中模拟折射

我正在尝试为一个项目创建一个ios 9应用程序,它将使用这些特殊的理论镜头(称为glenses)来显示3D场景.

一个名为TIM的射线追踪程序已经从头开始编写,用于模拟这些格伦等等,但简单地将其移植到ios是不可行的.

我在搜索网站时的理解(即这个答案以及着色器上的许多其他内容)是它应该是可能的,但我很难获得理想的效果.

我决定在开始进行更复杂的glens类型折射之前,首先实现一种更简单的折射形式:

我能够在相机上使用桶形失真(鱼眼镜头)效果SCNTechnique,但是看起来你只能在相机或整个场景上使用技术,而不是单个几何体.

之后我尝试通过使用SCNMaterial's shaderModifiers属性注入opengl代码来获得应用于几何的桶形失真效果:

    var shaders = [SCNShaderModifierEntryPoint: String]()

    try! shaders[SCNShaderModifierEntryPoint.fragment] = String(contentsOfFile: Bundle.main.path(forResource: "FishEye", ofType: "fsh")!, encoding: String.Encoding.utf8)

    try! shaders[SCNShaderModifierEntryPoint.geometry] = String(contentsOfFile: Bundle.main.path(forResource: "FishEye", ofType: "vsh")!, encoding: String.Encoding.utf8)

    let material = SCNMaterial()
    material.shaderModifiers = shaders
    object.geometry?.materials = [material]
Run Code Online (Sandbox Code Playgroud)

我在这里使用了稍加修改的着色器:

fisheye.vsh

varying vec2 uv;

#pragma body

gl_Position = a_position;
uv = a_position.xy;
Run Code Online (Sandbox Code Playgroud)

fisheye.fsh

uniform sampler2D colorSampler;
const float PI = 3.1415926535;
const float barrelPower = …
Run Code Online (Sandbox Code Playgroud)

physics ios scenekit

6
推荐指数
1
解决办法
885
查看次数

哪些是在 SCNProgram 传递的金属着色器中使用的正确矩阵值,以获得正确的镀铬反射

我正在开发一个应用程序,它应该在天空盒内渲染镀铬风格的反射球状物体(使用六面立方体贴图)。

我正在 Swift 中使用 Scenekit 以不同的方法执行此操作。

只要我让 Scenekit 完成所有工作,一切都很好并且完美反映(参见下图 1) - 换句话说,使用金属度 1.0、粗糙度 0.0 和颜色 UIColor.white 的标准 SCNMaterial(使用 .physicallyBased 作为照明模型)附加到节点几何体的第一个材质(包括定向光)。

图1-正确的反射

但目标是使用 SCNProgram 附加到节点的材质)及其自己的顶点和片段着色器 - 对应于 Apple 的相关文档。我有一个工作场景,但对象上的反射是错误的(如下面的图 2 所示)

图2-错误的反映

主要问题是:要使用scn_nodescn_frame (在shaders.metal 文件中)中的正确矩阵值,以获得与图 1 中的 Scenekit 相同的对象反射。但是将 SCNProgram 与着色器一起使用仅(并且没有光)。不幸的是,Apple 没有提供有关 SCNProgram 提交给着色器的不同矩阵以及使用哪个矩阵的大量信息 - 或示例。

这是我当前的顶点着色器,其中我假设使用了一些错误的矩阵(我留下了一些注释掉的代码,以显示已经测试过的内容,未注释掉的代码对应于图 2 的 1:1):

vertex SimpleVertexChromeOrig myVertexChromeOrig(MyVertexInput in [[ stage_in ]],
                              constant SCNSceneBuffer& scn_frame [[buffer(0)]],
                              constant MyNodeBuffer& scn_node [[buffer(1)]])
{

SimpleVertexChromeOrig OUT;

OUT.position = scn_node.modelViewProjectionTransform * float4(in.position, 1.0);
// …
Run Code Online (Sandbox Code Playgroud)

reflection shader scenekit metal scnprogram

5
推荐指数
1
解决办法
1259
查看次数

标签 统计

scenekit ×2

ios ×1

metal ×1

physics ×1

reflection ×1

scnprogram ×1

shader ×1