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

Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Embed Size (px)

Citation preview

Page 1: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Ogre3DOgre3DAlapokAlapok

Model betöltésModel betöltés

AnyagjellemzőkAnyagjellemzők

FényforrásokFényforrások

ShaderekShaderek

Page 2: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Új C++ projectÚj C++ project

Win32 Console Application

Page 3: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

Page 4: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

…/OgreSDK/include/OGRE…/OgreSDK/boost_1_44

Page 5: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

…/OgreSDK/include/$(ConfigurationName)…/OgreSDK/boost_1_44/lib

Page 6: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

copy ”$(TargetPath)” ”$(SolutionDir)\bin”

$(SolutionDir)\bin

Page 7: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Debug és Release Debug és Release konfigurációkkonfigurációk

OgreMain_d.lib(Debug konfigurációnál)

OgreMain.lib(Release konfigurációnál)

Page 8: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

$(ProjectName)_d.lib

Page 9: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Szükséges dll-ekSzükséges dll-ek(_d végű dll-ek a debug könyvtárból, a többi a release-ből)(_d végű dll-ek a debug könyvtárból, a többi a release-ből)

másolás

bin és media könyvtárak létrehozása

Egy fordítást most már meg is próbálhatunk…

Page 10: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

OgreLab1.cppOgreLab1.cpp#include "stdafx.h"#include "stdafx.h"

#include "Ogre.h"#include "Ogre.h"

using namespace Ogre;using namespace Ogre;

Root* ogreRoot;Root* ogreRoot;SceneManager* sceneManager;SceneManager* sceneManager;Camera* camera;Camera* camera;RenderWindow* renderWindow;RenderWindow* renderWindow;Light* light;Light* light;

void setupScene()void setupScene(){{}}

void setupListeners()void setupListeners(){{}}

int _tmain(int argc, _TCHAR* argv[])int _tmain(int argc, _TCHAR* argv[]){{

ogreRoot = new Root("","");ogreRoot = new Root("","");#ifdef _DEBUG#ifdef _DEBUG

ogreRoot->loadPlugin("RenderSystem_Direct3D9_d");ogreRoot->loadPlugin("RenderSystem_Direct3D9_d");#else#else

ogreRoot->loadPlugin("RenderSystem_Direct3D9");ogreRoot->loadPlugin("RenderSystem_Direct3D9");#endif#endif

return 0;return 0;}}

Page 11: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

Page 12: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Log fileLog fileogreRoot = new Root("", "", "Ogre.log");

Page 13: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

int _tmain(int argc, _TCHAR* argv[]){

ogreRoot = new Root("","");ogreRoot->loadPlugin("RenderSystem_Direct3D9_d");

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

Page 14: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

}

Camera / viewportCamera / viewport

Page 15: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 16: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Exportálás utánExportálás után

másolás

Új file-ok

A szükséges fájlok megtalálhatók a labor honlapján:Kiindulási alap (ogrebasicsbase.zip),exportedmesh.zip

Page 17: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

}

Page 18: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 19: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

}}

Sok boltív!Sok boltív!

Page 20: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 21: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

}

Fényforrás!Fényforrás!

material Archway{ receive_shadows on technique { pass { ambient 0.5 0.5 0.5 1 diffuse 0.64 0.64 0.64 1 specular 0.5 0.5 0.500000 1 12.5 emissive 0 0 0 1 texture_unit { texture archwayColorFinal.bmp tex_address_mode wrap filtering trilinear colour_op modulate } } }}

Scene.material

Page 22: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 23: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Animált fényforrásAnimá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());}

Page 24: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

http://cg.iit.bme.hu/portal/oktatott-targyak/jatekfejlesztes/ogre3d-alapok: 1. fázis (GameDevLab1_phase1.zip)

Page 25: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

TalajTalajvoid 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-size500,// y-size

1, // x-segments1, // y-segmentstrue,1,10, // u-tile10, // v-tileVector3::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…

Page 26: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

material Archway{

receive_shadows off…

}

material Ground{

receive_shadows ontechnique{

pass{

ambient 0.5 0.5 0.5 1diffuse 1 1 1 1specular 1 1 1 1emissive 0 0 0 1texture_unit{

texture ground.jpg}

}}

}

Másolás a media könyvtárba

Scene.material

Page 27: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 28: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

TalajTalajvoid 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-size500,// y-size

100, // x-segments100, // y-segmentstrue,1,10, // u-tile10, // v-tileVector3::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…

Page 29: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

Page 30: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Árnyékok / égboltÁrnyékok / égboltvoid setupScene(){…

sceneManager->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE);sceneManager->setShadowColour(ColourValue(0.5,0.5,0.5));

sceneManager->setSkyBox(true, "Sky", 10, true);}

material Sky{

technique{

pass{

lighting offdepth_write off

cull_hardware none depth_check off

texture_unit{

cubic_texture stormy.jpg separateUVtex_address_mode clamp

}}

}}

Scene.material

Másolás a media könyvtárba(6 db kép)

Page 31: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 32: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Shaderek / Phong shadingShaderek / Phong shading

vertex_program PhongShadingVS hlsl{ source Phong.hlsl entry_point vs target vs_2_0}

fragment_program PhongShadingPS hlsl{ source Phong.hlsl entry_point ps target ps_2_0}

Scene.program

Page 33: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

Shaderek / Phong shadingShaderek / Phong shadingstruct 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

Page 34: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

material Phong{

technique main{

pass main{

vertex_program_ref PhongShadingVS { }

fragment_program_ref PhongShadingPS { }

}}

}

material Archway : Phong{

technique main{

pass main{

…}material Ground : Phong{

technique main{

pass main{

…}

Page 35: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 36: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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 {

param_named_auto worldViewProj worldviewproj_matrixparam_named_auto worldView worldview_matrixparam_named_auto worldViewIT inverse_transpose_worldview_matrixparam_named_auto lightPos light_position_view_space 0

}

Page 37: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 38: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

}

Page 39: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 40: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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;

float ambient = amientLightColor * ambientColor;float diffuse = max(0,dot(N,L)) * diffuseColor * diffuseLightColor;float3 H = normalize(L + V);float specular = pow(max(0, dot(N,H)), specularColor.w)

* float4(specularColor.xyz, 1) * specularLightColor;

return texColor * (ambient + diffuse) + specular + emissiveColor;}

Page 41: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

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

Page 42: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

PróbaPróba

Page 43: Ogre3D Alapok Model betöltés AnyagjellemzőkFényforrásokShaderek

VégeVége