[fixed]Render to texture bug

You discovered a bug in the engine, and you are sure that it is not a problem of your code? Just post it in here. Please read the bug posting guidelines first.
Post Reply
far_cry
Posts: 4
Joined: Sun Jul 27, 2008 7:14 pm

[fixed]Render to texture bug

Post by far_cry »

Hi guys,

in the render to texture example, when I put the antialising on, the model in the texture seem to have (appearance problems)?

if any one can help.

thanks.
christianclavet
Posts: 1638
Joined: Mon Apr 30, 2007 3:24 am
Location: Montreal, CANADA
Contact:

Post by christianclavet »

Can you post a screenshot so we see the "appearance problems"?
far_cry
Posts: 4
Joined: Sun Jul 27, 2008 7:14 pm

Post by far_cry »

hi guys,
here the screenshots:

in this screenshot look at the right wing and right hand.
Image

in this, look at the left hand
Image

Image

i think this is a z-depth problem.

here is the code:

/*
This tutorial shows how to render to a texture using Irrlicht. Render to texture is a feature with which
it is possible to create nice special effects. In addition, this tutorial shows how to enable specular
highlights.

In the beginning, everything as usual. Include the needed headers, ask the user for the rendering
driver, create the Irrlicht Device:
*/

#include <irrlicht.h>
#include <iostream>

using namespace irr;

#pragma comment(lib, "Irrlicht.lib")

int main()
{
// let user select driver type

video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Burning's Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");

char i;
std::cin >> i;
f32 rot = 0.0f;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
}

// create device and exit if creation failed

irr::SIrrlichtCreationParameters param;
param.AntiAlias = true;
param.Bits = 32;
param.DriverType = driverType;
param.Fullscreen = true;
param.Vsync = false;
param.Stencilbuffer = false;
param.WindowId = 0;
param.WindowSize = irr::core::dimension2d<s32>(640,480);
IrrlichtDevice *device =
createDeviceEx(param);


if (device == 0)
return 1; // could not create selected driver.

video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* env = device->getGUIEnvironment();

/*
Now, we load an animated mesh to be displayed. As in most examples,
we'll take the fairy md2 model. The difference here: We set the shininess
of the model to a value other than 0 which is the default value. This
enables specular highlights on the model if dynamic lighting is on.
The value influences the size of the highlights.
*/

// load and display animated fairy mesh

scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode(
smgr->getMesh("../../media/faerie.md2"));

if (fairy)
{
fairy->setMaterialTexture(0, driver->getTexture("../../media/faerie2.bmp")); // set diffuse texture
fairy->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting
fairy->getMaterial(0).Shininess = 20.0f; // set size of specular highlights
fairy->setPosition(core::vector3df(-10,0,-100));
fairy->setMD2Animation ( scene::EMAT_STAND );
}

/*
To make specular highlights appear on the model, we need a dynamic light in the scene.
We add one directly in vicinity of the model. In addition, to make the model not that
dark, we set the ambient light to gray.
*/

// add white light
scene::ILightSceneNode* light = smgr->addLightSceneNode(0,
core::vector3df(-15,5,-105), video::SColorf(1.0f, 1.0f, 1.0f));

// set ambient light
smgr->setAmbientLight(video::SColor(0,60,60,60));

/*
The next is just some standard stuff: Add a user controlled camera to the scene, disable
mouse cursor, and add a test cube and let it rotate to make the scene more interesting.
*/

// add fps camera
scene::ICameraSceneNode* fpsCamera = smgr->addCameraSceneNodeFPS();
fpsCamera->setPosition(core::vector3df(-50,50,-150));

// disable mouse cursor
device->getCursorControl()->setVisible(false);

// create test cube
scene::ISceneNode* test = smgr->addCubeSceneNode(60);

// let the cube rotate and set some light settings
//scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
// core::vector3df(0.3f, 0.3f,0));


test->setPosition(core::vector3df(-100,0,-100));
test->setMaterialFlag(video::EMF_LIGHTING, false); // disable dynamic lighting
//test->addAnimator(anim);
//anim->drop();


// set window caption
device->setWindowCaption(L"Irrlicht Engine - Render to Texture and Specular Highlights example");

/*
To test out the render to texture feature, we need a render target texture. These are not
like standard textures, but need to be created first. To create one, we call
IVideoDriver::createRenderTargetTexture() and specify the size of the texture. Please
don't use sizes bigger than the frame buffer for this, because the render target shares
the zbuffer with the frame buffer. And because we want to render the scene not from the
user camera into the texture, we add another, fixed camera to the scene. But before we
do all this, we check if the current running driver is able to render to textures. If
it is not, we simply display a warning text.
*/

// create render target
video::ITexture* rt = 0;
scene::ICameraSceneNode* fixedCam = 0;


if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
rt = driver->createRenderTargetTexture(core::dimension2d<s32>(256,256));
test->setMaterialTexture(0, rt); // set material of cube to render target

// add fixed camera
fixedCam = smgr->addCameraSceneNode(0, core::vector3df(10,10,-80),
core::vector3df(-10,10,-100));
}
else
{
// create problem text
gui::IGUISkin* skin = env->getSkin();
gui::IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
if (font)
skin->setFont(font);

gui::IGUIStaticText* text = env->addStaticText(
L"Your hardware or this renderer is not able to use the "\
L"render to texture feature. RTT Disabled.",
core::rect<s32>(150,20,470,60));

text->setOverrideColor(video::SColor(100,255,255,255));
}

/*
Nearly finished. Now we need to draw everything. Every frame, we draw the scene twice.
Once from the fixed camera into the render target texture and once as usual. When rendering
into the render target, we need to disable the visibilty of the test cube, because it has
the render target texture applied to it.
That's, wasn't quite complicated I hope. :)
*/

int lastFPS = -1;

while(device->run())
if (device->isWindowActive())
{
rot+= 0.1f;
fairy->setRotation(core::vector3df(0,rot,0));

driver->beginScene(true, true, 0);

if (rt)
{
// draw scene into render target

// set render target texture
driver->setRenderTarget(rt, true, true, video::SColor(0,0,0,255));

// make cube invisible and set fixed camera as active camera
test->setVisible(false);
smgr->setActiveCamera(fixedCam);

// draw whole scene into render buffer
smgr->drawAll();

// set back old render target
// The buffer might have been distorted, so clear it
driver->setRenderTarget(0, true, true, 0);

// make the cube visible and set the user controlled camera as active one
test->setVisible(true);
smgr->setActiveCamera(fpsCamera);
}

// draw scene normally
smgr->drawAll();
env->drawAll();

driver->endScene();

// display frames per second in window title
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"Irrlicht Engine - Render to Texture and Specular Highlights example";
str += " FPS:";
str += fps;

device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}

if (rt)
rt->drop(); // drop render target because we created if with a create() method

device->drop(); // drop device
return 0;
}
Last edited by far_cry on Wed Jul 30, 2008 12:51 pm, edited 5 times in total.
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

The screenshots are pretty dark here, hard to spot the actual problem. Did you alter anything in the example's source code - I din't bother with diff'ing your code with the original one!?
far_cry
Posts: 4
Joined: Sun Jul 27, 2008 7:14 pm

Post by far_cry »

I only add the bold texts. ( I replace createDevice with createDeviceEx, disable the rotation animator of the cube, and rotate fairy model), nothing else.

there is a problem here. nothing I added causes a problem, it is an Irrlicht bug.
rogerborg
Admin
Posts: 3590
Joined: Mon Oct 09, 2006 9:36 am
Location: Scotland - gonnae no slag aff mah Engleesh
Contact:

Post by rogerborg »

I honestly have no idea what problem you are reporting. Can you back up a bit and explain how what you are seeing is different from what you expect to see?
Please upload candidate patches to the tracker.
Need help now? IRC to #irrlicht on irc.freenode.net
How To Ask Questions The Smart Way
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

Yes, the problem can also be reproduced with the standard RTT example. However, the STAND animation doesn't expose it really. But once the setting is changed (simply by removing that line, and probably also the rotation animator to get a better image) one can clearly see that the changed RTT code has problems with the zbuffer.
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

Ok, fixed it. Was a wrong usage of the renderbuffer which is now used for the zbuffer. I did use a teximage2d call instead of a renderbuffer call.
Post Reply