Rendering pipeline Ogre3D
vertex data, instance data RESOURCES PIPELINE STAGES RENDER STATES Vertex buffer Input Assembler I. input streaming Input layout Instance buffer vertex data, instance data Shader program Constant buffers and textures Vertex Shader Uniform parameters processed vertex data Input Assembler II. primitive setup Index buffer Primitive type primitive data Constant buffers and textures Shader program Geometry Shader Uniform parameters Output buffer primitive strip data Cull mode Rasterizer face culling depth bias adjustment clipping homogenous division viewport transformation output filtering Depth bias Viewport Fill mode Filtering fragments with interpolated data Constant buffers and textures Fragment Shader Shader program Uniform parameters fragment color and depth Render target textures Render target textures Render target textures Output merger stencil test depth test blending Depth-stencil state Blending state Depth-stencil texture
Lépések I. vertexek összeállítása Vertex Shader model trafó árnyalás view és proj trafó primitívek összeállítása Geometry Shader [csak DX10] extra geometria előállítása
Lépések II. raszterizálás Pixel shader z-teszt blending hátsólap-eldobás vágás homogén osztás viewport trafó Pixel shader pixel szín meghatározása z-teszt blending
Vertexek összeállítása Vertex buffer rekordok tömbje pos normal tex pos normal tex pos normal tex vertex
Vertex shader bejövő adat kimenő adat uniform: model, view, proj mátrixok, fények, ... minden vertexre más: [pozíció, normál, szín, texcoord] kimenő adat pozíció homogén normalizált képernyő koordinátákban árnyalás eredménye [szín] bármi más [normál, texcoord]
Primitívek összeállítása non-indexed vertex bufferben egymás után következők triangle list triangle strip 1 2 3 4 5 6 1 2 3 4 5 2 5 2 4 1 3 4 6 1 5 3 2 triangle fan 1 3 1 2 3 4 5 5 4
Lapeldobás körüljárási irány (képernyőn) alapján eldobhatunk lapokat ha a modellünkben (index bufferben) konzisztens a háromszögek körüljárási iránya, ezzel eldobhatjuk a test hátsó lapjait a belsejét úgysem látjuk, ha poliéder
Vágás ami kilógna a képernyőről, vágjuk le normalizált képernyőkoordinátákban [-1, -1, 0] [1, 1, 1] téglatestre vágunk [Descartes] Átfordulási probléma a homogén osztás előtt kell vágni
Raszterizáció homogén osztás viewport trafó: pixel koordináták lineáris interpoláció vertex output adatok (kivéve pozíció) interpolálása minden kitöltendő pixelhez pixel shader indítása minden pixelszín meghatározásához
Pixel shader bejövő adat kimenő adat vertex shader kimenő adatai lineárisan interpolálva pixel koordináták kimenő adat pixel szín [RGBA] mélység, ha felül akarjuk írni a háromszög csúcsainak z-jéből interpolált eredetit ha nem, akkor a z-teszt előrehozható a pixel shader elé
Kimeneti műveletek bufferek műveletek célterület: frame buffer vagy textúra mélység-stencil buffer műveletek mélység teszt stencil teszt keverés [alfa blending]
Z-teszt a 3D takarási probléma megoldására 2. 1. 3. 1325 628 628 3325
Stencil teszt a stencil buffer a z-buffer pár használatlan bitje beállítódik valamire, ha a pixelbe rajzoltunk valamit később feltételként szabhatjuk a pixel felülírására a stencil buffer értéket pl. kirajzoljuk a tükör téglalapját, utána a tökörben látható objektumokat csak a tükör pixeleire rajzoljuk
Keverés A célterületen már meglevő érték [dest] és az újonnan számított szín [src] kombinálása mindkettőhöz megadható egy súly (0, 1, srcalpha, dstalpha, 1-alpha ...) megadható a függvény (add, subtract, min, max ...) átlátszóság: hátulról előre rajzolás + blending src * srcalpha + dst * (1- srcalpha)
Grafikus kártyák Interfész Transzformáció+ Vertex Illumináció Shader Fragment Transzformáció+ Illumináció Geometry Shader Vágás + Nézeti transzf + Raszterizáció + interpoláció Textúrázás Textúra memória Kompozitálás (Z-buffer, átlátszóság) Buffers: szín, z, stencil, …
Vertex shader és környezete glBegin(GL_TRIANGLES) glVertex glNormal glColor glTextCoord glEnd( ) POSITION, NORMAL, COLOR0, TEXTCOORD0,… Állapot Transzformációk Fényforrások Anyagok *MV *MVIT Vertex shader *MVP Illumináció POSITION, COLOR0, TEXTCOORD0,… háromszögre Geometry shader Vágás: -w<X<w, -w<Y<w, -w<Z<w, 0<color<1 Homogén osztás: X=X/w, Y=Y/w, Z=Z/w + nézet transzformáció
“Standard” vertex shader (Cg) void main( in float4 position : POSITION, in float3 normal : NORMAL, in float4 color : COLOR0, in float2 texcoord : TEXCOORD0, uniform float4x4 modelviewproj: state.matrix.mvp, out float4 hposition : POSITION, out float4 ocolor : COLOR0, out float2 otexcoord : TEXCOORD0 ) { hposition = mul(modelviewproj, position); otexcoord = texcoord; ocolor = color; } glDisable(GL_LIGHTING );
Lineáris interpoláció X I(X,Y) Lineáris interpoláció X számláló I regiszter CLK S a (X2,Y2,I2) I I(X,Y) = aX + bY + c (X1,Y1,I1) Y (X3,Y3,I3) I(X,Y) X I(X+1,Y) = I(X,Y) + a
“Standard” pixel shader float4 main( in float4 color : COLOR0) : COLOR { return color; } in float2 texcoord : TEXCOORD0, in float3 color : COLOR0, uniform sampler2D texture_map ) : COLOR float4 pcolor = text2D(texture_map, texcoord); return pcolor; glDisable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
Gouraud árnyalás Illumination CPU program Pixel shader Vertex shader Rasterization Interpolation Position Normal Transformations Materials Lights Interpolated color Transf.position Color
Phong árnyalás Illumination CPU program Pixel shader Vertex shader Rasterization Interpolation Position Normal Transformations Light position Transf.position Transf.normal View Light Interpolated Normal View Light Materials Light intensity
Ogre3D
Object-Oriented Graphics Rendering Engine www.ogre3d.org Manual API reference SDK Demos Tools (exporter) Wiki Forum
Objektum orientált Fő külső interface-ek függetlenek: 3D API színtér típus Platform Könnyű bővíthetőség plugin Tervezési minták tudatos használata
Szolgáltatások Multi platform Különböző színtér gráf kezelők Erőforrás kezelő Saját objektum formátum Level of detail Skinning Morphing Material script rendszer (XML) Render state Textúrák (2D,3D,CUBE,animált) Shaderek Részecskerendszerek (script) Alapvető árnyékszámítási algoritmusok Render to texture Post processing keretrendszer Overlay keretrendszer
Vázlat OgreRoot root = new Root(…); root.loadPlugin("RenderSystem_Direct3D9"); RenderSystemList list = root.getAvailableRenderers(); root.setRenderSystem(list.at(0)); root.initialise(…); RenderWindow renderWindow = root.createRenderWindow(…); SceneManager sceneManager = root.createSceneManager(…); ResourceGroupManager.getSingleton().addResourceLocation(…); ResourceGroupManager.getSingleton().initialiseAllResourceGroups(); setupScene(); setupListeners(); root.startRendering(); //main loop ( root.renderOneFrame(); )
setupScene SceneNode rootSceneNode = sceneManager.getRootSceneNode(); camera = sceneManager.createCamera("Main Camera"); camera.setPosition(0, 10, 20); Viewport viewport = renderWindow.addViewport(camera,…); renderWindow.setActive(true); Entity entity = sceneManager.createEntity("cake", "zuh.mesh"); SceneNode cakeNode = rootSceneNode.createChildSceneNode(); cakeNode.attachObject(entity); cakeNode.setPosition(-3.5f, 0, 0);
setupListeners class MyFrameListener : public FrameListener { bool frameStarted(const FrameEvent& evt) … } }; setupListeners() MyFrameListener* mFrameListener= new MyFrameListener(); OgreRoot::getSingleton().addFrameListener(mFrameListener);
Material script (.material) material PacmanFace { receive_shadows off technique main pass main lighting on ambient 1 0.9 0.8 1 diffuse 1 1 1 1 specular 1 1 1 25.6 emissive 0 0 0 texture_unit color texture PMFaceBase.jpg tex_coord_set 0 colour_op modulate scale 1 1 scroll 0 0 rotate 0 }
Öröklődés material PacmanFaceHappy : PacmanFace { technique main pass main texture_unit color texture PMFaceHappy.jpg }
Shader program definíciók (.program) vertex_program ToonVS hlsl { source ToonShader.hlsl entry_point vs target vs_2_0 } fragment_program ToonPS hlsl entry_point ps target ps_2_0
material Toon { receive_shadows off technique main pass earlyZ colour_write off lighting off vertex_program_ref ToonVSEx param_named_auto ModelViewProj worldviewproj_matrix param_named_auto ModelView worldview_matrix param_named_auto Model world_matrix param_named_auto ModelViewIT inverse_transpose_worldview_matrix } pass main scene_blend alpha_blend vertex_program_ref ToonVS fragment_program_ref ToonPS param_named alpha float 1 texture_unit color_ramp tex_address_mode clamp
Vége