Nebula3绘制基本图元

看了好久好逮能让N3画出东西来了, 感觉它的架构就是专门为DX而设计的^_^. 虽说也能编写GL的中间层(因为N3的API是处于继承树的中间, 而不是最底下), 但是很多习惯一看就是DX嘛. 可能用惯API的会比较好上手点.

命令行程序都是从ConsoleApplication派生, 那么图形程序就是从RenderApplication派生了^_^.

先看看RenderApplication都有哪些成员:

Ptr<Core::CoreServer> coreServer;

前面的命令行程序已经用过了, 最基本的核心服务

Ptr<IO::IoServer> ioServer;

输入/输出服务, 别忘了把程序所需的资源(如shader)拷贝到正确的目录, 默认是exe文件所在的目录

Ptr<Interface::IOInterface> ioInterface;

进行资源异步(多线程)加载的接口(N3 NB就NB在多线程上)

Ptr<CoreGraphics::RenderDevice> renderDevice;

核心的图形系统, 可以看做是IDirect3DDevice9的封装^_^, 函数差不多

Ptr<CoreGraphics::DisplayDevice> displayDevice;

显示设备, 就是在哪画. 封装了窗口的创建和消息处理, 还有显示适配器等

Ptr<CoreGraphics::TransformDevice> transformDevice;

管理全局的矩阵变换与它们的组合

Ptr<CoreGraphics::ShaderServer> shaderServer;

Shader的管理器. N3用的是DX的Effect框架, 常用的shader都已经包含在资源文件里了

Ptr<CoreGraphics::ShapeRenderer> shapeRenderer;

几何图形的渲染器, 一般用于调试模式的辅助绘制, 如画个包围盒啥的

Ptr<CoreGraphics::VertexLayoutServer> vertexLayoutServer;

可以看成是IDirect3DVertexDeclaration9的一个管理器, 用于顶点格式的创建

Ptr<Resources::SharedResourceServer> sharedResourceServer;

共享资源的管理器

Ptr<Resources::ResourceManager> resourceManager;

相当于客户端与资源之间的一个中间层, 主要的功能是在占用最少内存的情况下为渲染提供资源. 如果资源没有加载完的话, 提供一个资源占位符. 具体的资源管理策略封装在ResourceMapper中, 如加载优先级和LOD等

Ptr<Models::ModelServer> modelServer;

用于加载和创建共享的模型对象

Ptr<Graphics::GraphicsServer> graphicsServer;

管理一个抽象的图形世界. 一个世界含有一个或多个"舞台(Stage)"和连接到舞台的一个或多个的"视野(View)". (xoyojank: 是不是场景的管理?)

Ptr<Lighting::LightServer> lightServer;

管理场景光源和实时的光照处理(SM3.0的, 还好新装了台98000GT的机子@_@)

Ptr<Lighting::ShadowServer> shadowServer;

阴影处理, 对于局部光源使用简单的Shadow Mapping, 全局光则使用PSSM.(又是SM3.0的)

Ptr<Input::InputServer> inputServer;

输入设备. 好像鼠标用的DirectInput, 而键盘直接用的Windows消息处理

Ptr<Frame::FrameServer> frameServer;

基于图像空间的处理, 多用于PostEffect.

Ptr<Scripting::ScriptServer> scriptServer;

脚本系统

Ptr<Http::HttpServer> httpServer;

N3的HTTP调试信息(这个也很NB, 不过实用吗?)

Ptr<Anim::AnimationServer> animationServer;

骨骼动画系统, SVN上最新的代码冒似重写了, 抛弃N2的那套封装

我只是派生一下画了条线而已........

  1. // TestWindow.cpp : Defines the entry point for the console application. 
  2. // 
  3. #include "stdneb.h" 
  4. #include "apprender/viewerapplication.h" 
  5. #include "coregraphics/memoryvertexbufferloader.h" 
  6. #include "resources/resourceloader.h" 
  7. #include "timing/time.h" 
  8. using namespace App;  
  9. using namespace Util;  
  10. using namespace Math;  
  11. using namespace CoreGraphics;  
  12. using namespace Resources;  
  13. ImplementNebulaApplication()  
  14. class LineRenderApp : public RenderApplication  
  15. {  
  16.     Ptr<VertexBuffer> vertexBuffer;  
  17.     Ptr<ShaderInstance> shaderInstance;  
  18. public:  
  19. bool Open()  
  20.     {  
  21. if (RenderApplication::Open())  
  22.         {  
  23. // vertex 
  24.             Array<VertexComponent> vertexComponents;  
  25.             vertexComponents.Append(VertexComponent(VertexComponent::Position, 0, VertexComponent::Float3));  
  26. float vertex[2][3] = { {-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f} };  
  27.             vertexBuffer = VertexBuffer::Create();  
  28.             Ptr<MemoryVertexBufferLoader> vbLoader = MemoryVertexBufferLoader::Create();  
  29.             vbLoader->Setup(vertexComponents, 2, vertex, 2 * 3 * sizeof(float));  
  30.             vertexBuffer->SetLoader(vbLoader.upcast<ResourceLoader>());  
  31.             vertexBuffer->SetAsyncEnabled(false);  
  32.             vertexBuffer->Load();  
  33.             vertexBuffer->SetLoader(NULL);  
  34. // shader 
  35. this->shaderInstance = this->shaderServer->CreateShaderInstance(ResourceId("shd:shape"));  
  36.             Ptr<ShaderVariable> color = this->shaderInstance->GetVariableBySemantic(ShaderVariable::Semantic("MatDiffuse"));  
  37.             color->SetVector(float4(1.0f, 1.0f, 1.0f, 1.0f));  
  38.             Ptr<ShaderVariable> mvp = this->shaderInstance->GetVariableBySemantic(ShaderVariable::Semantic("ModelViewProjection"));  
  39.             mvp->SetMatrix(matrix44::identity());  
  40.         }  
  41. return true;  
  42.     }  
  43. void OnRenderFrame()  
  44.     {  
  45. this->displayDevice->ProcessWindowMessages();  
  46. this->renderDevice->BeginFrame();  
  47. this->renderDevice->BeginPass(this->renderDevice->GetDefaultRenderTarget(), this->shaderInstance);  
  48.         PrimitiveGroup primGroup;  
  49.         primGroup.SetBaseVertex(0);  
  50.         primGroup.SetNumVertices(2);  
  51.         primGroup.SetPrimitiveTopology(PrimitiveTopology::LineList);  
  52. this->renderDevice->SetVertexBuffer(this->vertexBuffer);  
  53. this->renderDevice->SetPrimitiveGroup(primGroup);  
  54. this->renderDevice->Draw();  
  55. this->renderDevice->EndPass();  
  56. this->renderDevice->EndFrame();  
  57. this->renderDevice->Present();  
  58.     }  
  59. };  
  60. void
  61. NebulaMain(const CmdLineArgs& args)  
  62. {  
  63.     LineRenderApp app;  
  64.     app.SetAppName("Test Renderer");  
  65.     app.SetCmdLineArgs(args);  
  66. if (app.Open())  
  67.     {  
  68.         app.Run();  
  69.         app.Close();  
  70.     }  
  71.     app.Exit();  
  72. }  

当然, 画别的图元只要把PrimitiveTopology改改就好了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏aCloudDeveloper

Mobility Model and Routing Model about the ONE

ONE主要的功能是节点的移动,节点间的相遇情况,路由情况以及消息的处理机制。下面简要介绍下目前ONE自带的六种移动模型和六种路由模型。 Mobility Mod...

1929
来自专栏云计算教程系列

如何在Ubuntu 14.04第2部分上查询Prometheus

Prometheus是一个开源监控系统和时间序列数据库。在如何在Ubuntu 14.04第1部分中查询Prometheus,我们设置了三个演示服务实例,向Pro...

1110
来自专栏数据派THU

独家 | 手把手教数据可视化工具Tableau

前言 数据的世界正在发生急剧变化,任何人都应该访问自己需要的数据,并具备获取任何数据的洞察力,而tableau正是帮我们洞察数据的好帮手。 Tableau作为B...

6667
来自专栏AI2ML人工智能to机器学习

TF Boy 之初筵 - 分布十三式

我们在 " 机器学习平台的优化器 (平台篇、优化篇)" 里面提到TensorFlow (TF) 速度的成为深度学习的武林第一大帮。 博士好友清华,在这方面也颇有...

782
来自专栏用户2442861的专栏

Caffe中LMDB的使用

http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/

2971
来自专栏和蔼的张星的图像处理专栏

总结?

其实算不得总结,lintcode这个在专题不会再更新了,准备秋招的时候大概看过一遍这个,有些还是很有用的,然后剑指offer差不多刷了一遍,过些天闲了我把剑指o...

1074
来自专栏marsggbo

Udacity并行计算课程笔记-The GPU Programming Model

一、传统的提高计算速度的方法 faster clocks (设置更快的时钟) more work over per clock cycle(每个时钟周期做更多的...

2667
来自专栏专知

Tensorflow Eager Execution入门指南

本文介绍了最新版的Tensorflow 1.7的功能及其使用方法,重点介绍其中最有趣的功能之一eager_execution,它许用户在不创建静态图的情况下运行...

55813
来自专栏人工智能LeadAI

逻辑回归 | TensorFlow深度学习笔记

课程目标:学习简单的数据展示,训练一个Logistics Classifier,熟悉以后要使用的数据 Install Ipython NoteBook 可以参考...

3217
来自专栏新智元

TensorFlow正式发布1.5.0,支持CUDA 9和cuDNN 7,双倍提速

来源:Github 编译:费欣欣 【新智元导读】TensorFlow今天正式发布了1.5.0版本,支持CUDA 9和cuDNN 7,进一步提速。并且,从1.6版...

3206

扫码关注云+社区

领取腾讯云代金券