6

私は Android アプリケーションで、このサーフェスの他の頂点に依存するサーフェスの法線を計算したいと考えています。時間がかかるので、「マスター」プログラムではやりたくありません。実際には、頂点ごとに、各ベクテックスに 4 つの float 配列を渡します。

attribute vec3 a_bottom;
attribute vec3 a_left;
attribute vec3 a_right;
attribute vec3 a_top;

vec3 calculNormal( ) {
    return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) );
}

それは私が知っている非常に非常に汚いコードなので、4つの配列を渡す代わりに、それをやりたいです:

vec3 calculNormal( ) {
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ];
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ];
    ...
    return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) );
}

では、頂点シェーダー プログラムで現在のフロート バッファーにアクセスすることは可能ですか? currentFloat のような特別なキーワードはありますか? または、私が見逃している別の可能性はありますか?

4

2 に答える 2

9

これは実際には不可能です。頂点シェーダーは、現在処理されている頂点とその属性にのみアクセスできます。また、OpenGL ES にはtexture_buffer_object拡張機能がないため、シェーダー内の VBO のデータにアクセスすることはできません。したがって、頂点の隣接にアクセスする唯一の方法は、最初の例のように、それらを頂点属性として明示的に配置することです。

ただし、ジオメトリが長方形のパターンのように見えるため、テクスチャに保存することもできます (またはテクスチャにコピーします。ES でpixel_buffer_objectサポートされている場合は、拡張機能が役立つ場合があります)。この場合、従来の GPGPU フラグメント シェーダを使用できます。このシェーダは、出力イメージ (この場合は長方形ジオメトリの法線データ) の各「ピクセル」(この場合は頂点) の法線を次の値に基づいて計算します。その隣接 (単純なテクスチャ アクセスによってアクセス)。

しかし、頂点法線の計算はすでにかなり高速であるため、追加のプログラミング オーバーヘッドやメモリ コピー操作を考慮すると、最初のものも 2 番目のものも実際には何もないと思います。とにかくすべてのフレームで行う必要はありません。実際に行う場合は、頂点の位置も更新しているためです。その場合、通常のデータ (CPU またはGPGPU)。

于 2012-01-31T14:13:19.127 に答える
4

このサーフェスの他の頂点に依存するサーフェスの法線を計算したい。

間違ったアプローチ。法線を計算し、頂点と一緒に保存します。

時間がかかるので、「マスター」プログラムではやりたくありません。

レンダリング パスごとに法線を再計算しないでください。それらを1つ計算して保存するだけです。頂点シェーダーでの計算は無料ではありません。そして、VS で法線を計算することは、処理能力の浪費にすぎません。

それらを計算し、保存します。

于 2012-01-31T15:43:37.203 に答える