Hi All,
I've been playing around with the random tree generator in an attempt to get
more realistic looking trees, in particular when lit by the sun.
The patch below changes the shader so the diffuse light element is applied
based on the co-linearity of the light vector and the viewing vector. I think
this makes sense, as the tree textures don't represent a surface themselves.
To compare, here's a link a screenshot of the old trees:
http:/www.nanjika.co.uk/flightgear/old_trees.jpg
New trees, also showcasing some improved cloud textures from Argyle on the
forum:
http:/www.nanjika.co.uk/flightgear/new_trees.jpg
In both cases, the sun is behind the viewer, so the viewer should be seeing the
sunlit side of the tree. I think the tree textures themselves are possibly a
bit too saturated, but this can be easily rectified if the code is committed.
The patch is below.
-Stuart
Index: TreeBin.cxx
===================================================================
RCS file: /var/cvs/SimGear-0.3/source/simgear/scene/tgdb/TreeBin.cxx,v
retrieving revision 1.7
diff -u -p -r1.7 TreeBin.cxx
--- TreeBin.cxx 30 Jan 2009 10:22:19 -0000 1.7
+++ TreeBin.cxx 18 Apr 2009 15:20:29 -0000
@@ -149,14 +149,12 @@ osg::Geometry* createOrthQuads(float w,
" vec3 position = gl_Vertex.xyz * gl_Color.w + gl_Color.xyz;\n"
" gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);\n"
" vec3 ecPosition = vec3(gl_ModelViewMatrix * vec4(position, 1.0));\n"
- " vec3 N = normalize(gl_NormalMatrix * gl_Normal);\n"
- " vec3 diffuse = gl_FrontMaterial.diffuse.rgb * max(0.0, dot(N,
gl_LightSource[0].position.xyz));\n"
- " vec3 backDiffuse = gl_FrontMaterial.diffuse.rgb * max(0.0, dot(-N,
gl_LightSource[0].position.xyz));\n"
- " vec4 ambientColor = gl_FrontLightModelProduct.sceneColor +
gl_LightSource[0].ambient * gl_FrontMaterial.ambient;\n"
- " gl_FrontColor = ambientColor + gl_LightSource[0].diffuse * vec4(diffuse,
1.0);\n"
- " gl_BackColor = ambientColor + gl_LightSource[0].diffuse *
vec4(backDiffuse, 1.0)\n;"
-// " gl_TexCoord[0] = gl_MultiTexCoord0;\n"
- " float fogCoord = abs(ecPosition.z);\n"
+ " float n = dot(normalize(gl_LightSource[0].position.xyz),
normalize(-ecPosition));\n"
+ " vec3 diffuse = gl_FrontMaterial.diffuse.rgb * max(0.1, n);\n"
+ " vec4 ambientColor = gl_FrontLightModelProduct.sceneColor +
gl_LightSource[0].ambient * gl_FrontMaterial.ambient;\n"
+ " gl_FrontColor = ambientColor + gl_LightSource[0].diffuse *
vec4(diffuse, 1.0);\n"
+ " gl_BackColor = gl_FrontColor;\n"
+ " float fogCoord = abs(ecPosition.z);\n"
" fogFactor = exp( -gl_Fog.density * gl_Fog.density * fogCoord *
fogCoord);\n"
" fogFactor = clamp(fogFactor, 0.0, 1.0);\n"
"}\n";
@@ -284,9 +282,9 @@ osg::Group* createForest(TreeBin& forest
// Don“t track vertex color
material->setColorMode(Material::OFF);
material->setAmbient(Material::FRONT_AND_BACK,
- Vec4(.8f, .8f, .8f, 1.0f));
+ Vec4(1.0f, 1.0f, 1.0f, 1.0f));
material->setDiffuse(Material::FRONT_AND_BACK,
- Vec4(.2f, .2f, .2f, 1.0f));
+ Vec4(1.0f, 1.0f, 1.0f, 1.0f));
}
stateset->setAttributeAndModes(alphaFunc.get());
stateset->setAttribute(program.get());
------------------------------------------------------------------------------
Stay on top of everything new and different, both inside and
around Java (TM) technology - register by April 22, and save
$200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
300 plus technical and hands-on sessions. Register today.
Use priority code J9JMT32. http://p.sf.net/sfu/p
_______________________________________________
Flightgear-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/flightgear-devel