私は、oculus Rift 歪みシェーダーの OpenGL 実装に取り組んでいます。シェーダーは、(以前にレンダリングされたシーンを含むテクスチャの) 入力テクスチャ座標を取得し、歪み係数を使用してそれを変換し、変換されたテクスチャを使用してフラグメントの色を決定することによって機能します。
歪みを事前に計算して 2 番目のテクスチャに保存することでパフォーマンスを向上させたいと思っていましたが、実際には直接計算 よりも遅くなります。
直接計算バージョンは、基本的に次のようになります。
float distortionFactor(vec2 point) {
float rSq = lengthSquared(point);
float factor = (K[0] + K[1] * rSq + K[2] * rSq * rSq + K[3] * rSq * rSq * rSq);
return factor;
}
void main()
{
vec2 distorted = vRiftTexCoord * distortionFactor(vRiftTexCoord);
vec2 screenCentered = lensToScreen(distorted);
vec2 texCoord = screenToTexture(screenCentered);
vec2 clamped = clamp(texCoord, ZERO, ONE);
if (!all(equal(texCoord, clamped))) {
vFragColor = vec4(0.5, 0.0, 0.0, 1.0);
return;
}
vFragColor = texture(Scene, texCoord);
}
ここで、K はユニフォームとして渡される vec4 です。
一方、ディスプレイスメント マップのルックアップは次のようになります。
void main() {
vec2 texCoord = vTexCoord;
if (Mirror) {
texCoord.x = 1.0 - texCoord.x;
}
texCoord = texture(OffsetMap, texCoord).rg;
vec2 clamped = clamp(texCoord, ZERO, ONE);
if (!all(equal(texCoord, clamped))) {
discard;
}
if (Mirror) {
texCoord.x = 1.0 - texCoord.x;
}
FragColor = texture(Scene, texCoord);
}
縦横比を修正し、レンズ オフセットを考慮する操作は他にもいくつかありますが、それらは非常に単純です。これが単純なテクスチャ ルックアップよりも優れていると期待するのは本当に合理的ですか?