osg图片优化手段,dds图片格式,Mipmap技术。

今天北京有沙尘。我感觉疫情下的天空,格外的苍凉。
不过,还是不能中断我更新博客。今天简简单单写个
osg渲染中常用到的图片优化手段。

当然,这样得记录一些知识:

  • 模型贴图使用dds+mipmap的方式加载时间和显存占用时间明显降低。
  • dds格式:DDS是一种图片格式。DirectDraw Surface的缩写,它是DirectX纹理压缩(DirectX Texture Compression,简称DXTC)的产物。【来自百度百科】
  • Mipmap:Mipmap(有时候拼写成mipmap)是一种电脑图形图像技术,用于在三维图像的二维代替物中达到立体感效应。【来自百度百科】

注:以下代码没执行过,不过确实是我开发中运用到的大概思路,这里做以简单的记录,供以后参考


#include
#include
#include
#include
#include
#include

//写一个放缩图片的函数
void scaleImage(osg::ref_ptr<osg::Image> image, const float scale)
{
	//当然,知道图片的放缩比例之后,仍然是对图片的宽和高进行放缩。
	const int width = image->s() * scale;
	const int height = image->t() * scale;

	image->scaleImage(width, height, image->r());//r是深度,caleImage方法头文件在osg/Image中
}
/*
virtual void compress(osg::Image& image, osg::Texture::InternalFormatMode compressedFormat, bool generateMipMap, bool resizeToPowerOfTwo, CompressionMethod method, CompressionQuality quality) {}
*/
//压缩和写图片函数
void compressAndWrite(osg::ref_ptr<osg::Image> image, const boost::filesystem::Path& imagePath)
{
	//压缩方式,是osg本身提供的。只是需要会运用即可,具体参数含义在函数体上说明,当然,从源码中粘来的。
	osg::Registry::instance()->getImageProcessor()->compress(*image
	, osg::Texture::USE_S3TC_DXT5_COMPRESSION
	, true
	, true
	, osgDB::ImageProcess::USE_CPU
	, osgDB::ImageProcess::NORMAL);

	osg::writeImageFile(*image, imagePath.string());
}


//我们就叫个optimizerImage,下面程序主要是思路。
void optimizerImage()
{
	auto imagePath = "G:\\image\\image0";
	osg::Image sourceImage = osgDB::readImageFile(imagePath.string());
	osg::Image lowPrecisionImage = sourceImage->clone(osg::CopyOp::DEEP_COPY_ALL);
	
	//接下来,计算下图片的面积大小,宽*高。下面开始,写的明白点
	const int width = lowPrecisionImage->s();
	const int hight = lowPrecisionImage->t();
	const imageArea = width * hight;
	
	//假设需要贴的区域时needArea,则图片的像素密度就是图片的面积除以要贴的位置的面积
	float scale = imageArea / needArea ;
	
	//定义图片密度每平方不超过5.0f,大于10的时候对其进行变幻。
	const float imageDensity = 5.0f;
	if(scale > imageDensity)
	{
		scaleImage(lowPrecision, imageDensity/scale)
	}
	//下一步,我们将图片资源重命名成dds格式
	const std::string newImageName = lowPrecisionImage.substr(0, lowPrecisionImage.rfind("."))+".dds";

	//接下来对图片进行压缩并写入目标路径
	const destImagePath = "G:\\destImage\\" + newImageName;
	compressAndWirte(newImageName, destImagePath);
}


你可能感兴趣的:(渲染技术,#,C++,#,OpenSceneGraph)