3

地形をレンダリングするときに法線が機能しないという奇妙な問題があります。私の地形は問題なくレンダリングされるので、高さマップから地形ポイントを計算するためのすべてのコードと、インデックスの計算方法を省略しました。シェーダーを使用する必要があることはわかっていますが、先に進む前にまずこれを修正したいと考えています。この問題は、次のような法線生成コードで見落としていた明らかな何かから発生していると想定しています。

for (currentind = 0; currentind < indices.size() - 3; currentind+=3)
{

indtopt = indices[currentind] * 3;
point1.vects[0]=terrainpoints[indtopt];//x
point1.vects[1]=terrainpoints[indtopt+1];//y
point1.vects[2]=terrainpoints[indtopt+2];//z


indtopt = indices[currentind+1] * 3;
//second indice

//points of that indice
point2.vects[0]=terrainpoints[indtopt];//x
point2.vects[1]=terrainpoints[indtopt+1];//y
point2.vects[2]=terrainpoints[indtopt+2];//z

indtopt = indices[currentind+2] *3;
//third indice

//points of that indice
point3.vects[0]=terrainpoints[indtopt];//x
point3.vects[1]=terrainpoints[indtopt+1];//y
point3.vects[2]=terrainpoints[indtopt+2];//z

//--------------------------------------------------
point4.vects[0]=(point2.vects[0]-point1.vects[0]);
point4.vects[1]=(point2.vects[1]-point1.vects[1]);
point4.vects[2]=(point2.vects[2]-point1.vects[2]);

point5.vects[0]=(point3.vects[0]-point2.vects[0]);
point5.vects[1]=(point3.vects[1]-point2.vects[1]);
point5.vects[2]=(point3.vects[2]-point2.vects[2]);
//-------------------------------------------------

//cross product
point6.vects[0]=point4.vects[1]*point5.vects[2] - point4.vects[2]*point5.vects[1];
point6.vects[1]=point4.vects[2]*point5.vects[0] - point4.vects[0]*point5.vects[2];
point6.vects[2]=point4.vects[0]*point5.vects[1] - point4.vects[1]*point5.vects[0];

point6 = point6.normalize();
ternormals[currentind]=point6.vects[0];
ternormals[currentind+1]=point6.vects[1];
ternormals[currentind+2]=point6.vects[2];
}

以下は、ワイヤフレームと三角形の両方のレンダリングで問題が発生する様子を示した図です。

地形レンダリングのストライピングの問題

必要に応じてさらにコードを投稿することもできますが、この投稿を短くしたかったので、問題がどこにあると思われるかを見つけようとしました.

4

1 に答える 1

1

そうですね、「暗い」バンドごとに、誤って法線を反転させています。おそらく、表面の接線ベクトルが間違った順序で外積に渡されているためです。

a × b = - (b × a)

地形が三角形の帯でできている場合、双方向の順序付けが行われます。つまり、オペランドを反転するか、奇数行ごとに外積の結果を否定する必要があります。

于 2013-08-11T10:09:45.410 に答える