Hi,

a few things...

On 07/10/10 11:33, Aitor Ardanza wrote:

Frederic Bouvier wrote:

// load texture as an image
imgTexture = osgDB::readImageFile("model/BAKE_OVERRIDE.jpg");
// if the image is successfully loaded
if (imgTexture)
{
imgTexture->allocateImage(3500, 3500, 1, GL_RGBA,
GL_UNSIGNED_BYTE);


Why are you reallocating space for an image loaded from file ?
Shouldn't the texture dimension be a power of 2 ?


Ok, it is a mistake. The model I load (obj) has linked a texture that is loaded 
automatically.
I want to paint in another texture (size like models texture) in fragment 
shader....
I am following the example of osgMultiplerendertargets ... but I can not get 
good textures ...

Code:
osg::Group *scene = new osg::Group();
     modelTransf = new osg::PositionAttitudeTransform();
     node = osgDB::readNodeFile("model\\file.obj");
     node->setName("AVATAR");
     modelTransf->addChild(node);
     scene->addChild(modelTransf);
     setSceneData(scene);

     unsigned tex_width = 4096;
     unsigned tex_height = 4096;
     // textures to render to and to use for texturing of the final quad
     osg::TextureRectangle* textureRect[2] = {0,0};
     for (int i=0;i<2;i++) {
         textureRect[i] = new osg::TextureRectangle;
         textureRect[i]->setTextureSize(tex_width, tex_height);
         textureRect[i]->setInternalFormat(GL_RGBA);
         
textureRect[i]->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
         
textureRect[i]->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
     }
     //create the geometry of the quad
     {
         osg::Geometry* polyGeom = new osg::Geometry();

         polyGeom->setSupportsDisplayList(false);

         osg::Vec3Array* vertices = new osg::Vec3Array;
         osg::Vec2Array* texcoords = new osg::Vec2Array;

         vertices->push_back(osg::Vec3d(0,0,0));
         texcoords->push_back(osg::Vec2(0,0));

         vertices->push_back(osg::Vec3d(200,0,0));
         texcoords->push_back(osg::Vec2(tex_width,0));

         vertices->push_back(osg::Vec3d(200,0,200));
         texcoords->push_back(osg::Vec2(tex_width,tex_height));

         vertices->push_back(osg::Vec3d(0,0,200));
         texcoords->push_back(osg::Vec2(0,tex_height));

What's the magic 200's doing? If your RTT camera's projection is gonna be from 0 to 1, make it 1. Also, if the RTT camera is going to use identity for its view matrix, you have to draw the quad in the XY-plane, not XZ.


         polyGeom->setVertexArray(vertices);
         polyGeom->setTexCoordArray(0,texcoords);

         osg::Vec4Array* colors = new osg::Vec4Array;
         colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
         polyGeom->setColorArray(colors);
         polyGeom->setColorBinding(osg::Geometry::BIND_OVERALL);

         polyGeom->addPrimitiveSet(new 
osg::DrawArrays(osg::PrimitiveSet::QUADS,0,vertices->size()));

         // now we need to add the textures (generated by RTT) to the Drawable.
         osg::StateSet* stateset = new osg::StateSet;
         for (int i=0;i<2;i++) {
             stateset->setTextureAttributeAndModes(i, textureRect[i], 
osg::StateAttribute::ON);
         }

         polyGeom->setStateSet(stateset);
         static const char *shaderSource = {
                 "uniform sampler2DRect textureID0;\n"
                 "uniform sampler2DRect textureID1;\n"
                 "void main(void)\n"
                 "{\n"
                 "    gl_FragData[0] = \n"
                 "          vec4(texture2DRect( textureID0, gl_TexCoord[0].st ).rgb, 
1);  \n"
                 "}\n"
             };
             osg::ref_ptr<osg::Shader>  fshader = new osg::Shader( 
osg::Shader::FRAGMENT , shaderSource);
             osg::ref_ptr<osg::Program>  program = new osg::Program;
             program->addShader( fshader.get());
             stateset->setAttributeAndModes( program.get(), 
osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE );
         stateset->addUniform(new osg::Uniform("textureID0", 0));
         stateset->addUniform(new osg::Uniform("textureID1", 1));
         osg::Geode* geode = new osg::Geode();
         geode->addDrawable(polyGeom);

         scene->addChild(geode);
     }

     getCamera()->setViewport(new osg::Viewport(0,0,width(),height()));
     getCamera()->setProjectionMatrixAsPerspective(30.0f,
         static_cast<double>(width())/static_cast<double>(height()), 1.0f, 
10000.0f);
     getCamera()->setGraphicsContext(getGraphicsWindow());

     // now create the camera to do the multiple render to texture
     {
         osg::Camera* camera = new osg::Camera;

         // set up the background color and clear mask.
         camera->setClearColor(osg::Vec4(0.1f,0.1f,0.3f,1.0f));
         camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

         // the camera is going to look at our input quad
         camera->setProjectionMatrix(osg::Matrix::ortho2D(0,1,0,1));

yes, but your quad is not 1x1 it's 200x200.

         camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
         camera->setViewMatrix(osg::Matrix::identity());

yes, but your quad is in die XZ plane. Identity transform means the camera is looking in -Z direction with X-right and Y-up.


         // set viewport
         camera->setViewport(0, 0, width(), height());

this is fine, should match your output texture size.

cheers
jp


         // set the camera to render before the main camera.
         camera->setRenderOrder(osg::Camera::PRE_RENDER);

         // tell the camera to use OpenGL frame buffer objects
         
//camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);

         // attach the textures to use
         for (int i=0;i<2;i++) {
             
camera->attach(osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0+i), 
textureRect[i]);
          }
         // add the subgraph to render
         camera->addChild(node);
         scene->addChild(camera);
     }


and fragment shader of model node:

Code:

uniform sampler2D baseMap;
uniform vec3 interPos;

varying vec3 Normal;
varying vec4 color;
varying vec2 Texcoord;
varying vec3 position;

void main( void )
{
     float radio = 3.0;
     vec3 a = position - interPos;
     float dist = sqrt((a.x*a.x)+(a.y*a.y)+(a.z*a.z));
     vec4 paintColor = vec4(1.0,0.0,0.0,1.0);
     if(dist<radio){
         gl_FragData[0] = texture2D( baseMap, Texcoord ) * color + paintColor;
         gl_FragData[1] = paintColor;
     }
     else{
         gl_FragData[0] = texture2D( baseMap, Texcoord ) * color;
         gl_FragData[1] = paintColor;
     }
}


Assuming that in the shader of quad I put: vec4(texture2DRect( textureID1, 
gl_TexCoord[0].st ).rgb, 1);
it should give me a red texture, but its black...

Thanks for de answer!

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=32518#32518





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


--
This message is subject to the CSIR's copyright terms and conditions, e-mail legal notice, and implemented Open Document Format (ODF) standard. The full disclaimer details can be found at http://www.csir.co.za/disclaimer.html.

This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks Transtec Computers for their support.

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to