OpenSceneGraph Forum Forum Index OpenSceneGraph Forum
Official forum which mirrors the existent OSG mailing lists. Messages posted here are forwarded to the mailing list and vice versa.
 
   FAQFAQ    SearchSearch    MemberlistMemberlist    RulesRules    UsergroupsUsergroups    RegisterRegister 
 Mail2Forum SettingsMail2Forum Settings  ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 
   AlbumAlbum  OpenSceneGraph IRC ChatOpenSceneGraph IRC Chat   SmartFeedSmartFeed 

Normal Mapping using Dynamic Cubemap


 
Post new topic   Reply to topic    OpenSceneGraph Forum Forum Index -> General
View previous topic :: View next topic  
Author Message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Tue Dec 19, 2017 2:10 am    Post subject:
Normal Mapping using Dynamic Cubemap
Reply with quote

Hi,

is it possible to generate dynamic cubemaps (with normal mapping textures)?

...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
SMesserschmidt (Sebastian Messerschmidt)
Forum Moderator


Joined: 10 Sep 2013
Posts: 823

PostPosted: Tue Dec 19, 2017 6:46 pm    Post subject:
Normal Mapping using Dynamic Cubemap
Reply with quote

Hi Rômulo,

Repeating the question won't magically solve it.

If you're after rendering normals and depth into textures (it doesn't
matter if you are rendering to cubemap-faces IMHO) then see the multiple
rendering target (MRT) example. Basically you need to attach a depth and
normal target to your FBO and in a custom shader write the information
to it (basically that's the first step in deferred rendering). There are
some deferred-rendering/shading examples based on OSG around in the web.
If you're unable to find them, I can help you to retrieve them.

In the resolving pass, you need to bind the textures you've rendered to,
to get the normals/depths.

Beware that there will be issues concerning filtering (since depth and
normals cannot be lineary interpolated in every case)


Cheers

Sebastian



Am 19.12.2017 um 03:10 schrieb Rômulo Cerqueira:
Quote:
Hi,

is it possible to generate dynamic cubemaps (with normal mapping textures)?

...

Thank you!

Cheers,
Rômulo

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









------------------
Post generated by Mail2Forum
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Tue Dec 19, 2017 9:58 pm    Post subject:
Reply with quote

Hi Sebastian,

can you help me to find an example? I've been looking for this solution for almost two months.
...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Tue Dec 26, 2017 5:17 pm    Post subject:
Reply with quote

Hi Robert and Sebastian,

sorry for my duplicated post. I need to render the depth/normal surface to texture of reflected objects by cube maps.

Until this moment, I got the depth data. Could you help me to get the normal data too (as single channel data)? My current code follows below:

C++ code:
Code:

// OSG includes
#include <osgViewer/Viewer>
#include <osg/Texture>
#include <osg/TexGen>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/TextureCubeMap>
#include <osg/TexMat>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Camera>
#include <osg/TexGenNode>
#include <osgDB/FileUtils>

// C++ includes
#include <iostream>

#define SHADER_PATH_FRAG "normal_depth_map/shaders/normalDepthMap.frag"
#define SHADER_PATH_VERT "normal_depth_map/shaders/normalDepthMap.vert"

using namespace osg;

unsigned int numTextures = 6;

enum TextureUnitTypes {
    TEXTURE_UNIT_DIFFUSE,
    TEXTURE_UNIT_NORMAL,
    TEXTURE_UNIT_CUBEMAP
};

osg::ref_ptr<osg::Group> _create_scene() {
    osg::ref_ptr<osg::Group> scene = new osg::Group;

    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    scene->addChild(geode.get());

    const float radius = 0.8f;
    const float height = 1.0f;
    osg::ref_ptr<osg::ShapeDrawable> shape;

    // sphere
    shape = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(-3.0f, 0.0f, 0.0f), radius));
    shape->setColor(osg::Vec4(0.6f, 0.8f, 0.8f, 1.0f));
    geode->addDrawable(shape.get());

    // box
    shape = new osg::ShapeDrawable(new osg::Box(osg::Vec3(3.0f, 0.0f, 0.0f), 2 * radius));
    shape->setColor(osg::Vec4(0.4f, 0.9f, 0.3f, 1.0f));
    geode->addDrawable(shape.get());

    // cone
    shape = new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, -3.0f), radius, height));
    shape->setColor(osg::Vec4(1.0f, 0.3f, 0.3f, 1.0f));
    geode->addDrawable(shape.get());

    // cylinder
    shape = new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f, 0.0f, 3.0f), 2* radius));
    shape->setColor(osg::Vec4(0.8f, 0.8f, 0.4f, 1.0f));
    geode->addDrawable(shape.get());

    return scene;
}

osg::NodePath createReflector() {
    Geode* node = new Geode;
    const float radius = 0.8f;
    ref_ptr<TessellationHints> hints = new TessellationHints;
    hints->setDetailRatio(2.0f);
    ShapeDrawable* shape = new ShapeDrawable(new Sphere(Vec3(0.0f, 0.0f, 0.0f), radius * 1.5f), hints.get());
    shape->setColor(Vec4(0.8f, 0.8f, 0.8f, 1.0f));
    node->addDrawable(shape);

    osg::NodePath nodeList;
    nodeList.push_back(node);

    return nodeList;
}

class UpdateCameraAndTexGenCallback : public osg::NodeCallback
{
    public:

        typedef std::vector< osg::ref_ptr<osg::Camera> >  CameraList;

        UpdateCameraAndTexGenCallback(osg::NodePath& reflectorNodePath, CameraList& Cameras):
            _reflectorNodePath(reflectorNodePath),
            _Cameras(Cameras)
        {
        }

        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
        {
            // first update subgraph to make sure objects are all moved into position
            traverse(node,nv);

            // compute the position of the center of the reflector subgraph
            osg::Matrixd worldToLocal = osg::computeWorldToLocal(_reflectorNodePath);
            osg::BoundingSphere bs = _reflectorNodePath.back()->getBound();
            osg::Vec3 position = bs.center();

            typedef std::pair<osg::Vec3, osg::Vec3> ImageData;
            const ImageData id[] =
            {
                ImageData( osg::Vec3( 1,  0,  0), osg::Vec3( 0, -1,  0) ), // +X
                ImageData( osg::Vec3(-1,  0,  0), osg::Vec3( 0, -1,  0) ), // -X
                ImageData( osg::Vec3( 0,  1,  0), osg::Vec3( 0,  0,  1) ), // +Y
                ImageData( osg::Vec3( 0, -1,  0), osg::Vec3( 0,  0, -1) ), // -Y
                ImageData( osg::Vec3( 0,  0,  1), osg::Vec3( 0, -1,  0) ), // +Z
                ImageData( osg::Vec3( 0,  0, -1), osg::Vec3( 0, -1,  0) )  // -Z
            };

            for(unsigned int i = 0; i < 6 && i < _Cameras.size(); ++i) {
                osg::Matrix localOffset;
                localOffset.makeLookAt(position,position+id[i].first,id[i].second);

                osg::Matrix viewMatrix = worldToLocal*localOffset;

                _Cameras[i]->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
                _Cameras[i]->setProjectionMatrixAsFrustum(-1.0,1.0,-1.0,1.0,1.0,10000.0);
                _Cameras[i]->setViewMatrix(viewMatrix);
            }
        }

    protected:

        virtual ~UpdateCameraAndTexGenCallback() {}

        osg::NodePath               _reflectorNodePath;
        CameraList                  _Cameras;
};

class TexMatCullCallback : public osg::NodeCallback
{
    public:

        TexMatCullCallback(osg::TexMat* texmat):
            _texmat(texmat)
        {
        }

        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
        {
            // first update subgraph to make sure objects are all moved into position
            traverse(node,nv);

            osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
            if (cv)
            {
            osg::Quat q = osg::Matrix::inverse(*cv->getModelViewMatrix()).getRotate();


            float yaw2 = asin(-2.0f*(q.x()*q.z() - q.w()*q.y()));
            osg::Matrixd mxY;
            mxY.makeRotate(yaw2,osg::Vec3(0,0,1));

            osg::Matrixd mx = mxY;
                _texmat->setMatrix(mx);
            }
        }

    protected:

        osg::ref_ptr<TexMat>    _texmat;
};

class UpdateCameraPosUniformCallback : public osg::Uniform::Callback
{
public:
   UpdateCameraPosUniformCallback(osg::Camera* camera)
      : mCamera(camera)
   {
   }

   virtual void operator () (osg::Uniform* u, osg::NodeVisitor*)
   {
      osg::Vec3 eye;
      osg::Vec3 center;
      osg::Vec3 up;
      mCamera->getViewMatrixAsLookAt(eye,center,up);

      u->set(eye);
   }
protected:
   osg::Camera* mCamera;
};

osg::Group* createShadowedScene(osg::Node* reflectedSubgraph, osg::NodePath reflectorNodePath, unsigned int unit, const osg::Vec4& clearColor, unsigned tex_width, unsigned tex_height, osg::Camera::RenderTargetImplementation renderImplementation, osg::Camera* camera = 0) {
    osg::Group* group = new osg::Group;

    osg::TextureCubeMap* texture = new osg::TextureCubeMap;
    texture->setTextureSize(tex_width, tex_height);
    texture->setInternalFormat(GL_DEPTH_COMPONENT);
    texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
    texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
    texture->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);
    texture->setFilter(osg::TextureCubeMap::MIN_FILTER,osg::TextureCubeMap::LINEAR);
    texture->setFilter(osg::TextureCubeMap::MAG_FILTER,osg::TextureCubeMap::LINEAR);

    // set up the render to texture cameras.
    UpdateCameraAndTexGenCallback::CameraList Cameras;
    for(unsigned int i = 0; i < 6; ++i) {
        // create the camera
        osg::Camera* camera = new osg::Camera;

        camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        camera->setClearColor(clearColor);

        // set viewport
        camera->setViewport(0,0,tex_width,tex_height);

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

        // tell the camera to use OpenGL frame buffer object where supported.
        camera->setRenderTargetImplementation(renderImplementation);

        // attach the texture and use it as the color buffer.
        camera->attach(osg::Camera::DEPTH_BUFFER, texture, 0, i);

        // add subgraph to render
        camera->addChild(reflectedSubgraph);

        group->addChild(camera);

        Cameras.push_back(camera);
    }

    // create the texgen node to project the tex coords onto the subgraph
    osg::TexGenNode* texgenNode = new osg::TexGenNode;
    texgenNode->getTexGen()->setMode(osg::TexGen::REFLECTION_MAP);
    texgenNode->setTextureUnit(unit);
    group->addChild(texgenNode);

    // set the reflected subgraph so that it uses the texture and tex gen settings.
   osg::Node* reflectorNode = reflectorNodePath.front();
    {

        group->addChild(reflectorNode);

        osg::StateSet* stateset = reflectorNode->getOrCreateStateSet();
      stateset->setTextureAttributeAndModes(unit,texture,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_S,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_T,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_R,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_Q,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);

        osg::TexMat* texmat = new osg::TexMat;
        stateset->setTextureAttributeAndModes(unit,texmat,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);

        reflectorNode->setCullCallback(new TexMatCullCallback(texmat));
    }

   osg::StateSet* ss = reflectorNode->getOrCreateStateSet();
   ss->setTextureAttributeAndModes(unit,texture,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);

   osg::Program* program = new osg::Program;
    osg::ref_ptr<osg::Shader> shaderVertex = osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile(SHADER_PATH_VERT));
    osg::ref_ptr<osg::Shader> shaderFragment = osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile(SHADER_PATH_FRAG));
    program->addShader(shaderFragment);
    program->addShader(shaderVertex);
    ss->setAttributeAndModes( program, osg::StateAttribute::ON );
   ss->addUniform( new osg::Uniform("cubeMap", unit) );

   osg::Uniform* u = new osg::Uniform("cameraPos",osg::Vec3());
   u->setUpdateCallback( new UpdateCameraPosUniformCallback( camera ) );
   ss->addUniform( u );

    // add the reflector scene to draw just as normal
    group->addChild(reflectedSubgraph);

    // set an update callback to keep moving the camera and tex gen in the right direction.
    group->setUpdateCallback(new UpdateCameraAndTexGenCallback(reflectorNodePath, Cameras));

    return group;
}


int main() {
    // construct the viewer.
    osgViewer::Viewer viewer;

    unsigned tex_width = 256;
    unsigned tex_height = 256;

    osg::Camera::RenderTargetImplementation renderImplementation = osg::Camera::FRAME_BUFFER_OBJECT;

    osg::ref_ptr<osg::Group> scene = new osg::Group;
    osg::ref_ptr<osg::Group> reflectedSubgraph = _create_scene();
    if (!reflectedSubgraph.valid()) exit(0);

    osg::ref_ptr<osg::Group> reflectedScene = createShadowedScene(
         reflectedSubgraph.get(),
         createReflector(),
         TEXTURE_UNIT_CUBEMAP,
         viewer.getCamera()->getClearColor(),
            tex_width,
         tex_height,
         renderImplementation,
         viewer.getCamera());

    scene->addChild(reflectedScene.get());
    viewer.setSceneData(scene.get());
    viewer.setUpViewInWindow(0,0,600,600);
    viewer.run();
    return 0;
}



Vertex Shader:
Code:
#version 130

uniform mat4 osg_ViewMatrixInverse;
uniform vec3 cameraPos;

void main() {
    gl_Position = ftransform();
    gl_TexCoord[0] = gl_MultiTexCoord0;
    mat4 ModelWorld4x4 = osg_ViewMatrixInverse * gl_ModelViewMatrix;
    mat3 ModelWorld3x3 = mat3( ModelWorld4x4 );
    vec4 WorldPos = ModelWorld4x4 *  gl_Vertex;
    vec3 N = normalize( ModelWorld3x3 * gl_Normal );
    vec3 E = normalize( WorldPos.xyz - cameraPos.xyz );
    gl_TexCoord[1].xyz = reflect( E, N );
}


Fragment Shader:
Code:
#version 130

uniform samplerCube cubeMap;

void main (void)                                                           
{
    vec3 cube_color = textureCube(cubeMap, gl_TexCoord[1].xyz).rgb;
    gl_FragColor = vec4(cube_color, 1.0);
}


...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
SMesserschmidt (Sebastian Messerschmidt)
Forum Moderator


Joined: 10 Sep 2013
Posts: 823

PostPosted: Wed Dec 27, 2017 11:53 am    Post subject:
Normal Mapping using Dynamic Cubemap
Reply with quote

Hi Rômulo,

I already tried to describe the building-blocks for the way:

1. Render to FBO with MRT (see osgmultiplerendertargets example for
this). The MRT/FBO-attachments should be your color, normal and depth.
You'll need to use a shader that writes the correct information to the
correct buffers. That's all in the example. Basically that's deferred
rendering's approach. An example by Michael Kapelko can be found here: [0].

2. Once you understand how to render to one FBO you can use your
approach to render to the individual faces of your cubemap.

You need to learn the basics. Pasting source code might not attract a
lot of attention, so please try to follow my hints before asking the
question over and over.


[0]
https://bitbucket.org/kornerr/osg-deferred-shading/src/5b8555059707?at=default


Cheers
Sebastian



Am 26.12.2017 um 18:17 schrieb Rômulo Cerqueira:
Quote:
Hi Roberto and Sebastian,

sorry for my duplicated post. I need to render the depth/normal surface to texture of reflected objects by cube maps.

Until this moment, I got the depth data. Could you help me to get the normal data too (as single channel data). My current code follows below:

C++ code:

Code:

// OSG includes
#include <osgViewer/Viewer>
#include <osg/Texture>
#include <osg/TexGen>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/TextureCubeMap>
#include <osg/TexMat>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Camera>
#include <osg/TexGenNode>
#include <osgDB/FileUtils>

// C++ includes
#include <iostream>

#define SHADER_PATH_FRAG "normal_depth_map/shaders/normalDepthMap.frag"
#define SHADER_PATH_VERT "normal_depth_map/shaders/normalDepthMap.vert"

#define BOOST_TEST_MODULE "DynamicCubeMap_test"

using namespace osg;

unsigned int numTextures = 6;

enum TextureUnitTypes {
TEXTURE_UNIT_DIFFUSE,
TEXTURE_UNIT_NORMAL,
TEXTURE_UNIT_CUBEMAP
};

osg::ref_ptr<osg::Group> _create_scene() {
osg::ref_ptr<osg::Group> scene = new osg::Group;

osg::ref_ptr<osg::Geode> geode = new osg::Geode;
scene->addChild(geode.get());

const float radius = 0.8f;
const float height = 1.0f;
osg::ref_ptr<osg::ShapeDrawable> shape;

// sphere
shape = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(-3.0f, 0.0f, 0.0f), radius));
shape->setColor(osg::Vec4(0.6f, 0.8f, 0.8f, 1.0f));
geode->addDrawable(shape.get());

// box
shape = new osg::ShapeDrawable(new osg::Box(osg::Vec3(3.0f, 0.0f, 0.0f), 2 * radius));
shape->setColor(osg::Vec4(0.4f, 0.9f, 0.3f, 1.0f));
geode->addDrawable(shape.get());

// cone
shape = new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, -3.0f), radius, height));
shape->setColor(osg::Vec4(1.0f, 0.3f, 0.3f, 1.0f));
geode->addDrawable(shape.get());

// cylinder
shape = new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f, 0.0f, 3.0f), 2* radius));
shape->setColor(osg::Vec4(0.8f, 0.8f, 0.4f, 1.0f));
geode->addDrawable(shape.get());

return scene;
}

osg::NodePath createReflector() {
Geode* node = new Geode;
const float radius = 0.8f;
ref_ptr<TessellationHints> hints = new TessellationHints;
hints->setDetailRatio(2.0f);
ShapeDrawable* shape = new ShapeDrawable(new Sphere(Vec3(0.0f, 0.0f, 0.0f), radius * 1.5f), hints.get());
shape->setColor(Vec4(0.8f, 0.8f, 0.8f, 1.0f));
node->addDrawable(shape);

osg::NodePath nodeList;
nodeList.push_back(node);

return nodeList;
}

class UpdateCameraAndTexGenCallback : public osg::NodeCallback
{
public:

typedef std::vector< osg::ref_ptr<osg::Camera> > CameraList;

UpdateCameraAndTexGenCallback(osg::NodePath& reflectorNodePath, CameraList& Cameras):
_reflectorNodePath(reflectorNodePath),
_Cameras(Cameras)
{
}

virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
// first update subgraph to make sure objects are all moved into position
traverse(node,nv);

// compute the position of the center of the reflector subgraph
osg::Matrixd worldToLocal = osg::computeWorldToLocal(_reflectorNodePath);
osg::BoundingSphere bs = _reflectorNodePath.back()->getBound();
osg::Vec3 position = bs.center();

typedef std::pair<osg::Vec3, osg::Vec3> ImageData;
const ImageData id[] =
{
ImageData( osg::Vec3( 1, 0, 0), osg::Vec3( 0, -1, 0) ), // +X
ImageData( osg::Vec3(-1, 0, 0), osg::Vec3( 0, -1, 0) ), // -X
ImageData( osg::Vec3( 0, 1, 0), osg::Vec3( 0, 0, 1) ), // +Y
ImageData( osg::Vec3( 0, -1, 0), osg::Vec3( 0, 0, -1) ), // -Y
ImageData( osg::Vec3( 0, 0, 1), osg::Vec3( 0, -1, 0) ), // +Z
ImageData( osg::Vec3( 0, 0, -1), osg::Vec3( 0, -1, 0) ) // -Z
};

for(unsigned int i = 0; i < 6 && i < _Cameras.size(); ++i) {
osg::Matrix localOffset;
localOffset.makeLookAt(position,position+id[i].first,id[i].second);

osg::Matrix viewMatrix = worldToLocal*localOffset;

_Cameras[i]->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
_Cameras[i]->setProjectionMatrixAsFrustum(-1.0,1.0,-1.0,1.0,1.0,10000.0);
_Cameras[i]->setViewMatrix(viewMatrix);
}
}

protected:

virtual ~UpdateCameraAndTexGenCallback() {}

osg::NodePath _reflectorNodePath;
CameraList _Cameras;
};

class TexMatCullCallback : public osg::NodeCallback
{
public:

TexMatCullCallback(osg::TexMat* texmat):
_texmat(texmat)
{
}

virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
// first update subgraph to make sure objects are all moved into position
traverse(node,nv);

osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
if (cv)
{
osg::Quat q = osg::Matrix::inverse(*cv->getModelViewMatrix()).getRotate();


float yaw2 = asin(-2.0f*(q.x()*q.z() - q.w()*q.y()));
osg::Matrixd mxY;
mxY.makeRotate(yaw2,osg::Vec3(0,0,1));

osg::Matrixd mx = mxY;
_texmat->setMatrix(mx);
}
}

protected:

osg::ref_ptr<TexMat> _texmat;
};

class UpdateCameraPosUniformCallback : public osg::Uniform::Callback
{
public:
UpdateCameraPosUniformCallback(osg::Camera* camera)
: mCamera(camera)
{
}

virtual void operator () (osg::Uniform* u, osg::NodeVisitor*)
{
osg::Vec3 eye;
osg::Vec3 center;
osg::Vec3 up;
mCamera->getViewMatrixAsLookAt(eye,center,up);

u->set(eye);
}
protected:
osg::Camera* mCamera;
};

osg::Group* createShadowedScene(osg::Node* reflectedSubgraph, osg::NodePath reflectorNodePath, unsigned int unit, const osg::Vec4& clearColor, unsigned tex_width, unsigned tex_height, osg::Camera::RenderTargetImplementation renderImplementation, osg::Camera* camera = 0) {
osg::Group* group = new osg::Group;

osg::TextureCubeMap* texture = new osg::TextureCubeMap;
texture->setTextureSize(tex_width, tex_height);
texture->setInternalFormat(GL_DEPTH_COMPONENT);
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);
texture->setFilter(osg::TextureCubeMap::MIN_FILTER,osg::TextureCubeMap::LINEAR);
texture->setFilter(osg::TextureCubeMap::MAG_FILTER,osg::TextureCubeMap::LINEAR);

// set up the render to texture cameras.
UpdateCameraAndTexGenCallback::CameraList Cameras;
for(unsigned int i = 0; i < 6; ++i) {
// create the camera
osg::Camera* camera = new osg::Camera;

camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
camera->setClearColor(clearColor);

// set viewport
camera->setViewport(0,0,tex_width,tex_height);

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

// tell the camera to use OpenGL frame buffer object where supported.
camera->setRenderTargetImplementation(renderImplementation);

// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::DEPTH_BUFFER, texture, 0, i);

// add subgraph to render
camera->addChild(reflectedSubgraph);

group->addChild(camera);

Cameras.push_back(camera);
}

// create the texgen node to project the tex coords onto the subgraph
osg::TexGenNode* texgenNode = new osg::TexGenNode;
texgenNode->getTexGen()->setMode(osg::TexGen::REFLECTION_MAP);
texgenNode->setTextureUnit(unit);
group->addChild(texgenNode);

// set the reflected subgraph so that it uses the texture and tex gen settings.
osg::Node* reflectorNode = reflectorNodePath.front();
{

group->addChild(reflectorNode);

osg::StateSet* stateset = reflectorNode->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(unit,texture,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);
stateset->setTextureMode(unit,GL_TEXTURE_GEN_S,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);
stateset->setTextureMode(unit,GL_TEXTURE_GEN_T,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);
stateset->setTextureMode(unit,GL_TEXTURE_GEN_R,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);
stateset->setTextureMode(unit,GL_TEXTURE_GEN_Q,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);

osg::TexMat* texmat = new osg::TexMat;
stateset->setTextureAttributeAndModes(unit,texmat,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);

reflectorNode->setCullCallback(new TexMatCullCallback(texmat));
}

osg::StateSet* ss = reflectorNode->getOrCreateStateSet();
ss->setTextureAttributeAndModes(unit,texture,osg::StateAttribute:ShockedN|osg::StateAttribute::OVERRIDE);

osg::Program* program = new osg::Program;
osg::ref_ptr<osg::Shader> shaderVertex = osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile(SHADER_PATH_VERT));
osg::ref_ptr<osg::Shader> shaderFragment = osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile(SHADER_PATH_FRAG));
program->addShader(shaderFragment);
program->addShader(shaderVertex);
ss->setAttributeAndModes( program, osg::StateAttribute:ShockedN );
ss->addUniform( new osg::Uniform("cubeMap", unit) );

osg::Uniform* u = new osg::Uniform("cameraPos",osg::Vec3());
u->setUpdateCallback( new UpdateCameraPosUniformCallback( camera ) );
ss->addUniform( u );

// add the reflector scene to draw just as normal
group->addChild(reflectedSubgraph);

// set an update callback to keep moving the camera and tex gen in the right direction.
group->setUpdateCallback(new UpdateCameraAndTexGenCallback(reflectorNodePath, Cameras));

return group;
}


int main() {
// construct the viewer.
osgViewer::Viewer viewer;

unsigned tex_width = 256;
unsigned tex_height = 256;

osg::Camera::RenderTargetImplementation renderImplementation = osg::Camera::FRAME_BUFFER_OBJECT;

osg::ref_ptr<osg::Group> scene = new osg::Group;
osg::ref_ptr<osg::Group> reflectedSubgraph = _create_scene();
if (!reflectedSubgraph.valid()) exit(0);

osg::ref_ptr<osg::Group> reflectedScene = createShadowedScene(
reflectedSubgraph.get(),
createReflector(),
TEXTURE_UNIT_CUBEMAP,
viewer.getCamera()->getClearColor(),
tex_width,
tex_height,
renderImplementation,
viewer.getCamera());

scene->addChild(reflectedScene.get());
viewer.setSceneData(scene.get());
viewer.setUpViewInWindow(0,0,600,600);
viewer.run();
return 0;
}





Vertex Shader:

Code:
#version 130

uniform mat4 osg_ViewMatrixInverse;
uniform vec3 cameraPos;

void main() {
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
mat4 ModelWorld4x4 = osg_ViewMatrixInverse * gl_ModelViewMatrix;
mat3 ModelWorld3x3 = mat3( ModelWorld4x4 );
vec4 WorldPos = ModelWorld4x4 * gl_Vertex;
vec3 N = normalize( ModelWorld3x3 * gl_Normal );
vec3 E = normalize( WorldPos.xyz - cameraPos.xyz );
gl_TexCoord[1].xyz = reflect( E, N );
}



Fragment Shader:

Code:
#version 130

uniform samplerCube cubeMap;
uniform sampler2D colorMap;
const float reflect_factor = 0.5;

void main (void)
{
vec3 base_color = texture2D(colorMap, gl_TexCoord[0].xy).rgb;
vec3 cube_color = textureCube(cubeMap, gl_TexCoord[1].xyz).rgb;
gl_FragColor = vec4( mix(cube_color, base_color, reflect_factor).rgb, 1.0);
}



...

Thank you!

Cheers,
Rômulo

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









------------------
Post generated by Mail2Forum
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Thu Jan 11, 2018 2:33 pm    Post subject:
Reply with quote

Hi Sebastian,

I believe copying and pasting code is not the case here. I have read a lot about MRT, RTT and FBO and debugged some source code examples (including your hints), however I still have problems in my side to compute the normal.

So let's go to new doubts:
- In Kapelko's example, if I disable the bumpmap use, why is the normal still computed by using the TBN matrix (please see [0])? Why the nn is set to vec3(1.0)? In addition, why one of the walls does not contains data (green channel is missing?)? - please see attachment


[0] https://bitbucket.org/kornerr/osg-deferred-shading/src/2b2f5532f41c305b31c46467291281388657b392/pass2.frag?at=default&fileviewer=file-view-default#pass2.frag-20
-
...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Thu Jan 11, 2018 2:42 pm    Post subject:
Reply with quote

Moreover, I installed the openscenegraph-examples package (using Ubuntu), however the osgdeferred example does not contain all complementary data (i.e. data/shaders/simpleShader01, data/shaders/colorTextureShader and data/shaders/lightingPass).

I could not find these shader codes in https://github.com/openscenegraph/OpenSceneGraph-Data.

...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Tue Jan 30, 2018 1:21 am    Post subject:
Reply with quote

Hi,

I still have problems to manage the normal view from reflected objects (using dynamic cubemaps technique). Please any tip here?
...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
SMesserschmidt (Sebastian Messerschmidt)
Forum Moderator


Joined: 10 Sep 2013
Posts: 823

PostPosted: Tue Jan 30, 2018 8:15 am    Post subject:
Normal Mapping using Dynamic Cubemap
Reply with quote

I'll try a last time:


Quote:
Hi,

I still have problems to manage the normal view from reflected objects (using dynamic cubemaps technique). Please any tip here?


Have you managed to render your normals, colors, depth etc to a MRT-FBO?
If so, the next step is to render to do this 6 times, where each time
you're FBO-attachments are the images of your cube-maps. You will need
separate cubemaps for the normals, colors etc.

Simply tell us where you're stuck. Last time it sounded like you're on a
good way, but I personally don't have much time to help you with the
detailed problems you encountered.

Cheers
Sebastian.

Quote:
...

Thank you!

Cheers,
Rômulo

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









------------------
Post generated by Mail2Forum
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Sat Feb 03, 2018 7:52 pm    Post subject:
Reply with quote

Hi Sebastian,

I have managed the normal and depth using MRT-FBO. I changed the osgdeferred example to display the normal (blue) and depth (green). Now I need to repeat this process for each six faces of cubemap.

I have a question: to capture the normal/depth data, as seen in Figure, I used the eye space. For dynamic cubemap, I need to use the eye space or world space?
...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
SMesserschmidt (Sebastian Messerschmidt)
Forum Moderator


Joined: 10 Sep 2013
Posts: 823

PostPosted: Sat Feb 03, 2018 8:07 pm    Post subject:
Normal Mapping using Dynamic Cubemap
Reply with quote

Hi,
Quote:
Hi Sebastian,

I have managed the normal and depth using MRT-FBO. I changed the osgdeferred example to display the normal (blue) and depth (green). Now I need to repeat this process for each six faces of cubemap.
Nice to see that you're making progress.
Quote:

I have a question: to capture the normal/depth data, as seen in Figure, I used the eye space. For dynamic cubemap, I need to use the eye space or world space?
Usually cubemaps are in world-space as they represent the view from a
certain world-coordinate.

Cheers
Sebastian
Quote:
...

Thank you!

Cheers,
Rômulo

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




Attachments:
http://forum.openscenegraph.org//files/screenshot_from_2018_02_02_23_11_17_990.png






------------------
Post generated by Mail2Forum
Back to top
View user's profile Send private message
romulogcerqueira
User


Joined: 11 Jun 2015
Posts: 65
Location: Brazil

PostPosted: Sat Feb 03, 2018 9:34 pm    Post subject:
Reply with quote

Hi Sebastian,

thanks for all comments. Do you know how I can manage these six faces of cubemap? I can handle all faces using one texture or I need to create six textures?

I really need help with this...It's essential to my project.
...

Thank you!

Cheers,
Rômulo
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    OpenSceneGraph Forum Forum Index -> General All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum

Similar Topics
Topic Author Forum Replies Posted
No new posts Dynamic VBO Performance Drop ravidavi General 1 Thu Dec 06, 2018 8:36 pm View latest post
No new posts Mapping texture coordinates to a port... ijwolf8 General 0 Thu Oct 25, 2018 8:11 pm View latest post
No new posts Load an obj file and mapping a given ... aaa3d General 3 Mon Aug 06, 2018 2:27 pm View latest post
No new posts EXTERNAL: Re: World space normal. Rowley, Marlin R General 1 Wed Jul 11, 2018 4:30 pm View latest post
No new posts World space normal. Rowley, Marlin R General 4 Wed Jul 11, 2018 1:18 pm View latest post


Board Security Anti Bot Question MOD - phpBB MOD against Spam Bots
Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP