Nebula3繪製基本圖元

來源:互聯網
上載者:User

看了好久好逮能讓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的那套封裝

 

我只是派生一下畫了條線而已........

// TestWindow.cpp : Defines the entry point for the console application.<br />// </p><p>#include "stdneb.h"<br />#include "apprender/viewerapplication.h"<br />#include "coregraphics/memoryvertexbufferloader.h"<br />#include "resources/resourceloader.h"<br />#include "timing/time.h" </p><p>using namespace App;<br />using namespace Util;<br />using namespace Math;<br />using namespace CoreGraphics;<br />using namespace Resources;</p><p>ImplementNebulaApplication()</p><p>class LineRenderApp : public RenderApplication<br />{<br /> Ptr<VertexBuffer> vertexBuffer;<br /> Ptr<ShaderInstance> shaderInstance;</p><p>public:<br /> bool Open()<br /> {<br /> if (RenderApplication::Open())<br /> {<br /> // vertex<br /> Array<VertexComponent> vertexComponents;<br /> vertexComponents.Append(VertexComponent(VertexComponent::Position, 0, VertexComponent::Float3));<br /> float vertex[2][3] = { {-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f} };<br /> vertexBuffer = VertexBuffer::Create();<br /> Ptr<MemoryVertexBufferLoader> vbLoader = MemoryVertexBufferLoader::Create();<br /> vbLoader->Setup(vertexComponents, 2, vertex, 2 * 3 * sizeof(float));<br /> vertexBuffer->SetLoader(vbLoader.upcast<ResourceLoader>());<br /> vertexBuffer->SetAsyncEnabled(false);<br /> vertexBuffer->Load();<br /> vertexBuffer->SetLoader(NULL);<br /> // shader<br /> this->shaderInstance = this->shaderServer->CreateShaderInstance(ResourceId("shd:shape"));<br /> Ptr<ShaderVariable> color = this->shaderInstance->GetVariableBySemantic(ShaderVariable::Semantic("MatDiffuse"));<br /> color->SetVector(float4(1.0f, 1.0f, 1.0f, 1.0f));<br /> Ptr<ShaderVariable> mvp = this->shaderInstance->GetVariableBySemantic(ShaderVariable::Semantic("ModelViewProjection"));<br /> mvp->SetMatrix(matrix44::identity());<br /> }<br /> return true;<br /> }</p><p> void OnRenderFrame()<br /> {<br /> this->displayDevice->ProcessWindowMessages();<br /> this->renderDevice->BeginFrame();<br /> this->renderDevice->BeginPass(this->renderDevice->GetDefaultRenderTarget(), this->shaderInstance);<br /> PrimitiveGroup primGroup;<br /> primGroup.SetBaseVertex(0);<br /> primGroup.SetNumVertices(2);<br /> primGroup.SetPrimitiveTopology(PrimitiveTopology::LineList);</p><p> this->renderDevice->SetVertexBuffer(this->vertexBuffer);<br /> this->renderDevice->SetPrimitiveGroup(primGroup);<br /> this->renderDevice->Draw();<br /> this->renderDevice->EndPass();<br /> this->renderDevice->EndFrame();<br /> this->renderDevice->Present();<br /> }<br />};</p><p>void<br />NebulaMain(const CmdLineArgs& args)<br />{<br /> LineRenderApp app;<br /> app.SetAppName("Test Renderer");<br /> app.SetCmdLineArgs(args);<br /> if (app.Open())<br /> {<br /> app.Run();<br /> app.Close();<br /> }<br /> app.Exit();<br />}<br />

 

當然, 畫別的圖元只要把PrimitiveTopology改改就好了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.