Horde3D
http://horde3d.org/forums/

Manually texturing a cube
http://horde3d.org/forums/viewtopic.php?f=2&t=1384
Page 1 of 1

Author:  fredster1 [ 02.02.2011, 20:17 ]
Post subject:  Manually texturing a cube

Hi!

Based on the tutorial from the wiki, I am trying to create some procedural geometry and am having some problems with the way UV-mapping it. Here is a simple example with a cube, illustrating my problem:

Code:
   H3DRes matRes = h3dAddResource(H3DResTypes::Material, "materials/testpattern.material.xml", 0);
   h3dutLoadResourcesFromDisk( _params->ContentDirectory.c_str() );
   
   float posData[] = {
      -0.5,   -0.5,   -0.5,
      +0.5,   -0.5,   -0.5,
      -0.5,   -0.5,   +0.5,
      +0.5,   -0.5,   +0.5,
      -0.5,   +0.5,   -0.5,
      +0.5,   +0.5,   -0.5,
      -0.5,   +0.5,   +0.5,
      +0.5,   +0.5,   +0.5,
   };
   unsigned int posDataCount = 8+2;
   unsigned int indexData[] = { 4,0,6, 6,0,2,  2,3,6, 6,3,7,  7,3,5, 5,3,1,  1,0,5, 5,0,4,  4,8,5,  5,8,9 };
   unsigned int indexDataCount = 24;
   short normalData[] = {
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
   };
   float uvData[] = {
      0,0,//0=3
      1,0,//1=2
      1,0,//2=1
      0,0,//3=0
      0,1,//4=7
      1,1,//5=6
      1,1,//6=5
      0,1, //7=4
   };
   H3DRes geoRes = h3dutCreateGeometryRes( "geoRes", posDataCount, indexDataCount, posData, indexData, normalData, 0, 0, uvData, 0 );
   H3DNode model = h3dAddModelNode( H3DRootNode, "DynGeoModelNode", geoRes );
   H3DNode cube = h3dAddMeshNode( model, "DynGeoMesh", matRes, 0, indexDataCount, 0, 3 );

Image

It generates a cube-"shell" without a top or bottom. But now I really want to add a top! Sadly since the UV-coordinates seem to be mapped to the vertices, it is not possible to just add two more entries to indexData to the top and bottom like I did with the sides, because those vertices are mapped to the same UV-Coordinates.

Currently I do a workaround by adding two more vertices like this:

Code:
   H3DRes matRes = h3dAddResource(H3DResTypes::Material, "materials/testpattern.material.xml", 0);
   h3dutLoadResourcesFromDisk( _params->ContentDirectory.c_str() );
   
   float posData[] = {
      -0.5,   -0.5,   -0.5,
      +0.5,   -0.5,   -0.5,
      -0.5,   -0.5,   +0.5,
      +0.5,   -0.5,   +0.5,
      -0.5,   +0.5,   -0.5,
      +0.5,   +0.5,   -0.5,
      -0.5,   +0.5,   +0.5,
      +0.5,   +0.5,   +0.5,
      -0.5,   +0.5,   +0.5,//copy of 6
      +0.5,   +0.5,   +0.5 //copy of 7
   };
   unsigned int posDataCount = 8+2;
   unsigned int indexData[] = { 4,0,6, 6,0,2,  2,3,6, 6,3,7,  7,3,5, 5,3,1,  1,0,5, 5,0,4,  4,8,5,  5,8,9 };
   unsigned int indexDataCount = 24+6;
   short normalData[] = {
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,
      0, 0, 1,//one more
      0, 0, 1 //one more
   };
   float uvData[] = {
      0,0,//0=3
      1,0,//1=2
      1,0,//2=1
      0,0,//3=0
      0,1,//4=7
      1,1,//5=6
      1,1,//6=5
      0,1, //7=4
      0,0,//8=top=0
      1,0 //9=top=1
   };
   H3DRes geoRes = h3dutCreateGeometryRes( "geoRes", posDataCount, indexDataCount, posData, indexData, normalData, 0, 0, uvData, 0 );
   H3DNode model = h3dAddModelNode( H3DRootNode, "DynGeoModelNode", geoRes );
   H3DNode cube = h3dAddMeshNode( model, "DynGeoMesh", matRes, 0, indexDataCount, 0, 3 );

Image

Works fine, but that can't be the right way to do it. A cube shouldn't need 12 vertices (?). So here are my questions (which probably already include my problem):
  • If you have two polygons sharing two vertices, is it possible to UV-map both independently of each other?
  • What is the purpose of texture2 in the h3dutCreateGeometryRes? The documentation doesn't tell and the internet is empty.
  • Can you draw Quads or Trianglestrips instead of raw polygons? Would that even be faster?
  • Are transparent pngs not supported, or do they have to be enabled somehow?

Any help would be greatly appreciated.

Author:  phoenix64 [ 02.02.2011, 21:56 ]
Post subject:  Re: Manually texturing a cube

Quote:
A cube shouldn't need 12 vertices


It should, because all other solutions for uv data are way too costly.

Quote:
If you have two polygons sharing two vertices, is it possible to UV-map both independently of each other?


Think of the extra addressing work required to create several UV sets per vertex (the same applies to normals for flat-shading!) - you would ultimatively need different indices for UV and normal vertex data, and the gpu would have to do more work as well - would kind of defeat what you want, right? ^^

Quote:
Are transparent pngs not supported, or do they have to be enabled somehow?


You have to enable alpha blending in your shader file.

Quote:
Can you draw Quads or Trianglestrips instead of raw polygons? Would that even be faster?


I don't think is possible right now, although it might be faster in some cases (really not in all!) like terrains. Don't know whether it would be worth implementing it though, I saw performance numbers in the internet telling that it might not be.

Author:  fredster1 [ 02.02.2011, 22:36 ]
Post subject:  Re: Manually texturing a cube

Thanks phoneix64, that helped a lot! :D All my worries just vanished. Texture2 is then probably also useable via shader.

But that double definition of vertices is a little confusing since I haven't done anything 3D yet (you might even have noticed that somehow).
Imagine a theoretical grid/wall of individual square textures, stretching into infinity. Would it be common practice to just define every necessary vertex four times so as to have correct UV-Mapping for every individual square?

Author:  phoenix64 [ 02.02.2011, 23:46 ]
Post subject:  Re: Manually texturing a cube

If you have a grid of single quads holding a different material each (if I understand you correctly, although this is a situation you want to avoid at all cost, way too many batches as the GPU has to do extra work at every material switch, you best use *one* texture/shader for as much geometry as possible, up to a certain extent, not always, but you should avoid small objects like single quads if you know what I mean) you could also just create one quad (4 vertices) and use a different transformation matrix for each of the tiles of the wall. If you used one material for many quads, you would have to specify a vertex differently for each quad it is a part of.

That example is way too theoretical though. :)

Author:  fredster1 [ 03.02.2011, 06:17 ]
Post subject:  Re: Manually texturing a cube

Texture Atlas it is then.

Couldn't be happier with your help. :)

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/