Re: [Algorithms] Terrain Normals
Brought to you by:
vexxed72
|
From: Pai-Hung C. <pa...@ac...> - 2000-08-14 16:58:49
|
Hi,
Thanks for the help!
> Personally, I use pre-lit textures or lightmaps (using Phong shading) to
> eliminate this effect, but the following algorithm to compute the vertex
> normals should already reduce (or maybe even eliminate) those seams
(Thanks
> to Peter Dimov for the algorithm :).
Wouldn't the same artifacts still be visible in the pre-lit lightmaps since
the lightmaps' color/intensity are still affected by the _faulty_ normals
when Gouraud shading is used (at least in D3D's case)?
Also, could you briefly explain the reasoning of the normal-generating
algorithm you suggested as follows? A high-level, general idea is fine. :-)
Thank you.
Pai-Hung Chen
> void VertexNormal(
> Vector3& normal,
> long col,
> long row,
> float gridSpacing)
> {
> float nx, nz, denom;
>
> if (col > 0 && col < m_fieldSize - 1)
> {
> nx = GetElev(col - 1, row) - (col + 1, row);
> }
> else if (col > 0)
> {
> nx = 2.0f * (GetElev(col - 1, row) - GetElev(col, row));
> }
> else nx = 2.0f * (GetElev(col, row) - GetElev(col + 1, row));
>
> if (row > 0 && row < m_fieldSize - 1)
> {
> nz = GetElev(col, row - 1) - GetElev(col, row + 1);
> }
> else if (row > 0)
> {
> nz = 2.0f * (GetElev(col, row - 1) - GetElev(col, row));
> }
> else nz = 2.0f * (GetElev(col, row) - GetElev(col, row + 1));
>
> gridSpacing *= 2.0f;
>
> denom = 1.0f / sqrt(nx * nx + gridSpacing * gridSpacing + nz * nz);
>
> normal.x = nx * denom;
> normal.y = gridSpacing * denom;
> normal.z = nz * denom;
> }
>
> "normal" is the unit vertex normal that is returned by the function.
"(col,
> row)" represents the data point in the height field for which you want to
> compute the vertex normal, and "gridSpacing" is the spacing between two
> adjacent vertices (normally, gridSpacing is 1, unless you decide to scale
> the height field). Finally, GetElev() return a elevation of a particular
> data point in the height field.
>
> HTH,
> Niki
>
> ----- Original Message -----
> From: Pai-Hung Chen <pa...@ac...>
> To: <gda...@li...>
> Sent: Monday, August 14, 2000 8:22 AM
> Subject: [Algorithms] Terrain Normals
>
>
> > Hi,
> >
> > I've written a routine to read a bitmap heightfield and construct a
> terrain
> > mesh from it. I partition each set of four pixels into two triangles
> along
> > the upper-right-to-lower-left diagonal line. Therefore, for example, a
> 128
> > x 128 bitmap will produce (128-1) x (128-1) x 2 = 32258 triangles using
my
> > method. For each triangle I caculate its unit face normal. For each
> vertex
> > of a triangle, I calculate its vertex normal by adding and averaging the
> > face normals of all triangles that share the vertex (in my case a vertex
> can
> > be shared by at most six triangles and at least one triganle) and then
> > normalize the averaged normal, which is used in redering. My problem is
> > that there are some *horizontal dimmed banding* effects along the
triangle
> > edges of the mesh when rendering in D3D with light cast on it. Also,
> there
> > are very visible dimmed seams between triangles when light is cast on
it.
> > All these artifacts seem to manifest only when light is cast in large
> angles
> > (i.e. not directly). Is it because the arrangement of triangles in my
> mesh
> > is too *uniform* (actually they are extremely uniform)? Or is my
> > calculation of vertex normals incorrect?
> >
> > Thanks in advance,
> >
> > Pai-Hung Chen
> >
> >
> >
> > _______________________________________________
> > GDAlgorithms-list mailing list
> > GDA...@li...
> > http://lists.sourceforge.net/mailman/listinfo/gdalgorithms-list
> >
>
>
> _______________________________________________
> GDAlgorithms-list mailing list
> GDA...@li...
> http://lists.sourceforge.net/mailman/listinfo/gdalgorithms-list
>
>
|