Thread: [cgkit-user] Problem with Texture Baking example ...
Brought to you by:
mbaas
From: Darran E. <dar...@an...> - 2006-05-25 07:36:08
|
Hi Matthias, After a day of fighting with Blender to produce decent light maps, I went looking for other solutions. Earlier tonight I came across your excellent tutorial page: http://cgkit.sourceforge.net/tutorials/baking/baking.html I downloaded and installed cgkit-2.0.0alpha6 for win32, python 2.4. Trying to get the texture baking example working, I had to install pyProtocols (perhaps worth mentioning on the web site) and the bakepass.py script as follows: # Bake a texture map import cgkit import cgkit.scene from cgkit.sceneglobals import Globals from cgkit.objimport import OBJImporter from cgkit.worldobject import WorldObject from cgkit.rmshader import RMMaterial, RMShader from cgkit.plane import Plane from cgkit.cgtypes import mat3 from cgkit.sl import radians Globals( bake = True, resolution = (512, 512), pixelsamples = (2,2), output = "ao_map.tif", displaymode = "rgba" ) # Load the model OBJImporter().importFile('model.obj') # Obtain a reference to the model model = WorldObject('Model') # Set the bake material mat = RMMaterial( surface = RMShader( 'bake_ao.sl', samples = 1000, ) ) model.setMaterial(mat) # Add a ground plane to block 'light' coming from below Plane( lx = 5, ly = 5, rot = mat3().fromEulerXYZ(radians(90),0,0) ) With 3Delight properly installed, I was able to generate a lightmap. Unfortunately it doesn't look like the one in your tutorial. Here's yours: http://anusf.anu.edu.au/~dee900/Projects/cgkit/ao_map.png versus mine (shown here as a PNG for easy web display, the original TIF looks the same): http://anusf.anu.edu.au/~dee900/Projects/cgkit/ao_map_cgkit2.png Note, as with yours, the white area around my image is also transparent All the files including the rib are in this directory: http://anusf.anu.edu.au/~dee900/Projects/cgkit/ If you can spare a minute, I'd really appreciate you looking at this. Cheers, Darran. P.S. I notice that you are using the Ogre 3D engine. We too are developing heavily using pyOgre ;-) There is a discussion in the Ogre forums at the moment about producing light maps with gile[s]. Why isn't there any mention of cgkit + 3Delight? Seems like a really nice solution ... |
From: Matthias B. <ba...@ir...> - 2006-05-25 16:48:53
|
Darran Edmundson wrote: > I downloaded and installed cgkit-2.0.0alpha6 for win32, > python 2.4. Trying to get the texture baking example working, > I had to install pyProtocols (perhaps worth mentioning on > the web site) It's mentioned here: http://cgkit.sourceforge.net/doc2/externaldeps.html But I noticed that this is often overlooked. Where would you have expected that information? > import cgkit > import cgkit.scene > from cgkit.sceneglobals import Globals > from cgkit.objimport import OBJImporter > from cgkit.worldobject import WorldObject > from cgkit.rmshader import RMMaterial, RMShader > from cgkit.plane import Plane > from cgkit.cgtypes import mat3 > from cgkit.sl import radians The script is meant to be run via the render tool or the viewer tool, so all those imports are not required. > # Load the model > OBJImporter().importFile('model.obj') The recommended way of loading models is via the load() function which uses the appropriate class internally (depending on the file extension). > # Obtain a reference to the model > model = WorldObject('Model') This is why your output is black. The line should read: model = worldObject('Model') worldObject() (lower-case 'w') is a function that returns an existing object with a particular name. This is used to change the material (shader) of the model. WorldObject (upper-case 'W') is a base class for scene objects. In your script you were creating a new WorldObject instance (that has no geometry at all) and assigned the bake shader to that one. The original model remains without a shader so it is rendered black. You'll see the difference when you add a "listWorld()" to the end of the script. The output in the correct case is this: Root +---Model (TriMesh/TriMeshGeom) +---Plane (Plane/PlaneGeom) When your script is run you get the following: Root +---Model (TriMesh/TriMeshGeom) +---Model1 (WorldObject/-) +---Plane (Plane/PlaneGeom) 'Model1' is the object you created by mistake (the number '1' was added because the name 'Model' already existed). > P.S. I notice that you are using the Ogre 3D engine. We too are > developing heavily using pyOgre ;-) There is a discussion in > the Ogre forums at the moment about producing light maps with > gile[s]. Why isn't there any mention of cgkit + 3Delight? Seems > like a really nice solution ... I have absolutely no objections when you mention cgkit/3Delight in the Ogre forums... ;) By the way, meanwhile the Ogre-Viewer is on hold. We are currently evaluating OpenSceneGraph as a replacement. - Matthias - |
From: Darran E. <dar...@an...> - 2006-05-25 19:04:12
|
Hi Matthias, Thanks for the quick response ... > It's mentioned here: http://cgkit.sourceforge.net/doc2/externaldeps.html > But I noticed that this is often overlooked. Where would you have > expected that information? > Ahh, I missed the manual completely. This probably says more about me than cgkit's web-site. However, since you ask, I would suggest paring back the main page. My assumption on seeing a long web home page with internal navigation is that everything is "right here." I'd move all of the sections to separate pages: about, features, faq, download, documentation, 'who's using cgkit', etc. I'd also go for a uniform look and feel across the entire site. I wouldn't argue that our site is anywhere near perfect, http://www.edmstudio.com but it does have a certain cohesiveness. This is all done with a single top-level css file making it easy to tweak. (That said, I really appreciate that you formatted the cgkit manual in Python style. This would be a great additional download.) To answer your specific question, I would have expected the prerequisites in the downloads section. Thanks for pointing out my incorrect usage. I've now got the occlusion map example working. Question: would you happen to have any other baking examples? I'm specifically interested in creating shadow maps for a scene comprised of multiple OBJs. For example, say that I wanted to add a second model2.obj to your existing tutorial, and produce a map of the shadows on the existing model (both due to model2 and self-shadowing)? Any pointers in the right direction would be much appreciated ... > By the way, meanwhile the Ogre-Viewer is on hold. We are currently > evaluating OpenSceneGraph as a replacement. > > I've recently migrated from OpenSceneGraph to Ogre ;-) I really appreciate Ogre's online forums, the materials scripting ability and the pyOgre bindings. All things that were absent from OSG. Cheers, Darran. |
From: Matthias B. <ba...@ir...> - 2006-05-26 08:23:53
|
Darran Edmundson wrote: > everything is "right here." I'd move all of the sections to separate > pages: about, features, > faq, download, documentation, 'who's using cgkit', etc. I'd also go for I agree that this might tidy up the page a bit. Whenever I have some time left I'll restructure the page... > css file making it easy to tweak. (That said, I really appreciate that > you formatted > the cgkit manual in Python style. This would be a great additional > download.) I didn't add it to the downloads because there's still a lot missing. But you're right, adding it wouldn't hurt and people would notice that there actually *is* a manual... ;) > example working. Question: would you happen to have any other baking > examples? I couldn't find the bunny sources anymore, obviously I've already deleted them...ahem... > I'm specifically interested in creating shadow maps for a scene > comprised of multiple OBJs. For example, say that I wanted to add a second > model2.obj to your existing tutorial, and produce a map of the shadows > on the existing model (both due to model2 and self-shadowing)? Any pointers > in the right direction would be much appreciated ... It works just like in the tutorial. The only modification is that you have to specify the model you want to render the light maps for. This is done using the "bakemodel" parameter (it's mentioned in the tutorial). So set up your scene with as many objects/lights as you like and then set the "bakemodel" parameter in the command line or in the Globals section: Globals( ... bakemodel = "Model", ... ) You have to do that (and rerender) for every map you want to generate. >> By the way, meanwhile the Ogre-Viewer is on hold. We are currently >> evaluating OpenSceneGraph as a replacement. > > I've recently migrated from OpenSceneGraph to Ogre ;-) I really > appreciate Ogre's online > forums, the materials scripting ability and the pyOgre bindings. All > things that were absent from OSG. We were not using pyOgre as this one didn't exist when we started with our stuff. We switched to OpenSceneGraph in the hope to get a more flexible framework and a more stable API that reduces work on our side between versions of the 3D engine (for example, our current Ogre stuff doesn't compile with Ogre 1.2 as obviously since v1.0 there have been changes to the API that broke our stuff). - Matthias - |
From: Darran E. <dar...@an...> - 2006-05-28 06:28:29
|
Matthias Baas wrote: > So set up your scene with as many objects/lights as you like and then > set the "bakemodel" parameter in the command line or in the Globals section: > > Globals( > ... > bakemodel = "Model", > ... > ) > > By lights, I presume you mean instances of your RMLightSource(name, shader) class? In which case, is it necessary to replace the included bake_ao.sl shader in order to get shadows in my baked textures? I've never used Renderman before but looking at the existing ambient occlusion surface shader, it relies on the occlusion() function - but this doesn't generate direct light shadows. I'll continue to struggle with this but again, any advice you can offer is much appreciated. Cheers, Darran. |
From: Matthias B. <ba...@ir...> - 2006-05-29 14:01:19
|
Darran Edmundson wrote: > Matthias Baas wrote: >> So set up your scene with as many objects/lights as you like and then >> set the "bakemodel" parameter in the command line or in the Globals section: >> >> Globals( >> ... >> bakemodel = "Model", >> ... >> ) >> >> > By lights, I presume you mean instances of your RMLightSource(name, > shader) class? It doesn't have to be a RMLightSource, it can also be one of the other light sources. > In which case, is it necessary to replace the included bake_ao.sl shader > in order > to get shadows in my baked textures? I've never used Renderman before but > looking at the existing ambient occlusion surface shader, it relies on > the occlusion() > function - but this doesn't generate direct light shadows. Right, the example shader from the tutorial only bakes the ambient occlusion value, it doesn't do any "real" shading. Even if there is a shadow-casting light source in your scene this won't change anything as this shader completely ignores light sources. You need a shader that has a diffuse() call or its own illuminate loop. I have just committed a modification so that you can now also use the built-in materials for baking (I always thought I had done that already when I added the bake feature). I also found (and fixed) a bug that led to incorrect results when your model has a transformation other than the identity. In the attachment there's another example. It's just a scene with one plane and two spheres and a couple of light sources (two of which cast shadows). The actual scene is inside the file demoscene.py. bakepass.py is used for baking. You have to render this file three times (once for each object) and set the variable idx to 0,1,2 in each call. After the maps have rendered you can view the scene with "viewer.py final.py". The spheres will only render correctly with the fix I've just committed. The plane should also be ok with alpha6. Let me know if this worked for you and if it clarified how to bake maps for several objects including shadows. - Matthias - |
From: Darran E. <dar...@an...> - 2006-05-31 07:08:17
|
Matthias Baas wrote: > > Let me know if this worked for you and if it clarified how to bake > maps for several objects including shadows. Thanks for taking the time to put together the detailed example - it worked wonderfully and gave me the confidence to keep plodding along. After realizing that the camera for the shadow map pass should have a high resolution and as small as possible fov, and by increasing the sampling size in the spotlight3ds shader code, I'm now getting nice results. Cheers, Darran. |