RAMSES Documentation  27.0.130
Information for RAMSES users and developers
ramses-example-renderonce/src/main.cpp

Render Once Example

// -------------------------------------------------------------------------
// Copyright (C) 2015 BMW Car IT GmbH
// -------------------------------------------------------------------------
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
// -------------------------------------------------------------------------
#include "ramses-client.h"
#include <thread>
static const unsigned RTSize = 512u;
int main(int argc, char* argv[])
{
// register at RAMSES daemon
ramses::RamsesFramework framework(argc, argv);
ramses::RamsesClient& ramses(*framework.createClient("ramses-example-renderonce"));
framework.connect();
ramses::Scene* scene = ramses.createScene(ramses::sceneId_t(123u), ramses::SceneConfig(), "basic rendertarget scene");
// prepare triangle geometry: vertex position array and index array
const float vertexPositionsQuadArray[] = { -1.5f, -0.75f, -1.f, 1.5f, -0.75f, -1.f, -1.5f, 0.75f, -1.f, 1.5f, 0.75f, -1.f };
ramses::ArrayResource* vertexPositionsQuad = scene->createArrayResource(ramses::EDataType::Vector3F, 4, vertexPositionsQuadArray);
const float vertexPositionsTriangleArray[] = { -0.5f, -0.5f, -1.f, 0.5f, -0.5f, -1.f, -0.5f, 0.5f, -1.f };
ramses::ArrayResource* vertexPositionsTriangle = scene->createArrayResource(ramses::EDataType::Vector3F, 3, vertexPositionsTriangleArray);
const float textureCoordsArray[] = { -1.f, 0.f, 1.0f, 0.f, -1.f, 1.f, 1.0f, 1.f};
ramses::ArrayResource* textureCoords = scene->createArrayResource(ramses::EDataType::Vector2F, 4, textureCoordsArray);
uint16_t indicesArray[] = { 0, 1, 2, 2, 1, 3 };
ramses::ArrayResource* indicesQuad = scene->createArrayResource(ramses::EDataType::UInt16, 6, indicesArray);
ramses::ArrayResource* indicesTriangle = scene->createArrayResource(ramses::EDataType::UInt16, 3, indicesArray);
ramses::EffectDescription triangleEffectDesc;
triangleEffectDesc.setVertexShaderFromFile("res/ramses-example-renderonce-simple-color.vert");
triangleEffectDesc.setFragmentShaderFromFile("res/ramses-example-renderonce-simple-color.frag");
const ramses::Effect* triangleEffect = scene->createEffect(triangleEffectDesc, ramses::ResourceCacheFlag_DoNotCache, "glsl shader");
ramses::EffectDescription quadEffectDesc;
quadEffectDesc.setVertexShaderFromFile("res/ramses-example-renderonce-texturing.vert");
quadEffectDesc.setFragmentShaderFromFile("res/ramses-example-renderonce-texturing.frag");
const ramses::Effect* quadEffect = scene->createEffect(quadEffectDesc, ramses::ResourceCacheFlag_DoNotCache, "glsl shader");
// every render pass needs a camera to define rendering parameters
ramses::Node* cameraTranslate = scene->createNode();
cameraTranslate->setTranslation(0.0f, 0.0f, 5.0f);
ramses::PerspectiveCamera* cameraA = scene->createPerspectiveCamera("camera of renderpass A");
cameraA->setParent(*cameraTranslate);
cameraA->setFrustum(-0.1f, 0.1f, -0.1f, 0.1f, 1.f, 10.f);
// we want to render to the full extent of render target which has the resolution 64x64 (created later)
cameraA->setViewport(0u, 0u, RTSize, RTSize);
// use another camera for the resolving render pass
auto* cameraB = scene->createPerspectiveCamera("camera of renderpass B");
cameraB->setViewport(0, 0, 1280u, 480u);
cameraB->setFrustum(19.f, 1280.f / 480.f, 0.1f, 1500.f);
cameraB->setParent(*cameraTranslate);
// IMPORTANT NOTE: For simplicity and readability the example code does not check return values from API calls.
// This should not be the case for real applications.
// create the render once renderpass
ramses::RenderPass* renderPassRT = scene->createRenderPass("renderpass to render target");
renderPassRT->setClearColor(1.f, 1.f, 1.f, 1.f);
renderPassRT->setCamera(*cameraA);
renderPassRT->setRenderOnce(true);
// create a render target and assign it to renderpass A
rtDesc.addRenderBuffer(*renderBuffer);
ramses::RenderTarget* renderTarget = scene->createRenderTarget(rtDesc);
renderPassRT->setRenderTarget(renderTarget);
// create final render pass
ramses::RenderPass* renderPassFinal = scene->createRenderPass("renderpass to screen");
renderPassFinal->setCamera(*cameraB);
// create render group for each renderpass
ramses::RenderGroup* renderGroupA = scene->createRenderGroup("rendergroup A");
ramses::RenderGroup* renderGroupB = scene->createRenderGroup("rendergroup B");
renderPassRT->addRenderGroup(*renderGroupA);
renderPassFinal->addRenderGroup(*renderGroupB);
// create triangle appearance, get input data and bind required data
ramses::Appearance* appearanceA = scene->createAppearance(*triangleEffect, "triangle appearance");
{
triangleEffect->findUniformInput("color", color);
appearanceA->setInputValueVector4f(color, 1.0f, 0.0f, 0.0f, 1.0f);
}
ramses::GeometryBinding* geometryA = scene->createGeometryBinding(*triangleEffect, "triangle geometry");
{
geometryA->setIndices(*indicesTriangle);
ramses::AttributeInput positionsInput;
triangleEffect->findAttributeInput("a_position", positionsInput);
geometryA->setInputBuffer(positionsInput, *vertexPositionsTriangle);
}
// create quad appearance, get input data and bind required data
ramses::Appearance* appearanceB = scene->createAppearance(*quadEffect, "quad appearance");
{
// create texture sampler with render target
*renderBuffer);
// set render target sampler as input
ramses::UniformInput textureInput;
quadEffect->findUniformInput("textureSampler", textureInput);
appearanceB->setInputTexture(textureInput, *sampler);
}
ramses::GeometryBinding* geometryB = scene->createGeometryBinding(*quadEffect, "quad geometry");
{
geometryB->setIndices(*indicesQuad);
ramses::AttributeInput positionsInput;
ramses::AttributeInput texcoordsInput;
quadEffect->findAttributeInput("a_position", positionsInput);
quadEffect->findAttributeInput("a_texcoord", texcoordsInput);
geometryB->setInputBuffer(positionsInput, *vertexPositionsQuad);
geometryB->setInputBuffer(texcoordsInput, *textureCoords);
}
// create meshes
ramses::MeshNode* meshNodeA = scene->createMeshNode("red triangle mesh node");
meshNodeA->setAppearance(*appearanceA);
meshNodeA->setGeometryBinding(*geometryA);
ramses::MeshNode* meshNodeB = scene->createMeshNode("texture quad mesh node");
meshNodeB->setAppearance(*appearanceB);
meshNodeB->setGeometryBinding(*geometryB);
// add triangle mesh to first pass and quad to second one
renderGroupA->addMeshNode(*meshNodeA);
renderGroupB->addMeshNode(*meshNodeB);
// signal the scene it is in a state that can be rendered
scene->flush();
scene->publish();
// application logic
uint32_t loops = 10000;
while (--loops)
{
// change color once per second
// this will re-render the mesh to the render target only once per color change
std::this_thread::sleep_for(std::chrono::seconds(1));
appearanceA->setInputValueVector4f(color, (loops % 2 ? 1.0f : 0.0f), 0.0f, (loops % 2 ? 0.0f : 1.0f), 1.0f);
renderPassRT->retriggerRenderOnce();
scene->flush();
}
// shutdown: stop distribution, free resources, unregister
scene->unpublish();
scene->destroy(*vertexPositionsTriangle);
scene->destroy(*vertexPositionsQuad);
scene->destroy(*textureCoords);
scene->destroy(*indicesQuad);
scene->destroy(*indicesTriangle);
ramses.destroy(*scene);
framework.disconnect();
return 0;
}
The Appearance describes how an object should look like. This includes GLSL uniform values,...
Definition: Appearance.h:34
status_t setInputValueVector4f(const UniformInput &input, float x, float y, float z, float w)
Sets value of the input.
status_t setInputTexture(const UniformInput &input, const TextureSampler &textureSampler)
Sets texture sampler to the input.
The ArrayResource stores a data array of a given type. The data is immutable. The resource can be use...
Definition: ArrayResource.h:26
The AttributeInput is a description of an attribute effect input.
Definition: AttributeInput.h:22
status_t setViewport(int32_t x, int32_t y, uint32_t width, uint32_t height)
Sets the viewport to be used when rendering with this camera.
An effect description holds all necessary information for an effect to be created.
Definition: EffectDescription.h:21
status_t setVertexShaderFromFile(const char *shaderSourceFileName)
Reads and sets vertex shader source from file.
status_t setUniformSemantic(const char *inputName, EEffectUniformSemantic semanticType)
Sets an uniform semantic. Used for uniforms which are not locally available on the client,...
status_t setFragmentShaderFromFile(const char *shaderSourceFileName)
Reads and sets fragment shader source from file.
An effect describes how an object will be rendered to the screen.
Definition: Effect.h:26
status_t findUniformInput(const char *inputName, UniformInput &uniformInput) const
Finds uniform input by input name.
status_t findAttributeInput(const char *inputName, AttributeInput &attributeInput) const
Finds attribute input by input name.
A geometry binding together with an appearance describe how an object will be rendered to the screen.
Definition: GeometryBinding.h:25
status_t setIndices(const ArrayResource &indicesResource)
Assign a data array with data type UInt16 or UInt32 to be used when accessing vertex data.
status_t setInputBuffer(const AttributeInput &attributeInput, const ArrayResource &arrayResource, uint32_t instancingDivisor=0)
Assign a data array resource to a given effect attribute input.
The MeshNode holds all information which is needed to render an object to the screen.
Definition: MeshNode.h:25
status_t setAppearance(Appearance &appearance)
Sets the Appearance of the MeshNode.
status_t setGeometryBinding(GeometryBinding &geometry)
Sets the GeometryBinding of the MeshNode.
The Node is the base class of all nodes and provides scene graph functionality which propagates to it...
Definition: Node.h:23
status_t setParent(Node &node)
Sets parent Node for this node.
status_t setTranslation(float x, float y, float z)
Sets the absolute translation the absolute values.
The PerspectiveCamera is a local camera which defines a perspective view into the scene.
Definition: PerspectiveCamera.h:23
status_t setFrustum(float fov, float aspectRatio, float nearPlane, float farPlane)
An alternative method (see ramses::Camera::setFrustum) to set the perspective view frustum of the cam...
Entry point of RAMSES client API.
Definition: RamsesClient.h:34
Class representing ramses framework components that are needed to initialize an instance of ramses cl...
Definition: RamsesFramework.h:35
status_t connect()
Tries to establish a connection to the RAMSES system.
RamsesClient * createClient(const char *applicationName)
Create a new RamsesClient linked to this framework. Creation of multiple clients is supported....
status_t disconnect()
Disconnects the RamsesClient from the system.
RenderBuffer can be used with RenderTarget as buffer for writing or with TextureSampler as buffer for...
Definition: RenderBuffer.h:25
The RenderGroup is a container used to collect renderables which are supposed to be rendered together...
Definition: RenderGroup.h:31
status_t addMeshNode(const MeshNode &mesh, int32_t orderWithinGroup=0)
Add a mesh to this RenderGroup. If a mesh is already contained in this RenderGroup only its render or...
The RenderPass is a container used to collect meshes which are supposed to be rendered together.
Definition: RenderPass.h:31
status_t setCamera(const Camera &camera)
Set the camera to use for rendering the objects of this renderpass.
status_t setClearFlags(uint32_t clearFlags)
Set the clear flags which enable/disable the clearing of the render target assigned to this RenderPas...
status_t retriggerRenderOnce()
Will re-render a render once pass.
status_t setRenderTarget(RenderTarget *renderTarget)
Set the render target for the render pass to render into.
status_t addRenderGroup(const RenderGroup &renderGroup, int32_t orderWithinPass=0)
Add a RenderGroup to this RenderPass for rendering.
status_t setRenderOnce(bool enable)
Set/unset render once flag - rendering of the render pass only once.
status_t setClearColor(float r, float g, float b, float a)
Set the clear color for the RenderPass (default: [0,0,0,0])
RenderTargetDescription holds all necessary information for a RenderTarget to be created.
Definition: RenderTargetDescription.h:22
status_t addRenderBuffer(const RenderBuffer &renderBuffer)
Adds a RenderBuffer to the RenderTargetDescription.
The RenderTarget can be used as an output for a RenderPass.
Definition: RenderTarget.h:20
The SceneConfig holds a set of parameters to be used when creating a scene.
Definition: SceneConfig.h:22
The Scene holds a scene graph. It is the essential class for distributing content to the ramses syste...
Definition: Scene.h:83
MeshNode * createMeshNode(const char *name=nullptr)
Creates a scene graph MeshNode. MeshNode is a Node with additional properties and bindings that repre...
Effect * createEffect(const EffectDescription &effectDesc, resourceCacheFlag_t cacheFlag=ResourceCacheFlag_DoNotCache, const char *name=nullptr)
Create a new Effect by parsing a GLSL shader described by an EffectDescription instance....
Node * createNode(const char *name=nullptr)
Creates a scene graph node. The basic purpose of Node is to define topology in scene graph by links t...
status_t unpublish()
Unpublish the scene from the ramses system.
RenderBuffer * createRenderBuffer(uint32_t width, uint32_t height, ERenderBufferType bufferType, ERenderBufferFormat bufferFormat, ERenderBufferAccessMode accessMode, uint32_t sampleCount=0u, const char *name=nullptr)
Create a RenderBuffer to be used with RenderTarget for rendering into and TextureSampler for sampling...
GeometryBinding * createGeometryBinding(const Effect &effect, const char *name=nullptr)
Creates a new GeometryBinding.
ArrayResource * createArrayResource(EDataType type, uint32_t numElements, const void *arrayData, resourceCacheFlag_t cacheFlag=ResourceCacheFlag_DoNotCache, const char *name=nullptr)
Create a new ArrayResource. It makes a copy of the given data of a certain type as a resource,...
status_t publish(EScenePublicationMode publicationMode=EScenePublicationMode_LocalAndRemote)
Publishes the scene to the ramses system.
RenderPass * createRenderPass(const char *name=nullptr)
Create a render pass in the scene.
Appearance * createAppearance(const Effect &effect, const char *name=nullptr)
Creates a new Appearance.
RenderTarget * createRenderTarget(const RenderTargetDescription &rtDesc, const char *name=nullptr)
Create a render target providing a set of RenderBuffers.
status_t destroy(SceneObject &object)
Destroys a previously created object using this scene The object must be owned by this scene in order...
RenderGroup * createRenderGroup(const char *name=nullptr)
Create a RenderGroup instance in the scene.
PerspectiveCamera * createPerspectiveCamera(const char *name=nullptr)
Creates a Perspective Camera in this Scene.
status_t flush(sceneVersionTag_t sceneVersionTag=InvalidSceneVersionTag)
Commits all changes done to the scene since the last flush or since scene creation....
TextureSampler * createTextureSampler(ETextureAddressMode wrapUMode, ETextureAddressMode wrapVMode, ETextureSamplingMethod minSamplingMethod, ETextureSamplingMethod magSamplingMethod, const Texture2D &texture, uint32_t anisotropyLevel=1, const char *name=nullptr)
Creates a texture sampler object.
Helper class to create strongly typed values out of various types.
Definition: StronglyTypedValue.h:23
The TextureSampler holds a texture and its sampling parameters.
Definition: TextureSampler.h:29
The UniformInput is a description of an uniform effect input.
Definition: UniformInput.h:22
The RAMSES namespace contains all client side objects and functions used to implement RAMSES applicat...
Definition: AnimatedProperty.h:15
@ ERenderBufferFormat_RGBA8
Definition: TextureEnums.h:141
@ ETextureSamplingMethod_Linear
Definition: TextureEnums.h:21
@ ETextureAddressMode_Repeat
Definition: TextureEnums.h:33
@ EClearFlags_All
Definition: RamsesFrameworkTypes.h:263
@ EClearFlags_None
Definition: RamsesFrameworkTypes.h:257
@ ModelViewProjectionMatrix
Model-view-projection matrix 4x4.
@ Vector2F
two components of type float per data element
@ UInt16
one component of type uint16_t per data element
@ Vector3F
three components of type float per data element
constexpr const resourceCacheFlag_t ResourceCacheFlag_DoNotCache
Requests the render to not cache a resource. This is the default value.
Definition: RamsesFrameworkTypes.h:212
@ ERenderBufferType_Color
Definition: TextureEnums.h:129
@ ERenderBufferAccessMode_ReadWrite
RenderBuffer with this access can be used both in RenderTarget and TextureSampler.
Definition: TextureEnums.h:171
int main(int argc, char *argv[])
Definition: main.cpp:21