Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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

Hasonló előadás


Az előadások a következő témára: "Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek"— Előadás másolata:

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

2 Új C++ project Win32 Console Application

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

4 …/OgreSDK/include/OGRE
…/BoostSDK

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

6 $(SolutionDir)\bin

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

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

9 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…

10 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;

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

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

13 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; }

14 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); }

15 Próba

16 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

17 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); }

18 Próba

19 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, 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.

20 Próba

21 Fényforrás! Scene.material material Archway { receive_shadows on
technique pass ambient diffuse specular emissive 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)); }

22 Próba

23 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, f f * a); return true; } }; void setupListeners() ogreRoot->addFrameListener(new animationFrameListener());

24 Próba

25 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

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

27 Próba

28 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

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

30 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)

31 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ó.

32 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)

33 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

34 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

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

36 Próba

37 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 }

38 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…..

39 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

40 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.

41 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); }

42 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

43 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!

44 Ö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!

45 Á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);

46 Próba

47 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; }

48 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);

49 Próba

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

51 Vége


Letölteni ppt "Alapok Model betöltés Anyagjellemzők Fényforrások Shaderek"

Hasonló előadás


Google Hirdetések