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 ); 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 ); 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):
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! 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/ |