ogre3d alapok model betöltés anyagjellemzőkfényforrásokshaderek
Post on 01-Apr-2015
222 Views
Preview:
TRANSCRIPT
Ogre3DOgre3DAlapokAlapok
Model betöltésModel betöltés
AnyagjellemzőkAnyagjellemzők
FényforrásokFényforrások
ShaderekShaderek
Új C++ projectÚj C++ project
Win32 Console Application
Minden konfigurációra érvényes Minden konfigurációra érvényes beállításokbeállítások
…/OgreSDK/include/OGRE…/OgreSDK/boost_1_44
…/OgreSDK/include/$(ConfigurationName)…/OgreSDK/boost_1_44/lib
copy ”$(TargetPath)” ”$(SolutionDir)\bin”
$(SolutionDir)\bin
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)
Debug konfigurációban Debug konfigurációban opcionális opcionális (én szoktam….)(én szoktam….)
$(ProjectName)_d.lib
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…
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;}}
Próba: fordítás, futtatásPróba: fordítás, futtatás
Log fileLog fileogreRoot = new Root("", "", "Ogre.log");
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;}
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
PróbaPróba
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
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óbaPróba
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!
PróbaPróba
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
PróbaPróba
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());}
PróbaPróba
http://cg.iit.bme.hu/portal/oktatott-targyak/jatekfejlesztes/ogre3d-alapok: 1. fázis (GameDevLab1_phase1.zip)
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…
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
PróbaPróba
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…
PróbaPróbaÁllítsuk majd vissza segment értékeket 1-re!!
Á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)
PróbaPróba
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
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
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{
…}
PróbaPróba
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
}
PróbaPróba
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);
}
PróbaPró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;
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;}
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óbaPróba
VégeVége
top related