Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaBertalan Jónás Megváltozta több, mint 6 éve
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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.