Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

Grafikus tervezőrendszerek programozása 10. előadás.
 Árnyalási egyenlet  Saját emisszió  Adott irányú visszaverődés.
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
GPGPU labor I. OpenGL, Cg.
GPGPU labor V. GPU ray tracing. Kezdeti teendők Tantárgy honlapja, GPU ray tracing A labor kiindulási alapjának letöltése (lab5_base.zip), kitömörítés.
Hibakezelés és Tesztelés a Visual Studio.NET-ben
Hadoop Gyakorlat 1 Korszerű adatbázisok Parancsok Listázás – hadoop fs –ls Kiírja egy fájl tartalmát – hadoop fs –cat Betöltés – hadoop fs –put.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
10. előadás (2004. április 20.) A C előfordító (folytatás) Néhány hasznos compiler opció Egy tanulságos könyvtári függvény Változó hosszúságú argumentum.
Mikrovezérlők alkalmazástechnikája laboratóriumi gyakorlat Kovács Tamás & Mingesz Róbert 3. óra február 20., 23.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Követelmények Bevezetés a Javába Első java program írása Dokumentációk
Tömbök ismétlés Osztályok Java-ban Garbage collection
A CLIPS keretrendszer CLIPS "C" Language Integration Production System.
C# tagfüggvények.
C# tagfüggvények.
Entity framework Krizsán Zoltán
C++ alapok, harmadik óra
Mikrovezérlők, perifériák laboratóriumi gyakorlat 3. óra szeptember 18. Mingesz Róbert v
Fejlett grafikai algoritmusok Megvilágítási modellek
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Térfogatvizualizáció
Motor I. Scene graph XML Rendering Szécsi László.
Environment mapping Szécsi László. Új osztály: Lab3EnvMap copy&paste: Lab2Trafo.h -> Lab3EnvMap.h copy&paste: Lab2Trafo.cpp -> Lab3EnvMap.cpp copy&paste:
Térfogatvizualizáció
Rendering pipeline Ogre3D
Effect framework, HLSL shader László Szécsi. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását – pass: egy ilyen.
GPGPU labor III. Iteratív algoritmusok. Kezdeti teendők Tantárgy honlapja, Iteratív algoritmusok A labor kiindulási alapjának letöltése (lab3base.zip),
OpenGL 4 shaderek, GLSL Valasek Gábor
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
Egyenesvonalú (lineáris) adatszerkezetek
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
Brightr Megvilágítás modellezése. Csapattagok  Illés László  Palatinus Endre  Provits Milán  Török Péter.
Fejlett grafikai algoritmusok Megvilágítás SZTE, 2010.
A Visual Basic nyelvi elemei
DLL használata és készítése Feladat
Számítógépes Grafika OpenGL 4 shaderek, GLSL. OpenGL 4 A következő programozható fázisok vannak a 4.x-es OpenGL-ben: Vertex shader Tesselation control.
Képek, képfeldolgozás Szirmay-Kalos László.
Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Karakter Animáció és Kontroller Unity. Kezdeti lépések Alap projekt letöltése Egy statikus geometriát láthatunk Meg vannak a fizikai befoglalók is.
Global Illumination.
Lighting III.
Script nyelvek előadás
A grafikus hardware programozása
OpenGL 2. gyakorlat Valasek Gábor
Unity, Anyagok, megvilágítás
Vizualizáció és képszintézis
Vizualizáció és képszintézis
OpenGL IV.
A CLIPS keretrendszer
Vizualizáció és képszintézis
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
gg004-Mesh project copy-paste-rename gg002-App folder
Kamera, 3D, transzformációk Szécsi László
OpenGL II.
Sw2 PhysX.
OpenGL V.
Environment mapping Szécsi László
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Függvénysablonok használata
Előadás másolata:

Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek Ogre3D Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek

Új C++ project Win32 Console Application

Minden konfigurációra érvényes beállítások

…/OgreSDK/include/OGRE …/BoostSDK

…/OgreSDK/lib/$(ConfigurationName) …/BoostSDK/lib

$(SolutionDir)\bin

Debug és Release konfigurációk OgreMain_d.lib (Debug konfigurációnál) OgreMain.lib (Release konfigurációnál)

Debug konfigurációban opcionális (én szoktam….) $(ProjectName)_d

Szükséges dll-ek az OGRESDK-ból (_d végű dll-ek a debug könyvtárból, a többi a release-ből) bin és media könyvtárak létrehozása Megjegyzés: ezekbe a könyvtárakban több plugin dll is van, itt csak azokat másoljuk amire ténylegesen szükségünk van. A többit mellékelni felesleges…. A bin könyvtárat és a media könyvtárat mi hozzuk létre!!!! másolás Egy fordítást most már meg is próbálhatunk…

OgreLab1.cpp #include "stdafx.h" #include "Ogre.h" using namespace Ogre; Root* ogreRoot; SceneManager* sceneManager; Camera* camera; RenderWindow* renderWindow; Light* light; void setupScene() { } void setupListeners() int _tmain(int argc, _TCHAR* argv[]) ogreRoot = new Root("",""); #ifdef _DEBUG ogreRoot->loadPlugin("RenderSystem_GL_d"); #else ogreRoot->loadPlugin("RenderSystem_GL"); #endif return 0;

Próba: fordítás, futtatás

Log file ogreRoot = new Root("", "", "Ogre.log");

int _tmain(int argc, _TCHAR* argv[]) { ogreRoot = new Root("",""); ogreRoot->loadPlugin("RenderSystem_GL_d"); const RenderSystemList& list = ogreRoot->getAvailableRenderers(); ogreRoot->setRenderSystem(list.at(0)); ogreRoot->initialise(false); renderWindow = ogreRoot->createRenderWindow("GameDev Lab First Ogre3D Application", 800, 600, false); sceneManager = ogreRoot->createSceneManager(0, "Default"); ResourceGroupManager::getSingleton().addResourceLocation("media", "FileSystem", "General", false); ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); setupScene(); setupListeners(); ogreRoot->startRendering(); return 0; }

Camera / viewport void setupScene() { camera = sceneManager->createCamera("Main Camera"); camera->setPosition(0, 20, 100); camera->lookAt(0, 20, 0); camera->setFarClipDistance(1000); camera->setNearClipDistance(0.1); Viewport* viewport = renderWindow->addViewport(camera); renderWindow->setActive(true); }

Próba

Ogre model fájl A népszerű 3D modellező szoftverekből exportálhatunk Ogre mesh xml formátumban A szükséges fájlok megtalálhatók a labor honlapján: Kiindulási alap (ogrebasicsbase.zip), exportedmesh.zip

void setupScene() { camera = sceneManager->createCamera("Main Camera"); camera->setPosition(0, 20, 100); camera->lookAt(0, 20, 0); camera->setFarClipDistance(1000); camera->setNearClipDistance(0.1); Viewport* viewport = renderWindow->addViewport(camera); renderWindow->setActive(true); SceneNode* rootNode = sceneManager->getRootSceneNode(); SceneNode* archwayNode = rootNode->createChildSceneNode(); Entity* archway = sceneManager->createEntity("archway", "Archway.mesh"); archwayNode->attachObject(archway); }

Próba

Sok boltív! void setupScene() { camera = sceneManager->createCamera("Main Camera"); camera->setPosition(0, 20, 100); camera->lookAt(0,20,0); camera->setFarClipDistance(1000); camera->setNearClipDistance(0.1); Viewport* viewport = renderWindow->addViewport(camera); renderWindow->setActive(true); for(int i = 0; i < 5; i++) SceneNode* rootNode = sceneManager->getRootSceneNode(); SceneNode* archwayNode = rootNode->createChildSceneNode(); Entity* archway = sceneManager->createEntity("archway_" + StringConverter::toString(i), "Archway.mesh"); archway->setCastShadows(true); archwayNode->setPosition(0,0,-100 + i * 30); archwayNode->attachObject(archway); } Figyeljünk arra, hogy minden entitásnak egyedi neve kell hogy legyen!!! (createEntity első paramétere) Az Ogre-hoz van egy StringConverter és egy StringUtil osztály hasznos statikus függvényekkel a sztring műveletekhez.

Próba

Fényforrás! Scene.material material Archway { receive_shadows on technique pass ambient 1 1 1 1 diffuse 1 1 1 1 specular 1 1 1 1 12.5 emissive 0 0 0 1 texture_unit texture archwayColorFinal.bmp tex_address_mode wrap filtering trilinear colour_op modulate } void setupScene() { … light = sceneManager->createLight("pointlight1"); light->setType(Light::LT_POINT); light->setAttenuation(1000,1,0,0); light->setPowerScale(1000); light->setCastShadows(true); light->setPosition(0, 20, -50); sceneManager->setAmbientLight( ColourValue(0.1f,0.1f,0.1f,1.0f)); }

Próba

Animált fényforrás class animationFrameListener : public FrameListener { private: float timeSinceStart; public: animationFrameListener(){timeSinceStart = 0;} bool frameStarted(const FrameEvent& evt) timeSinceStart += evt.timeSinceLastFrame; float a = Math::Sin(timeSinceStart) * 0.5f + 0.5; light->setPosition(0, 20, -100.0f + 120.0f * a); return true; } }; void setupListeners() ogreRoot->addFrameListener(new animationFrameListener());

Próba

Talaj void createGround() { MovablePlane* plane = new MovablePlane("GroundPlane"); plane->d = 0; plane->normal = Vector3::UNIT_Y; MeshManager::getSingleton().createPlane( "GroundPlane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, *plane, 500,// x-size 500,// y-size 1, // x-segments 1, // y-segments true, 1, 10, // u-tile 10, // v-tile Vector3::UNIT_Z); Entity* planeEnt = sceneManager->createEntity( "GroundPlane", "GroundPlane" ); planeEnt->setMaterialName("Ground"); planeEnt->setCastShadows(false); sceneManager->getRootSceneNode()->createChildSceneNode()->attachObject(planeEnt); } void setupScene() … renderWindow->setActive(true); createGround(); for(int i = 0; i < 5; i++) //boltívek létrehozása

Másolás a media könyvtárba Scene.material material Archway { receive_shadows off … } material Ground receive_shadows on technique pass ambient 0.5 0.5 0.5 1 diffuse 1 1 1 1 specular 1 1 1 1 emissive 0 0 0 1 texture_unit texture ground.jpg Másolás a media könyvtárba

Próba

Talaj void createGround() { MovablePlane* plane = new MovablePlane("GroundPlane"); plane->d = 0; plane->normal = Vector3::UNIT_Y; MeshManager::getSingleton().createPlane( "GroundPlane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, *plane, 500,// x-size 500,// y-size 100, // x-segments 100, // y-segments true, 1, 10, // u-tile 10, // v-tile Vector3::UNIT_Z); Entity* planeEnt = sceneManager->createEntity( "GroundPlane", "GroundPlane" ); planeEnt->setMaterialName("Ground"); planeEnt- >setCastShadows(false); sceneManager->getRootSceneNode()->createChildSceneNode()->attachObject(planeEnt); } void setupScene() … renderWindow->setActive(true); createGround(); for(int i = 0; i < 5; i++) //boltívek létrehozása

Próba Állítsuk majd vissza segment értékeket 1-re!!

Másolás a media könyvtárba Árnyékok / égbolt void setupScene() { … sceneManager->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE); sceneManager->setShadowColour(ColourValue(0.5,0.5,0.5)); sceneManager->setSkyBox(true, "Sky", 10, true); } Scene.material material Sky { technique pass lighting off depth_write off cull_hardware none depth_check off texture_unit cubic_texture stormy.jpg separateUV tex_address_mode clamp } Másolás a media könyvtárba (6 db kép)

Próba Ha furcsa negatív árnyékjelenséget tapasztalunk, a fényforrást magasabbra kell emelnünk… ez a stencil shadow technika hibája….. A labor további részében a pixelenkénti árnyalás megvalósítása a cél, ennek előnyét viszont akkor látjuk jól, ha a fényforrás közel van a talajhoz, ezért az árnyék technika kipróbálásához emeljük magasra a fényforrást (kb 100 egységnyire), majd helyezzük vissza, és akár ki is kapcsolhatjuk az árnyékolást, ha zavaró.

HLSL shader Váltsunk át Direct3D11 renderelőre (megjelelő plugin dll-t kell betölteni a program indításakor) Kapcsoljuk ki az égboltot (illetve ne kapcsoljuk be) Kapcsoljuk ki az árnyékokat (illetve ne kapcsoljuk be)

Shaderek / Phong shading Scene.program vertex_program PhongShadingVS_HLSL hlsl { source Phong.hlsl entry_point vs target vs_2_0 } fragment_program PhongShadingPS_HLSL hlsl entry_point ps target ps_2_0

Shaderek / Phong shading struct VERTEX_IN { float4 position : POSITION; float4 normal : NORMAL; float2 texCoord : TEXCOORD0; }; struct VERTEX_OUT float4 hPos : POSITION; float3 N : TEXCOORD0; float3 L : TEXCOORD1; float3 V : TEXCOORD2; float2 texCoord : TEXCOORD3; VERTEX_OUT vs(VERTEX_IN In) VERTEX_OUT Out = (VERTEX_OUT) 0; return Out; } float4 ps(VERTEX_OUT In):COLOR0 return 1; Phong.hlsl

material Phong { technique main pass main vertex_program_ref PhongShadingVS_HLSL } fragment_program_ref PhongShadingPS_HLSL material Archway : Phong … material Ground : Phong

Próba

vertex_program_ref PhongShadingVS_HLSL { VERTEX_OUT vs(VERTEX_IN In, uniform float4x4 worldViewProj, uniform float4x4 worldView, uniform float4x4 worldViewIT, uniform float4 lightPos) { VERTEX_OUT Out = (VERTEX_OUT) 0; Out.hPos = mul(worldViewProj, In.position); Out.texCoord = In.texCoord; return Out; } float4 ps(VERTEX_OUT In, uniform sampler2D colorTex : register(s0)):COLOR0 return tex2D(colorTex, In.texCoord); vertex_program_ref PhongShadingVS_HLSL { param_named_auto worldViewProj worldviewproj_matrix param_named_auto worldView worldview_matrix param_named_auto worldViewIT inverse_transpose_worldview_matrix param_named_auto lightPos light_position_view_space 0 }

Próba A log-ban keletkező 00:16:55: Compiler error: invalid parameters in Scene.material(12): setting of constant failed 00:16:55: OGRE EXCEPTION(2:InvalidParametersException): Parameter called worldView does not exist. in GpuProgramParameters::_findNamedConstantDefinition at ..\..\..\..\OgreMain\src\OgreGpuProgramParams.cpp (line 1435) Jellegű hibától nem kell megijedni. Azért van, mert ezeket a változókat egyenlőre nem használjuk a shader programon belül, így azok el is lesznek dobva a shader fordító optimalizálója által. Ezért nem tudja őket az Ogre felkutatni nekünk, de ezen a hibán túllendül…..

GLSL shaderek Váltsunk át OpenGL renderelőre Egészítsük ki a Scene.program-ot: vertex_program PhongShadingVS_GLSL glsl { source PhongVS.glsl } fragment_program PhongShadingPS_GLSL glsl source PhongPS.glsl

PhongVS.glsl Vertex shader in paraméterek Vertex shader #version 120 attribute vec4 vertex; attribute vec4 normal; attribute vec2 uv0; varying vec3 Normal; varying vec3 LightDir; varying vec3 ViewDir; varying vec2 texCoord; uniform mat4 worldViewProj; uniform mat4 worldView; uniform mat4 worldViewIT; uniform vec4 lightPos; void main() { gl_Position = worldViewProj*vertex; texCoord = uv0; ViewDir = -(worldView * vertex).xyz; LightDir = lightPos.xyz + lightPos.w * ViewDir; Normal = (worldViewIT * normal).xyz; } Vertex shader in paraméterek Vertex shader out paraméterek Ha így nevezzük el őket, az Ogre tudja milyen csúcspont- attribútumokat kell ide bekötni.

PhongPS.glsl #version 120 varying vec3 Normal; varying vec3 LightDir; varying vec3 ViewDir; varying vec2 texCoord; uniform sampler2D colorTex; void main() { gl_FragColor = texture2D(colorTex, texCoord); }

Unified shaderek Különböző platformok árnyalóit fogja össze, az aktuális platformnak megfelelőt választja ki vertex_program PhongShadingVS unified { delegate PhongShadingVS_GLSL delegate PhongShadingVS_HLSL } fragment_program PhongShadingPS unified delegate PhongShadingPS_GLSL delegate PhongShadingPS_HLSL

Váltsunk vissza GL renderelőre! Próba! material Phong { technique pass vertex_program_ref PhongShadingVS … } fragment_program_ref PhongShadingPS Váltsunk vissza GL renderelőre! Próba!

Önálló feladat Készítsük el a Sky anyagjellemző GLSL és HLSL shader programjait is Készítsük el a unified shader programot Bővítsük ki a Sky material-t, hogy használja ezeket a programokat Kapcsoljuk vissza az égboltot Próbáljuk ki! Váltsunk vissza Direct3D motorra!

Árnyalás VERTEX_OUT vs(VERTEX_IN In, uniform float4x4 worldViewProj, uniform float4x4 worldViewIT, uniform float4 lightPos) { VERTEX_OUT Out = (VERTEX_OUT) 0; Out.hPos = mul(worldViewProj, In.position); Out.texCoord = In.texCoord; Out.V = -mul(worldView, In.position).xyz; Out.L = lightPos.xyz + lightPos.w * Out.V; Out.N = mul(worldViewIT, In.normal).xyz; return Out; } float4 ps(VERTEX_OUT In, uniform sampler2D colorTex : register(s0)):COLOR0 float3 N = normalize(In.N); float3 L = normalize(In.L); float3 V = normalize(In.V); return max(0,dot(N,L)); return tex2D(colorTex, In.texCoord);

Próba

float4 ps(VERTEX_OUT In, uniform sampler2D colorTex : register(s0), uniform float4 amientLightColor, uniform float4 diffuseLightColor, uniform float4 specularLightColor, uniform float4 lightAttenuation, uniform float4 ambientColor, uniform float4 diffuseColor, uniform float4 specularColor, uniform float4 emissiveColor):COLOR0 { float3 N = normalize(In.N); float d = length(In.L); float3 L = In.L / d; float3 V = normalize(In.V); float4 texColor = tex2D(colorTex, In.texCoord); float attenuation = 1.0 / (lightAttenuation.y + lightAttenuation.z * d + lightAttenuation.w * d * d); diffuseLightColor *= attenuation; specularLightColor *= attenuation; float4 ambient = amientLightColor * ambientColor; float4 diffuse = max(0,dot(N,L)) * diffuseColor * diffuseLightColor; float3 H = normalize(L + V); float4 specular = pow(max(0, dot(N,H)), specularColor.w) * float4(specularColor.xyz, 1) * specularLightColor; return texColor * (ambient + diffuse) + specular + emissiveColor; }

light->setAttenuation(1000,0,0,1); material Phong { technique pass vertex_program_ref PhongShadingVS param_named_auto worldViewProj worldviewproj_matrix param_named_auto worldView worldview_matrix param_named_auto worldViewIT inverse_transpose_worldview_matrix param_named_auto lightPos light_position_view_space 0 } fragment_program_ref PhongShadingPS param_named_auto amientLightColor ambient_light_colour param_named_auto diffuseLightColor light_diffuse_colour_power_scaled 0 param_named_auto specularLightColor light_specular_colour_power_scaled 0 param_named_auto lightAttenuation light_attenuation 0 param_named_auto ambientColor surface_ambient_colour param_named_auto diffuseColor surface_diffuse_colour param_named_auto specularColor surface_specular_colour param_named_auto emissiveColor surface_emissive_colour light->setAttenuation(1000,0,0,1);

Próba

Önálló feladat Egészítsük ki a GLSL árnyalókat is! Próbáljuk ki!

Vége