7.2.4节 将场景渲染到纹理

本例子展示osg渲染到纹理的技术,代码来自《OpenSceneGraph三维渲染引擎设计与实践.pdf》7.2.4节。以下 代码变量名有些和书中有点小差别,但功能是一样的,不影响学习:

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osgDB/Readfile>
#include <osgDB/WriteFile>

osg::Camera* createCamera(int nWidth, int nHeight, const osg::BoundingSphere&bs)
{
	auto pCamera = new osg::Camera;
	pCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	pCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
	pCamera->setViewport(0, 0, nWidth, nHeight);
	pCamera->setRenderOrder(osg::Camera::PRE_RENDER);
	pCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
	auto viewDistance = 2.0 * bs.radius();
	auto znear = viewDistance - bs.radius();
	auto zfar = viewDistance + bs.radius();
	auto top = 0.6 * znear;
	auto right = 0.8 * znear;

	pCamera->setProjectionMatrixAsFrustum(-right, right, -top, top, znear, zfar);

	osg::Vec3d upDirection(0, 0, 1);
	osg::Vec3d viewDirection(0, -1, 0);
	osg::Vec3d center = bs.center();
	osg::Vec3d eyePoint = center + viewDirection * viewDistance;
	pCamera->setViewMatrixAsLookAt(eyePoint, center, upDirection);

	return pCamera;
}

osg::Texture2D* createTexture2D(int nWidth, int nHeight)
{
	osg::Texture2D* pTx2d = new osg::Texture2D;
	pTx2d->setInternalFormat(GL_RGBA); // 内部格式必须设置,否则模型不会显示在纹理对象上
	pTx2d->setTextureWidth(nWidth);
	pTx2d->setTextureHeight(nHeight);
	pTx2d->setFilter(osg::Texture::FilterParameter::MIN_FILTER, osg::Texture::NEAREST);
	pTx2d->setFilter(osg::Texture::FilterParameter::MAG_FILTER, osg::Texture::NEAREST);

	return pTx2d;
}

int main()
{
	osgViewer::Viewer viewr;
	auto pCowNode = osgDB::readRefNodeFile("cow.osg");
	if (nullptr == pCowNode)
	{
		return 1;
	}

	pCowNode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
	osg::Group* pRoot = new osg::Group;

	osg::ref_ptr<osg::Geode> spGeode = new osg::Geode;
	spGeode->addDrawable(osg::createTexturedQuadGeometry(osg::Vec3(0, 0, 0), osg::Vec3(1, 0, 0), osg::Vec3(0, 0, 1)));
	const auto nWidth = 512;
	const auto nHeight = 512;
	auto pTx2D = createTexture2D(nWidth, nHeight);
	spGeode->getOrCreateStateSet()->setTextureAttributeAndModes(0, pTx2D);
	pRoot->addChild(spGeode);
	
	auto spCamera = createCamera(nWidth, nHeight, pCowNode->getBound());
	spCamera->addChild(pCowNode);
	spCamera->attach(osg::Camera::COLOR_BUFFER, pTx2D);
	
	pRoot->addChild(spCamera);
	viewr.setSceneData(pRoot);
	viewr.run();

	return 0;
}

结果将奶牛渲染到了一个长方形中,如下为结果:

 图1 初始结果图

图2.将长方形转动一定角度后的效果图 

根据教材7.2.4,我们可以使用Keras框架来实现一个猫狗分类的应用实例。下面是具体的步骤: 1. 数据准备:准备包含猫和狗图片的数据集。可以从网络上下载已经标记好的猫狗图片数据集,或者自己收集和标记图片数据集。将数据集分成训练集和测试集。 2. 数据预处理:使用Keras的图片处理工具,将图片加载进来,并进行大小调整和归一化处理。还可以选择进行数据增强操作,如旋转、平移、缩放等,以扩大数据集。 3. 构建模型:使用Keras框架构建一个卷积神经网络模型。可以使用多个卷积层和池化层,来提取图像特征。之后加入全连接层和输出层进行分类预测。 4. 编译模型:配置模型的优化器、损失函数和评估指标。可以选择常用的优化器如SGD、Adam等,损失函数可以选择交叉熵损失,评估指标可以选择准确率。 5. 训练模型:使用训练集对模型进行训练。可以使用Keras提供的fit函数,设置训练的批次大小、训练轮数。训练过程中可以监控模型在验证集上的准确率变化。 6. 模型评估:使用测试集对训练好的模型进行评估。可以使用Keras提供的evaluate函数,得到模型在测试集上的准确率等指标。 7. 模型应用:对于新的图片,使用训练好的模型进行预测。可以使用Keras提供的predict函数,得到图片属于猫还是狗的概率值。 通过以上步骤,我们就可以在Keras框架下实现一个猫狗分类的应用实例。可以通过调整模型结构,改进数据预处理方式以及调整超参数等方式来提升模型的准确率。同时,也可以尝试使用预训练的模型,如VGG16、ResNet等,在猫狗分类任务上进行迁移学习,以进一步提高模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值