2016-11-02 11 views
6

glensesという特別な種類の理論レンズで3Dシーンを視覚化するプロジェクト用のios 9アプリケーションを作成しようとしています。SceneKitで屈折をシミュレート

TIMと呼ばれるレイトレーシングプログラムは、これらのグレースなどをシミュレートするために、すでに基本から書かれていますが、これを単にiosに移植するのは不可能です。

サイトを検索した結果(つまり、this回答や他の多くのシェイダーでは)可能であるはずですが、目的の効果を得るのが苦労しています。

は、私が最初に、より複雑な谷間タイプの屈折上に移動する前に、屈折の単純な形式を実装することによって開始することを決定した:

私はカメラに取り組んで樽型歪曲(魚眼レンズ)効果を得ることができましたSCNTechniqueを使用していますが、個々のジオメトリではなく、カメラやシーン全体のテクニックしか使用できないようです。 hereを発見

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] 

私はわずかに改変使用シェーダ:

fisheye.vsh

は、その後、私はSCNMaterialshaderModifiersプロパティを使用してOpenGLのコードを注入することによって、ジオメトリに適用される樽型の歪曲収差の効果を得ることを試みました

varying vec2 uv; 

#pragma body 

gl_Position = a_position; 
uv = a_position.xy; 

fisheye.fsh

uniform sampler2D colorSampler; 
const float PI = 3.1415926535; 
const float barrelPower = 0.5; 
uniform vec2 rg; 
uniform vec2 uv2; 
varying vec2 uv; 
uniform float d; 
uniform vec2 xy; 
uniform vec2 Vertex_UV; 

vec2 Distort(vec2 p) 
{ 
    float theta = atan(p.y, p.x); 
    float radius = length(p); 
    radius = pow(radius, barrelPower); 
    p.x = radius * cos(theta); 
    p.y = radius * sin(theta); 
    return 0.5 * (p + 1.0); 
} 

#pragma body 
#pragma transparent 

vec2 xy = 2.0 * Vertex_UV.xy - 1.0; 
vec2 rg = 2.0 * uv.xy - 1.0; 
vec2 uv2; 
float d = length(xy); 
if (d < 1.0){ 
    uv2 = Distort(xy); 
}else{ 
    uv2 = uv.xy; 
} 

gl_FragColor = texture2D(colorSampler, uv2); 

これらのシェーダはコンパイルされ、シーン内のオブジェクトにロードされますが、何もしません。注入されたシェーダなしでオブジェクトがほぼ透明である場合、オブジェクトは不透明で白色です。#pragma transparentディレクティブは、それを透明にする必要があります。

私がここで達成しようとしているのは、向こう側にあるものの屈折した画像を見て見ることができるシーンに3Dレンズを置いていることです。

ご協力いただければ幸いです。

+0

希望する出力の画像を表示できますか?あなたがグレースに提供したリンクは単なる理論的なものです。私は視覚的です。 – Confused

+0

実際にはノードごとにテクニックを使用することはできませんが、node categoryBitmaskを使用して、ノードをフィルタリングして「通常」と屈折するものを絞り込むことができます。 (屈折したオブジェクトを除く)、drawScene(屈折したオブジェクト+屈折のためのカスタムシェイダー)] – Toyos

+0

@Confused glens紙のセクション6を見ると、 TIMでレンダリングを達成しようとしています。リンクを編集して、あなたの論文のPDFに直接リンクする必要があります。 – Cruthe93

答えて

2

SceneKitデフォルトシェーダプログラムの代わりに独自の頂点シェーダとフラグメントシェーダを使用する場合は、SCNShaderModifierEntryPointの代わりにSCNProgramも使用します。

SCNShaderModifierEntryPointsは、Swiftのデフォルトシェーダプログラムの変更のみを許可しています。

let material = SCNMaterial() 
      let program:SCNProgram = SCNProgram() 
      do { 
       program.vertexShader = try String(contentsOfFile: Bundle.main.path(forResource: "fisheye", ofType: "vsh")!, encoding: String.Encoding.utf8) 
      } catch let error { 
       print("shaderReadingError:\(error)") 
      } 
      do { 
       program.fragmentShader = try String(contentsOfFile: Bundle.main.path(forResource: "fisheye", ofType: "fsh")!, encoding: String.Encoding.utf8) 
      } catch let error { 
       print("shaderReadingError:\(error)") 
      } 

    // and also your vertex shader has lack. 
    // You have to add some geometry source and transformation matrix to the vertex shader first with setSemantic method. 

      program.setSemantic(SCNGeometrySource.Semantic.vertex.rawValue, forSymbol: "vPosition", options: nil) 
      program.setSemantic(SCNGeometrySource.Semantic.texcoord.rawValue, forSymbol: "uv", options: nil) 
      program.setSemantic(SCNModelViewProjectionTransform, forSymbol: "uMVPMatrix", options: nil) 





    // and also your fragment shader expect some realtime data like 
    // colorSampler, rg, uv2, d, xy, Vertex_UV 
    // you have to use handleBinding block to update this values before rendering the object. 
      material.handleBinding(ofSymbol: "resolution", handler: { (programId:UInt32, location:UInt32, node:SCNNode?, renderer:SCNRenderer) in 


      }) 


      material.program = program 
      yourNode.geometry.firstMaterial = material