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
は、その後、私はSCNMaterial
のshaderModifiers
プロパティを使用して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レンズを置いていることです。
ご協力いただければ幸いです。
希望する出力の画像を表示できますか?あなたがグレースに提供したリンクは単なる理論的なものです。私は視覚的です。 – Confused
実際にはノードごとにテクニックを使用することはできませんが、node categoryBitmaskを使用して、ノードをフィルタリングして「通常」と屈折するものを絞り込むことができます。 (屈折したオブジェクトを除く)、drawScene(屈折したオブジェクト+屈折のためのカスタムシェイダー)] – Toyos
@Confused glens紙のセクション6を見ると、 TIMでレンダリングを達成しようとしています。リンクを編集して、あなたの論文のPDFに直接リンクする必要があります。 – Cruthe93