我正在尝试为一个项目创建一个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)