osgFX实现方式解析

OSG中osgFX库 osgFX库包含了一系列预定义的特效节点。这些节点本身是osg::Group的子类,你可以将它们插入到场景图中,它们会自动对其子节点应用特定的渲染效果。“即插即用”。你不需要是 GLSL 专家,只需将一个特效节点作为父节点包裹住你想要施加效果的模型或子树,该模型就会自动具有相应的特效。重要提示osgFX的效果是通过在运行时生成和应用着色器(Shader)实现的。虽然方便,但可能不如手写着色器灵活和高效。它非常适合快速原型制作和实现一些常见效果。 阅读详情
  • 简介

osgFX是一个osg的附加库,是一个用于实现可重用特殊效果的架构工具,它实现的效果可以添加到OSG的节点中。它包含了一系列预定义好的特殊效果,osg3.2中主要有如下几种:

  1. Anisotropic Lighting 各向异性光照
  2. 凹凸纹理
  3. 卡通渲染
  4. 刻画线
  5. 立方图镜面高光
  6. 轮廓线

具体的类结构如下图所示:

  • 使用

osgFX::Effect是一个Group节点,使用的时候我们只需要把需要设置效果的节点添加到osgFX::Effect节点之下。如:当需要为一个Geode节点添加线框效果,可以使用如下的方式实现:

	osg::Geode *geode = new osg::Geode;
	geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(), 2)));
        //声明Effect节点并把Geode添加到其中
	osgFX::Outline *outline = new osgFX::Outline;
	outline->addChild(geode);
	outline->setColor(osg::Vec4(1.0, 1.0, 0.0, 1.0));
	outline->setWidth(5.0f);
  • 原理

osgFX的实现原理实际上是构建多个渲染状态集,实现对场景中可绘制对象的多次渲染。在osgscribe示例中为实现对模型刻画线的效果,需要添加两次可绘制对象的节点,从而实现渲染两次的效果:

//rootnode需要添加两次loadedModel
//其中一次采用默认的渲染状态来渲染
//另一次采用decorator中设置的渲染状态来渲染(刻线)
osg::Node *loadedModel = osgDB::readNodeFile("cow.osgt");
osg::Group* rootnode = new osg::Group;
osg::Group* decorator = new osg::Group;
rootnode->addChild(loadedModel);
rootnode->addChild(decorator);
decorator->addChild(loadedModel);  

//设置刻线渲染状态
osg::StateSet* stateset = new osg::StateSet;
osg::PolygonOffset* polyoffset = new osg::PolygonOffset;
polyoffset->setFactor(-1.0f);
polyoffset->setUnits(-1.0f);
osg::PolygonMode* polymode = new osg::PolygonMode;
polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
stateset->setAttributeAndModes(polyoffset,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
stateset->setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);

osg::Material* material = new osg::Material;
stateset->setAttributeAndModes(material,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);

decorator->setStateSet(stateset);
这种方式有些繁琐,但是因为在场景节点树结构中只好这样去做(因为我们的节点osg::Node只有一个_stateSet的成员,不存在多个渲染状态)。但是如果直接操作OSG渲染的状态树,就可以做到不需要再场景中添加多次(待渲染的节点),举例如下:

//为了实现同时显示实体和网格对象的OpenGL代码
//对象本身实际上被渲染了两次
glPolygonOffset(1.0, 1.0);
drawScene();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
drawScene();
同样的代码在OSG中通过场景树结构的表达就是上面osgscribe示例中的方式。另一种方式则是通过直接操作OSG状态树的分支内容实现的,示意代码如下:

//void UserNode::traverse(osg::NodeVisitor& nv)函数中
osgUtil::CullVisitor *cv = dynamic_cast<osgUtil::CullVisitor>(&nv);
if(cv) 
{
//stateset1保存PolygonOffset状态集
//stateset2保存PolygonMode状态集
	cv->pushStateSet(stateset1);
	Node::traverse(cv);
	cv->popStateSet();
	cv->pushStateSet(stateset2);
	Node::traverse(cv);
	cv->popStateSet();
}
OSG中状态树的构建是在CullVisitor遍历和裁剪场景树的过程中完成的。以上就是osgFX库架构的基本原理了,我们详细看看osgFX中是如何做到的:

首先要实现一种自定义的Effect特效,我们需要重载define_techniques函数,一般在这个函数中我们需要定义实现自定义特效的技术(osgFX::Technique),所谓的技术实际上就是一系列的StateSet集合,并将设置好的技术添加到Effect之中(addTechnique),参考Outline的实现代码:

    bool Outline::define_techniques()
    {
        _technique = new OutlineTechnique;
        addTechnique(_technique);

        setWidth(_width);
        setColor(_color);

        return true;
    }
接下来需要做的就是实现自定义的Technique了,要实现自定义的Technique需要重载define_passes这个函数,在里面定义很多渲染的状态集StateSet(上文描述的stateset1和stateset2就在这儿进行定义并添加),同样我们参考OutlineTechnique中的实现代码:

           {
                osg::StateSet* state = new osg::StateSet;
                osg::Stencil* stencil  = new osg::Stencil;
                stencil->setFunction(osg::Stencil::ALWAYS, 1, ~0u);
                stencil->setOperation(osg::Stencil::KEEP,
                                      osg::Stencil::KEEP,
                                      osg::Stencil::REPLACE);
                state->setAttributeAndModes(stencil, Override_On);

                addPass(state);
            }
            {
                osg::StateSet* state = new osg::StateSet;
                osg::Stencil* stencil  = new osg::Stencil;
                stencil->setFunction(osg::Stencil::NOTEQUAL, 1, ~0u);
                stencil->setOperation(osg::Stencil::KEEP,
                                      osg::Stencil::KEEP,
                                      osg::Stencil::REPLACE);
                state->setAttributeAndModes(stencil, Override_On);
				......
                addPass(state);
            }
它定义了两个StateSet并添加到Technique中,这样在渲染的时候实际上渲染了两次,分别用各自定义的渲染状态来渲染。

我们再来看看渲染的代码:按我们上文所说应该是在CullVisitor中进行的,查看源码也正好验证了我们所想,代码正好在Technique的traverse()之中,它的实现直接调用了traverse_implement:

void Technique::traverse_implementation(osg::NodeVisitor& nv, Effect* fx)
{
    if (_passes.empty()) {
        define_passes();
    }

    // special actions must be taken if the node visitor is actually a CullVisitor
    osgUtil::CullVisitor *cv = dynamic_cast<osgUtil::CullVisitor *>(&nv);

    for (int i=0; i<getNumPasses(); ++i) 
	{
        if (cv) {
            cv->pushStateSet(_passes[i].get());
        }
        osg::Node *override = getOverrideChild(i);
        if (override) {
            override->accept(nv);
        } else {
            fx->inherited_traverse(nv);
        }
        if (cv) {
            cv->popStateSet();
        }
    }
}
是不是很熟悉呢,正好和我们上面的演示伪代码一样。另外我们还需要知道这个Technique的traverse函数是在什么地方调用的呢?正是在Effect的traverse函数中调用的,在场景开始遍历的时候就会调用Technique的traverse函数完成渲染树的构建了。osgFX::Effect的traverse函数代码如下所示:

void Effect::traverse(osg::NodeVisitor& nv)
{ 
   ......
   
   if (tech) {
        tech->traverse(nv, this);
    } else {
        if (nv.getTraversalMode() == osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {
            inherited_traverse(nv);
        }
    }
}
  • 示例

下面是一个简单实用osgFX::Outline的例子,其他特效类Effect的使用方式类同:

#include <osgViewer/Viewer>
#include <osg/Group>
#include <osg/Geode>
#include <osgGA/GUIEventHandler>
#include <osgFX/Outline>
#include <osg/ShapeDrawable>


void int main(int argc, char **argv)
{
	osg::Geode *geode = new osg::Geode;
	geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(), 2)));

	osgFX::Outline *outline = new osgFX::Outline;
	outline->addChild(geode);
	outline->setColor(osg::Vec4(1.0, 1.0, 0.0, 1.0));
	outline->setWidth(5.0f);

	osgViewer::Viewer viewer;

	osg::Group *root = new osg::Group;
	root->addChild(outline);
	viewer.setUpViewInWindow(100, 100, 800, 600);
	viewer.setSceneData(root);
	//Outline类的使用需要先用0清空StencilBuffer
	unsigned int clearMask = viewer.getCamera()->getClearMask();
	viewer.getCamera()->setClearMask(clearMask | GL_STENCIL_BUFFER_BIT);
	viewer.getCamera()->setClearStencil(0);
	viewer.run();
}

编译运行:






QT+OSG/osgEarth编译之八十七:osgFX+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5核心库osgFX) 通过一套osgFX代码和框架,实现osgFX的跨平台编译。 在Qt环境下,集成osg工具库osgFX库的头文件、库文件,构建跨平台编译的pro文件。 通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台的编译实践。 在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。 采用的是osg-3.6.5版本的osgFX。 读者可参考博客中的集成原理和pro文件,构建不同版本的osgFX跨平台包。 阅读详情

相关推荐

OSG编程指南<一>:OpenSceneGraph 概述

OSG编程指南:OpenSceneGraph 概述及功能介绍

欧特GO 1916

OpenGL和OSG正背面剔除、深度缓冲区

当2个三维模型有2个面离得比较近的时候,在渲染的时候,在不同的视角下,会发现闪烁的现象,解决这个问题主要依靠opengl的polygonoffset的功能,osg有对应的类, osg::ref_ptrosg::PolygonOffset polyoffset = new osg::PolygonOffset; polyoffset->setFactor(m_factor); polyoffset->setUnits(m_units); node.getOrCreateStateSet()-&gt

whl0071的专栏 2756

Osg之特效OsgFXOutline

5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.下载,请杀毒! 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0.还不懂?优快云老板不让我上传联系方式。

osgFX扩展库-异性光照、贴图、卡通特效(1)

osgFX扩展库-异性光照、贴图、卡通特效代码示例 osgFX::AnisotropicLighting、osgFX::BumpMapping、osgFX::Cartoon

liangfei868的博客 1588

金融数据自动化:从同花顺API到Excel的智能转换之旅

本文详细介绍了如何利用同花顺API实现金融数据自动化处理,并将其智能转换为Excel格式的全流程。通过Python编程和Excel高级技巧,读者可以掌握从数据获取、清洗到输出的完整解决方案,大幅提升金融数据分析的效率和准确性。文章特别强调了同花顺API的使用技巧和Excel自动化输出的最佳实践。

sql99的博客 461

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

【OSG学习笔记】Day 61: 各向异性光照(Anisotropic Lighting)

本文介绍了基于OpenSceneGraph(OSG)的各向异性光照(Anisotropic Lighting)技术。与传统各向同性光照不同,各向异性光照能模拟金属拉丝、丝绸等材质的方向性高光效果。文章详细讲解了其核心原理,包括光照贴图与UV坐标的配合使用,以及osgFX::AnisotropicLighting特效节点的继承关系和关键功能。通过完整代码示例,展示了从模型加载、光源配置到特效应用的全过程,并重点解析了智能指针管理、光源参数设置等关键技术点。该技术可显著提升3D渲染质感,适用于需要模拟复杂表面材

u012739527的博客 410

树莓派与ROS2

树莓派与ROS2(Robot Operating System 2)的结合使用为机器人开发、自动化控制以及物联网项目提供了强大的平台。

weixin_47695827的博客 1754

【OSG学习笔记】Day 64: Scribe(刻线/轮廓高亮)

本文介绍了OSG中的osgFX::Scribe特效类,它能够实现模型轮廓高亮和线框刻线效果。文章详细解析了其继承关系、核心原理和类成员,展示了通过双通道渲染机制实现轮廓效果的技术。提供了完整的代码实现示例,包括模型加载、特效配置和场景渲染,并说明了在工业仿真、三维展示等场景中的应用。该特效无需编写着色器,兼容性好,是OSG中实现轮廓高亮的实用解决方案。

u012739527的博客 293

告别信号干扰!用Altium Designer 19搞定4层/6层PCB叠层设计的保姆级流程

本文详细介绍了如何使用Altium Designer 19进行4层/6层PCB叠层设计,解决信号干扰问题。通过实际案例和系统方法论,涵盖高速数字电路、混合信号系统等典型场景的设计优化,帮助硬件工程师和学生掌握电磁兼容(EMC)与信号完整性(SI)的核心技术。

weixin_27076351的博客 206

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3944

【OSG学习笔记】Day 65: SpecularHighlights(镜面高光)

本文介绍了OSG中的镜面高光特效osgFX::SpecularHighlights,它通过立方贴图和反射纹理技术实现片段级高光计算,相比传统顶点级高光更加稳定逼真。文章详细解析了该特效的原理、继承关系、核心API及使用方法,并提供了完整的可运行代码示例。关键点包括:1) 采用片段级计算避免高光变形闪烁;2) 继承自osgFX::Effect,具备场景图节点特性;3) 通过setSpecularColor、setSpecularExponent等API控制高光效果;4) 常见问题排查方法。该特效能显著提升3D

u012739527的博客 1317

一套C#接口通吃安川/发那科/库卡:工业机器人统一控制框架设计与产线踩坑实录

我们把机器人的通用能力抽象为接口,涵盖连接、运动、IO、寄存器、状态、报警六大类能力,所有品牌适配器都必须实现这个接口。/// 工业机器人统一控制接口// 基础连接// 运动控制// IO与寄存器// 状态与报警// 事件工业机器人统一控制框架的本质,不是把所有品牌的功能都做平,而是找到通用能力的最大公约数,通过分层抽象把品牌差异隔离在底层。上层业务只关注工艺和流程,不需要关心机器人是什么品牌、用什么SDK、通信协议是什么。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 402

osg解析系列-[osg::Camera以FBO的方式实现RTT]纹理烘焙

【代码】M23.12.W7.[osg::Camera以FBO的方式实现RTT]纹理烘焙。

qq_42531872的博客 845

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会)

在目标检测领域,CNN与Transformer的较量从未停歇。本文提出一种革命性的架构——,将状态空间模型(SSM)首次引入YOLO框架。实验表明,该模型在COCO数据集上达到54.3% mAP@0.5,推理速度达89 FPS(RTX 4090),相比原版YOLOv8提升12.7%精度与23%速度。本文将完整揭示其技术原理与工程实现,助您掌握这一前沿技术。

FJN110的博客 119

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1430

osg学习笔记(一)

场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率   场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以有零个(实际上是没有执行任何操作)或多个子成员。在场景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。   Osg程序使用组节点来组织和排列场

Commander 2302

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

osg的一些必须知道的知识

组件:一.Osg核心库:提供了基本的场景图形和渲染功能,以及3d图形程序所需的某些特定功能实现。包括:1.osg库:包含了用于创建场景图形的场景图形节点类,用作向量和矩阵运算的类,几何体类,以及用于描述和管理渲染状态的类,3d图形程序所需的典型功能类,例如命令行参数解析,动画路径管理,以及错误和警告信息类。2.osgUtil库:osg工具库包含的类和函数,可以用于场景图形及其内容的操作,场景图形数据

Binary 2367

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mauerwerk快速上手教程:3步搭建带弹簧动效的Masonry瀑布流网格(新手完整指南)

mauerwerk 是一个由 react-spring 驱动的 Masonry 瀑布流网格 React 库,核心功能是为网格单元格提供进入/退场过渡和共享元素放大过渡——也就是说,你的瀑布流卡片点击放大时,会以逼真的弹簧物理动画从原位置"飞"到最大化状态,而不是生硬地切换。本教程面向新手,带你用 3 步在 React 项目中跑起来 🚀 [![mauerwerk 瀑布流网格弹簧动效演示](htt

gitblog_00392的博客 413

OSG学习笔记(二)之OSG静态库的使用

OSG是以插件的方式管理,因此要使用

haoswich的专栏 4113

CMake 使用 FindOpenSceneGraph 模块集成 OpenSceneGraph:组件体系、查找机制与导入目标实战

OpenSceneGraph(OSG)是成熟的跨平台 3D 图形工具包,本文聚焦 CMake 提供的官方查找模块 `FindOpenSceneGraph`:它负责定位 OSG 核心库 `osg`、依赖库 `OpenThreads` 以及各类扩展库(NodeKit),并以 `find_package(OpenSceneGraph)` 的形式为项目提供一致的集成入口。读完本文,你将掌握该模块的组件语义

gitblog_00912的博客 162

OpenGL学习笔记(三):颜色与光照

作者:yurunsun@gmail.com 新浪微博@孙雨润 新浪博客 优快云博客 日期: 2013-6-13 <!-- body {font-size:14px; line-height:1.6; color:#333333; font:13px/1.4 Helvetica,arial,freesans,clean,sans-serif} body > *:

雨润的技术博客 3943

3dsvg导出系统深度解析:4K PNG截图、FFmpeg WASM视频转码与3D模型导出实现

3dsvg 是一个让 SVG 秒变交互式 React 3D 组件的开源项目,而真正让设计师"离不开"的,是它的导出系统:4K PNG 高清截图、浏览器内 FFmpeg WASM 视频转码(WebM → MP4),以及 GLB / STL / OBJ / PLY 四种 3D 模型导出。这篇文章带你完整拆解 3dsvg 的三大导出实现,看懂一个"纯前端"的 SVG 转 3D 工具是如何搞定高清截图、6

gitblog_00275的博客 152

OSG架构初识

本文参考<<osg最长一帧>>, <<OpenSceneGraph三维渲染引擎编程指南>>, <<OpenSceneGraph三维渲染引擎设计与实践>> 整理而来, 感谢大牛们的精彩著作. 相比Ogre来说, Ogre代码很规范, 只是入门资料较少,如果能在学习之前能总体上对架构有个印象就好了, 免得盲人摸象啊, 不过,还好有OSG. 场景相关: Node, Geode, Group, Transform, LOD,...

Kata的博客 3166
上一篇: OpenGL模板缓冲区---StencilBuffer
下一篇: 用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十课
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值