[osg-users] [build] using 3Ds Model in osgFX::BumpMapping and the Texture UV Coords for diffuse are not loaded

Tobias Rick raveworld at freenet.de
Wed Nov 11 17:21:05 PST 2015


For everyone who wants to use a bump map shader in osg you can find a working code in the lines below.

The source file:

> 
> #include <osg/Group>
> #include <osg/Image>
> #include <osg/MatrixTransform>
> #include <osg/Node>
> #include <osg/StateSet>
> #include <osg/TexMat>
> #include <osg/Texture2D>
> #include <osgDB/ReadFile>
> #include <osgGA/TrackballManipulator>
> #include <osgViewer/Viewer>
> 
> #include <osg/Program>
> #include <osg/Shader>
> #include <osg/Uniform>
> #include <osgDB/FileUtils>
> 
> int main(int argc, char **argv) {
> 
> 	// Root
> 	osg::Group* bumpRoot = new osg::Group();
> 
> 	// Model with bump mapping
> 	osg::Geometry* bumpModel = new osg::Geometry();
> 	bumpModel = (osg::Geometry*) osgDB::readNodeFile("Models/model_scifi_roadway_00straight.3ds");
> 
> 	// Model stateset to activate bump mapping shader
> 	osg::StateSet* bumpState = new osg::StateSet();
> 	bumpState = bumpModel->getOrCreateStateSet();
> 
> 	// Stateset shader program
> 	osg::Program* bumpMapProgramObject = new osg::Program;
> 
> 	// Set shader
> 	osg::Shader* bumpVertexObject = new osg::Shader(osg::Shader::VERTEX);
> 	osg::Shader* bumpFragmentObject = new osg::Shader(osg::Shader::FRAGMENT);
> 
> 	std::string bumpVertexFileName = osgDB::findDataFile("Shading/newbump.vert");
> 	bumpVertexObject->loadShaderSourceFromFile(bumpVertexFileName.c_str());
> 	std::string bumpFragmentFileName = osgDB::findDataFile("Shading/newbump.frag");
> 	bumpFragmentObject->loadShaderSourceFromFile(bumpFragmentFileName.c_str());
> 
> 	bumpMapProgramObject->addShader(bumpVertexObject);
> 	bumpMapProgramObject->addShader(bumpFragmentObject);
> 
> 	// Set textures
> 	osg::Texture2D *normal = new osg::Texture2D();
> 	osg::Texture2D *diffuse = new osg::Texture2D();
> 
> 	const char* normal_texture = "Textures/Normal/texture_scifi_roadway_00normal.png";
> 	const char* diffuse_texture = "Textures/texture_scifi_roadway_00.png";
> 
> 	osg::Image *normal_image = osgDB::readImageFile(normal_texture);
> 	osg::Image *diffuse_image = osgDB::readImageFile(diffuse_texture);
> 
> 	normal->setImage(normal_image);
> 	normal->setDataVariance(osg::Object::DYNAMIC);
> 	normal->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
> 	normal->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
> 	normal->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
> 	normal->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
> 	normal->setResizeNonPowerOfTwoHint(false);
> 	normal->setMaxAnisotropy(8.0f);
> 
> 	diffuse->setImage(diffuse_image);
> 	diffuse->setDataVariance(osg::Object::DYNAMIC);
> 	diffuse->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
> 	diffuse->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
> 	diffuse->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
> 	diffuse->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
> 	diffuse->setResizeNonPowerOfTwoHint(false);
> 	diffuse->setMaxAnisotropy(8.0f);
> 
> 	// Set texture matrix
> 	osg::TexMat* texMat = new osg::TexMat;
> 	osg::Vec3d texPosition(0.0, 0.0, 0.0);
> 	osg::Vec3d texAngles(0.0, 0.0, 0.0);
> 	osg::Vec3d texScale(2.0, 2.0, 2.0);
> 	osg::Matrixd texRot;
> 	texRot.makeRotate(
> 		osg::DegreesToRadians(texAngles.x()), osg::Vec3(1, 0, 0),
> 		osg::DegreesToRadians(texAngles.y()), osg::Vec3(0, 1, 0),
> 		osg::DegreesToRadians(texAngles.z()), osg::Vec3(0, 0, 1));
> 	texMat->setMatrix(osg::Matrix::scale(texScale)*texRot*osg::Matrix::translate(texPosition));
> 
> 	const int TEXTURE_UNIT_BUMP = 1;
> 	const int TEXTURE_UNIT_DIFFUSE = 0;
> 
> 	// Add bump map to model stateset
> 	// normalTexture in newbump.frag as uniform sampler2D normalTexture
> 	// diffuseTexture in newbump.frag as uniform sampler2D diffuseTexture
> 	bumpState->addUniform(new osg::Uniform("normalTexture", TEXTURE_UNIT_BUMP));
> 	bumpState->addUniform(new osg::Uniform("diffuseTexture", TEXTURE_UNIT_DIFFUSE));
> 	bumpState->setAttributeAndModes(bumpMapProgramObject, osg::StateAttribute::ON);
> 	// State set options
> 	bumpState->setTextureAttributeAndModes(TEXTURE_UNIT_DIFFUSE, diffuse, osg::StateAttribute::ON);
> 	bumpState->setTextureAttributeAndModes(TEXTURE_UNIT_DIFFUSE, texMat, osg::StateAttribute::ON);
> 	bumpState->setTextureAttributeAndModes(TEXTURE_UNIT_BUMP, normal, osg::StateAttribute::ON);
> 	bumpState->setTextureAttributeAndModes(TEXTURE_UNIT_BUMP, texMat, osg::StateAttribute::ON);
> 	//bumpState->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
> 	//bumpState->setTextureMode(1, GL_TEXTURE_2D, osg::StateAttribute::ON);
> 	//bumpState->setGlobalDefaults();
> 	//bumpState->setMode(GL_LIGHTING, osg::StateAttribute::ON);
> 	//bumpState->setMode(GL_BLEND, osg::StateAttribute::ON);
> 	bumpState->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
> 	//bumpState->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
> 
> 	// Add stateset to model
> 	bumpModel->setStateSet(bumpState);
> 
> 	// Set model matrix transform
> 	osg::MatrixTransform *MT = new osg::MatrixTransform();
> 	MT->setDataVariance(osg::Object::STATIC);
> 	MT->addChild(bumpModel);
> 	bumpRoot->addChild(MT);
> 
> 	// Set viewer
> 	osgViewer::Viewer bumpViewer;
> 	bumpViewer.setSceneData(bumpRoot);
> 	bumpViewer.setCameraManipulator(new osgGA::TrackballManipulator());
> 	bumpViewer.realize();
> 
> 	while (!bumpViewer.done()) {
> 		bumpViewer.frame();
> 	}
> 	return 0;
> }
> 


The modified newbump.frag

> 
> uniform sampler2D diffuseTexture;
> uniform sampler2D normalTexture;
> 
> // New bumpmapping
> varying vec3 lightVec;
> varying vec3 halfVec;
> varying vec3 eyeVec;
> 
> void main() { 
> 
> 	// lookup normal from normal map, move from [0,1] to  [-1, 1] range, normalize
> 	vec3 normal = 2.0 * texture2D (normalTexture, gl_TexCoord[0].st).rgb - 1.0;
> 	normal = normalize (normal);
> 	
> 	// compute diffuse lighting
> 	float lamberFactor= max (dot (lightVec, normal), 0.0) ;
> 	vec4 diffuseMaterial = 0.0;
> 	vec4 diffuseLight  = 0.0;
> 	
> 	// compute specular lighting
> 	vec4 specularMaterial ;
> 	vec4 specularLight ;
> 	float shininess ;
>   
> 	// compute ambient
> 	vec4 ambientLight = gl_LightSource[0].ambient;	
> 	
> 	if (lamberFactor > 0.0)
> 	{
> 		diffuseMaterial = texture2D (diffuseTexture, gl_TexCoord[0].st);
> 		diffuseLight  = gl_LightSource[0].diffuse;
> 		
> 		// In doom3, specular value comes from a texture 
> 		specularMaterial =  vec4(1.0)  ;
> 		specularLight = gl_LightSource[0].specular;
> 		shininess = 0.05;
> 		//shininess = pow (max (dot (halfVec, normal), 0.0), 2.0)  ;
> 		 
> 		gl_FragColor =	diffuseMaterial * diffuseLight * lamberFactor ;
> 		gl_FragColor +=	specularMaterial * specularLight * shininess ;				
> 	
> 	}
> 	
> 	gl_FragColor +=	ambientLight;
> 	
>   }		
> 


The modified newbump.vert

> 
> attribute vec3 tangent;
> varying vec3 lightVec;
> varying vec3 halfVec;
> varying vec3 eyeVec;
> 
> void main() {
> 
> 	//gl_TexCoord[0] =  gl_MultiTexCoord0;
> 	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
> 	gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
> 	
> 	// Building the matrix Eye Space -> Tangent Space
> 	vec3 n = normalize (gl_NormalMatrix * gl_Normal);
> 	vec3 t = normalize (gl_NormalMatrix * tangent);
> 	vec3 b = cross (n, t);
> 	
> 	vec3 vertexPosition = vec3(gl_ModelViewMatrix *  gl_Vertex);
> 	vec3 lightDir = normalize(gl_LightSource[0].position.xyz - vertexPosition);
> 		
> 		
> 	// transform light and half angle vectors by tangent basis
> 	vec3 v;
> 	v.x = dot (lightDir, t);
> 	v.y = dot (lightDir, b);
> 	v.z = dot (lightDir, n);
> 	lightVec = normalize (v);
> 	
> 	  
> 	v.x = dot (vertexPosition, t);
> 	v.y = dot (vertexPosition, b);
> 	v.z = dot (vertexPosition, n);
> 	eyeVec = normalize (v);
> 	
> 	
> 	vertexPosition = normalize(vertexPosition);
> 	
> 	/* Normalize the halfVector to pass it to the fragment shader */
> 
> 	// No need to divide by two, the result is normalized anyway.
> 	// vec3 halfVector = normalize((vertexPosition + lightDir) / 2.0); 
> 	vec3 halfVector = normalize(vertexPosition + lightDir);
> 	v.x = dot (halfVector, t);
> 	v.y = dot (halfVector, b);
> 	v.z = dot (halfVector, n);
> 
> 	// No need to normalize, t,b,n and halfVector are normal vectors.
> 	//normalize (v);
> 	halfVec = v ; 
> 	  
> 	  
> 	gl_Position = ftransform();
> 
> }
> 


I hope I can help osg programmer with the same problem.[/quote]

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








More information about the osg-users mailing list