問題をより詳細に定義する前に、すべてをどのように設定したかを説明することから始めるべきだと思います。
基本的に、(x、y、z、u、v) として定義された単純な平面メッシュがあります。
_vertices = Vector.<Number>([
-1, -1, 0, 0, 0,
1, -1, 0, 1, 0,
1, 1, 0, 1, 1,
-1, 1, 0, 0, 1
]);
_indices = Vector.<uint>([
0, 2, 1,
0, 3, 2
]);
ここでは派手なことは何も起こっていません。しかし、私がこれをレンダリングする方法は、すべてが崩壊する場所です。2 つのレンダー パスを使用してレンダリングされます。1 つ目は単純なフラグメント シェーダーで、単純に色を出力にコピーして 512x512 テクスチャにレンダリングします。それでも、すべてがうまく機能しています。私の問題は2番目のレンダーパスにあります。
2 番目の最後のレンダリング パスは同じジオメトリをレンダリングしますが、フラグメント (ピクセル) の色は最初のパスでレンダリングされたテクスチャから取得する必要があります。そして、それが私の問題の出番です。テクスチャから正しく抽出するために、画面空間座標、または正確には UV 座標で現在のピクセルの位置を正しく計算する方法が必要です。
この位置を計算する方法についていくつかの調査を行いましたが、どういうわけか、万華鏡のような効果を作成することになりました。ただし、この効果は、ここに示すように、X 軸または Z 軸でメッシュを回転させた場合にのみ明らかであり、Y 軸では明らかになりません。
このエフェクトを作成する 2 番目のパスに使用されるフラグメント プログラムは、次のようになります。
div ft0.x, v0.x, v0.w // Divide vertex positions (v0.xy) with clip-space position (v0.w)
div ft0.y, v0.y, v0.w // to obtain screen coordinates as -1,1
mul ft0.x, ft0.x, fc0.x // Multiply positions (ft0.xy) by 0.5 (fc0.x)
mul ft0.y, ft0.y, fc0.x
add ft0.x, ft0.x, fc0.x // Finally add 0.5 (fc0.x) to positions (ft0.xy)
add ft0.y, ft0.y, fc0.x
tex ft1, ft0.xy, fs0 <2d, nearest, repeat, nomip> // Simply copy the pixel at (ft0) from the render buffer (fs0)
mov oc, ft1";
最後に、私はこれらすべてにまったく慣れていません。そのため、明らかな何かを見逃している可能性があるため、事前にお詫び申し上げます。
そして、存在しない栄光のコードをすべて見たい場合は、Github リポジトリをここで見つけることができます。