OpenGL ES 2.0では、CPU内で少しでも追加の計算がなければ、これは絶対に不可能です。すべての頂点をレンダリングして、単一の頂点ごとに魔法のように線を作成することはできません。したがって、法線に基づいて頂点シェーダー内の頂点座標を計算する場合でも、メッシュの元の頂点ごとに1行(つまり2つの頂点)を配置する必要があります。したがって、これには少なくとも頂点データの再構築が必要になります。
また、これには、シェーダー内のラインの開始頂点と終了頂点の間で何らかの方法でアンブイを行う必要があることも正しいです。ただし、必ずしも分岐は必要ありません。開始頂点の法線をすべて0に設定するだけです(線をレンダリングするときに他の法線は必要ないと仮定しますが、線は通常は点灯しません)。
CPU:
for each original vertex:
generate two line vertices with attributes of original vertex
set normal attribute of first line vertex to 0-vector
...
render all lines using following shader
GPU:
attribute vec3 position;
attribute vec3 normal;
...
void main()
{
...
vec3 modelPos = position + normal;
gl_Position = projMat * modelviewMat * vec4(modelPos, 1.0);
}
ただし、これで実際に何かが購入されるとは思いません。シェーダーに両方のラインエンドポイントの違いを通知する必要があり、これを実行したら、CPUの各ラインに2つの異なる頂点を生成する必要があるためです。これを行うと、シェーダーで計算を行う代わりに、法線に基づいて2番目の線の頂点の座標を変更できます。その小さなvec3-saxpyは実際にはそれほど費用がかからないはずです。しかし、シェーダーアプローチの方が速いかもしれません。試してみてください。
ジオメトリシェーダーを使用できるデスクトップGL3+では状況が異なります。すべての元の頂点をポイントとしてレンダリングし、ジオメトリシェーダーで各ポイントのラインを生成して、ポイントの法線に基づいてその座標を計算します。そうすれば、実際にはいかなる種類のCPU計算も必要ありません。ただし、残念ながら、ES 2にはジオメトリシェーダーがありません(ただし、ES 3についてはわかりません)。