Hi cryengeneers! I need render to texture, for feature in game - preview window on panel bar for characters (Icon with animated head)
Is there someone know how to achive this on c++ with newest cryengine 5.5 ?
Re: Render to texture
#2Render to texture is not in the engine, this question has been raised many times in the community. The technology is probably not the most complicated, it is present by default in any other engine. But Crytek does not react at all. There is an opinion that maybe the game Hunt: Showdown uses Render to texture, usually the technologies that Crytek use in their games migrate to the national engine, but all this is in fantasy 

Re: Render to texture
#3thanks for reply noise
so pity
crytech plz add this most wanted feature to yours engine
so pity
crytech plz add this most wanted feature to yours engine
Re: Render to texture
#4This is amazing! I do not know Render to texture or some interpretation of this technology. But I just want to see similar technologies in the engine out of the box. What are some basic technologies that can expand gameplay
Re: Render to texture
#5Render to Texture in Lumberyard https://docs.aws.amazon.com/en_us/lumbe ... xture.html Now this technology is exactly in any engine, well, except for Cryengine naturally
Re: Render to texture
#7the my code use CryEngine V,custom version 5.5.2
Code: Select all
#include "StdAfx.h"
#include "Player.h"
#include <CryRenderer/IRenderAuxGeom.h>
void CPlayerComponent::Initialize()
{
m_timer = gEnv->pSystem->GetITimer();
// Create the camera component, will automatically update the viewport every frame
m_pCameraComponent = m_pEntity->GetOrCreateComponent<Cry::DefaultComponents::CCameraComponent>();
// Get the input component, wraps access to action mapping so we can easily get callbacks when inputs are triggered
m_pInputComponent = m_pEntity->GetOrCreateComponent<Cry::DefaultComponents::CInputComponent>();
m_pCameraManager = gEnv->pSystem->GetIPluginManager()->QueryPlugin<IPlugin_CryDefaultEntities>()->GetICameraManager();
// Register an action, and the callback that will be sent when it's triggered
m_pInputComponent->RegisterAction("player", "moveleft", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveLeft, activationMode); });
// Bind the 'A' key the "moveleft" action
m_pInputComponent->BindAction("player", "moveleft", eAID_KeyboardMouse, EKeyId::eKI_A);
m_pInputComponent->RegisterAction("player", "moveright", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveRight, activationMode); });
m_pInputComponent->BindAction("player", "moveright", eAID_KeyboardMouse, EKeyId::eKI_D);
m_pInputComponent->RegisterAction("player", "moveforward", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveForward, activationMode); });
m_pInputComponent->BindAction("player", "moveforward", eAID_KeyboardMouse, EKeyId::eKI_W);
m_pInputComponent->RegisterAction("player", "moveback", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveBack, activationMode); });
m_pInputComponent->BindAction("player", "moveback", eAID_KeyboardMouse, EKeyId::eKI_S);
m_pInputComponent->RegisterAction("player", "mouse_rotateyaw", [this](int activationMode, float value) { m_mouseDeltaRotation.x -= value; });
m_pInputComponent->BindAction("player", "mouse_rotateyaw", eAID_KeyboardMouse, EKeyId::eKI_MouseX);
m_pInputComponent->RegisterAction("player", "mouse_rotatepitch", [this](int activationMode, float value) { m_mouseDeltaRotation.y -= value; });
m_pInputComponent->BindAction("player", "mouse_rotatepitch", eAID_KeyboardMouse, EKeyId::eKI_MouseY);
m_pInputComponent->RegisterAction("player", "switchCamera", [this](int activationMode, float value) { switchView(); });
m_pInputComponent->BindAction("player", "switchCamera", eAID_KeyboardMouse, EKeyId::eKI_P);
Revive();
}
uint64 CPlayerComponent::GetEventMask() const
{
return ENTITY_EVENT_BIT(ENTITY_EVENT_START_GAME) | ENTITY_EVENT_BIT(ENTITY_EVENT_UPDATE)| ENTITY_EVENT_BIT(ENTITY_EVENT_START_LEVEL);
}
void CPlayerComponent::ProcessEvent(const SEntityEvent& event)
{
switch (event.event)
{
case ENTITY_EVENT_START_LEVEL:
{
IEntity * entity1 = gEnv->pEntitySystem->FindEntityByName("Camera-2");
IEntityClass * camera_class = entity1->GetClass();
Cry::DefaultComponents::CCameraComponent * camera = entity1->GetComponent<Cry::DefaultComponents::CCameraComponent>();
if (camera) {
//Quat rotate = entity1->GetWorldRotation();
camera1 = &camera->GetCamera();
camera1->SetMatrix(entity1->GetWorldTM());
//camera1->SetPosition(entity1->GetPos());
//Vec3 dir = camera1->CreateViewdir(Ang3(rotate.GetFwdX(),rotate.GetFwdY(), rotate.GetFwdZ()));
}
originCamera = gEnv->pSystem->GetViewCamera();
/*
IEntity * entity2 = gEnv->pEntitySystem->FindEntityByName("Camera-2");
if (entity2) {
camera2 = entity2->GetComponent<Cry::DefaultComponents::CCameraComponent>();
camera1 = &camera2->GetCamera();
}*/
}
break;
case ENTITY_EVENT_START_GAME:
{
// Revive the entity when gameplay starts
Revive();
}
break;
case ENTITY_EVENT_UPDATE:
{
SEntityUpdateContext* pCtx = (SEntityUpdateContext*)event.nParam[0];
const float moveSpeed = 20.5f;
Vec3 velocity = ZERO;
// Check input to calculate local space velocity
if (m_inputFlags & (TInputFlags)EInputFlag::MoveLeft)
{
velocity.x -= moveSpeed * pCtx->fFrameTime;
}
if (m_inputFlags & (TInputFlags)EInputFlag::MoveRight)
{
velocity.x += moveSpeed * pCtx->fFrameTime;
}
if (m_inputFlags & (TInputFlags)EInputFlag::MoveForward)
{
velocity.y += moveSpeed * pCtx->fFrameTime;
}
if (m_inputFlags & (TInputFlags)EInputFlag::MoveBack)
{
velocity.y -= moveSpeed * pCtx->fFrameTime;
}
// Update the player's transformation
Matrix34 transformation = m_pEntity->GetWorldTM();
transformation.AddTranslation(transformation.TransformVector(velocity));
// Update entity rotation based on latest input
Ang3 ypr = CCamera::CreateAnglesYPR(Matrix33(transformation));
const float rotationSpeed = 0.002f;
ypr.x += m_mouseDeltaRotation.x * rotationSpeed;
ypr.y += m_mouseDeltaRotation.y * rotationSpeed;
// Disable roll
ypr.z = 0;
transformation.SetRotation33(CCamera::CreateOrientationYPR(ypr));
// Reset the mouse delta since we "used" it this frame
m_mouseDeltaRotation = ZERO;
// Apply set position and rotation to the entity
m_pEntity->SetWorldTM(transformation);
Update(pCtx->fFrameTime);
}
break;
}
}
void CPlayerComponent::Revive()
{
// Set player transformation, but skip this in the Editor
if (!gEnv->IsEditor())
{
Vec3 playerScale = Vec3(1.f);
Quat playerRotation = IDENTITY;
// Position the player in the center of the map
const float heightOffset = 20.f;
float terrainCenter = gEnv->p3DEngine->GetTerrainSize() / 2.f;
float height = gEnv->p3DEngine->GetTerrainZ(terrainCenter, terrainCenter);
Vec3 playerPosition = Vec3(terrainCenter, terrainCenter, height + heightOffset);
m_pEntity->SetWorldTM(Matrix34::Create(playerScale, playerRotation, playerPosition));
}
// Unhide the entity in case hidden by the Editor
GetEntity()->Hide(false);
// Reset input now that the player respawned
m_inputFlags = 0;
m_mouseDeltaRotation = ZERO;
}
void CPlayerComponent::RenderCamera1ToCube()
{
}
void CPlayerComponent::HandleInputFlagChange(TInputFlags flags, int activationMode, EInputFlagType type)
{
switch (type)
{
case EInputFlagType::Hold:
{
if (activationMode == eIS_Released)
{
m_inputFlags &= ~flags;
}
else
{
m_inputFlags |= flags;
}
}
break;
case EInputFlagType::Toggle:
{
if (activationMode == eIS_Released)
{
// Toggle the bit(s)
m_inputFlags ^= flags;
}
}
break;
}
}
void CPlayerComponent::switchView()
{
if (isOriginCamera)
switchOtherView(*camera1);
else
switchOtherView(originCamera);
isOriginCamera =!isOriginCamera;
}
void CPlayerComponent::switchOtherView( CCamera & cam)
{
gEnv->pSystem->SetViewCamera(cam);
}
void CPlayerComponent::Update(float frametime)
{
SDisplayContextKey key = {};
if(camera1){
int width = gEnv->pRenderer->GetWidth();
int height = gEnv->pRenderer->GetHeight();
gEnv->pSystem->RenderBegin(key);
uint32 *c = new uint32[width*height];
gEnv->pSystem->SetViewCamera(*camera1);
//gEnv->pRenderer->UpdateAuxDefaultCamera(*camera1);
//CRenderView * iview = gEnv->pRenderer->GetOrCreateRenderView(IRenderView::eViewType_Recursive);
Render(*camera1);
//gEnv->p3DEngine->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(*camera1), __FUNCTION__);
//gEnv->p3DEngine->RenderWorld(IRenderer::eViewportType_Default,SRenderingPassInfo::CreateGeneralPassRenderingInfo(*gEnv->p3DEngine->GetRenderingPassCamera(*camera1)),"1");
//gEnv->pSystem->GetIProcess()->RenderWorld(805, SRenderingPassInfo::CreateGeneralPassRenderingInfo(*camera1), __FUNCTION__);
gEnv->pRenderer->ReadFrameBuffer(c,width,height,false,EReadTextureFormat::RGBA8);
//CryLogAlways("%0x",c[0]);
if(c[0]!=0){
int textureID = gEnv->pRenderer->UploadToVideoMemory(nullptr, width, height, eTF_R8G8B8A8, eTF_R8G8B8A8, 0, false, FILTER_BILINEAR, 0, "$texture_1", FT_NOMIPS);
gEnv->pRenderer->UpdateTextureInVideoMemory(textureID, (uchar*)c, 0, 0, width,height, eTF_R8G8B8A8);
}
gEnv->pSystem->SetViewCamera(originCamera);
//gEnv->pRenderer->UpdateAuxDefaultCamera(originCamera);
gEnv->pSystem->RenderBegin(key);
delete[]c;
}
}
void CPlayerComponent::Print(char * p, int size)
{
for (int i = 0; i < size; i++)
{
printf("%x",p[i]);
}
//CryLogAlways("%s", p[i]);
}
void CPlayerComponent::Render(const CCamera& cam)
{
if (!gEnv->pSystem->GetIProcess())
return; //should never happen
SRenderingPassInfo passInfo = SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam);
gEnv->p3DEngine->PrepareOcclusion(cam);
gEnv->p3DEngine->PreWorldStreamUpdate(cam);
if (gEnv->pRenderer)
{
if (gEnv->pSystem->GetIProcess()->GetFlags() & PROC_3DENGINE)
{
if (!gEnv->IsEditing()) // Editor calls it's own rendering update
{
#if !defined(_RELEASE)
if (gEnv->pSystem->GetITestSystem())
gEnv->pSystem->GetITestSystem()->BeforeRender();
#endif
if (gEnv->p3DEngine && !gEnv->IsFMVPlaying())
{
if ((!IsEquivalent(cam.GetPosition(), Vec3(0, 0, 0), VEC_EPSILON) && (!gEnv->pSystem->IsLoading())) || // never pass undefined camera to p3DEngine->RenderWorld()
gEnv->IsDedicated() || gEnv->pRenderer->IsPost3DRendererEnabled())
{
gEnv->p3DEngine->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam), __FUNCTION__);
}
else
{
gEnv->pRenderer->FillFrame(Col_Black);
}
}
}
}
else
{
gEnv->pSystem->GetIProcess()->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam), __FUNCTION__);
}
}
gEnv->p3DEngine->WorldStreamUpdate();
}
Re: Render to texture
#8I compile your code , but failed in "$texture_1". can upload sample project???the my code use CryEngine V,custom version 5.5.2Code: Select all
#include "StdAfx.h" #include "Player.h" #include <CryRenderer/IRenderAuxGeom.h> void CPlayerComponent::Initialize() { m_timer = gEnv->pSystem->GetITimer(); // Create the camera component, will automatically update the viewport every frame m_pCameraComponent = m_pEntity->GetOrCreateComponent<Cry::DefaultComponents::CCameraComponent>(); // Get the input component, wraps access to action mapping so we can easily get callbacks when inputs are triggered m_pInputComponent = m_pEntity->GetOrCreateComponent<Cry::DefaultComponents::CInputComponent>(); m_pCameraManager = gEnv->pSystem->GetIPluginManager()->QueryPlugin<IPlugin_CryDefaultEntities>()->GetICameraManager(); // Register an action, and the callback that will be sent when it's triggered m_pInputComponent->RegisterAction("player", "moveleft", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveLeft, activationMode); }); // Bind the 'A' key the "moveleft" action m_pInputComponent->BindAction("player", "moveleft", eAID_KeyboardMouse, EKeyId::eKI_A); m_pInputComponent->RegisterAction("player", "moveright", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveRight, activationMode); }); m_pInputComponent->BindAction("player", "moveright", eAID_KeyboardMouse, EKeyId::eKI_D); m_pInputComponent->RegisterAction("player", "moveforward", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveForward, activationMode); }); m_pInputComponent->BindAction("player", "moveforward", eAID_KeyboardMouse, EKeyId::eKI_W); m_pInputComponent->RegisterAction("player", "moveback", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveBack, activationMode); }); m_pInputComponent->BindAction("player", "moveback", eAID_KeyboardMouse, EKeyId::eKI_S); m_pInputComponent->RegisterAction("player", "mouse_rotateyaw", [this](int activationMode, float value) { m_mouseDeltaRotation.x -= value; }); m_pInputComponent->BindAction("player", "mouse_rotateyaw", eAID_KeyboardMouse, EKeyId::eKI_MouseX); m_pInputComponent->RegisterAction("player", "mouse_rotatepitch", [this](int activationMode, float value) { m_mouseDeltaRotation.y -= value; }); m_pInputComponent->BindAction("player", "mouse_rotatepitch", eAID_KeyboardMouse, EKeyId::eKI_MouseY); m_pInputComponent->RegisterAction("player", "switchCamera", [this](int activationMode, float value) { switchView(); }); m_pInputComponent->BindAction("player", "switchCamera", eAID_KeyboardMouse, EKeyId::eKI_P); Revive(); } uint64 CPlayerComponent::GetEventMask() const { return ENTITY_EVENT_BIT(ENTITY_EVENT_START_GAME) | ENTITY_EVENT_BIT(ENTITY_EVENT_UPDATE)| ENTITY_EVENT_BIT(ENTITY_EVENT_START_LEVEL); } void CPlayerComponent::ProcessEvent(const SEntityEvent& event) { switch (event.event) { case ENTITY_EVENT_START_LEVEL: { IEntity * entity1 = gEnv->pEntitySystem->FindEntityByName("Camera-2"); IEntityClass * camera_class = entity1->GetClass(); Cry::DefaultComponents::CCameraComponent * camera = entity1->GetComponent<Cry::DefaultComponents::CCameraComponent>(); if (camera) { //Quat rotate = entity1->GetWorldRotation(); camera1 = &camera->GetCamera(); camera1->SetMatrix(entity1->GetWorldTM()); //camera1->SetPosition(entity1->GetPos()); //Vec3 dir = camera1->CreateViewdir(Ang3(rotate.GetFwdX(),rotate.GetFwdY(), rotate.GetFwdZ())); } originCamera = gEnv->pSystem->GetViewCamera(); /* IEntity * entity2 = gEnv->pEntitySystem->FindEntityByName("Camera-2"); if (entity2) { camera2 = entity2->GetComponent<Cry::DefaultComponents::CCameraComponent>(); camera1 = &camera2->GetCamera(); }*/ } break; case ENTITY_EVENT_START_GAME: { // Revive the entity when gameplay starts Revive(); } break; case ENTITY_EVENT_UPDATE: { SEntityUpdateContext* pCtx = (SEntityUpdateContext*)event.nParam[0]; const float moveSpeed = 20.5f; Vec3 velocity = ZERO; // Check input to calculate local space velocity if (m_inputFlags & (TInputFlags)EInputFlag::MoveLeft) { velocity.x -= moveSpeed * pCtx->fFrameTime; } if (m_inputFlags & (TInputFlags)EInputFlag::MoveRight) { velocity.x += moveSpeed * pCtx->fFrameTime; } if (m_inputFlags & (TInputFlags)EInputFlag::MoveForward) { velocity.y += moveSpeed * pCtx->fFrameTime; } if (m_inputFlags & (TInputFlags)EInputFlag::MoveBack) { velocity.y -= moveSpeed * pCtx->fFrameTime; } // Update the player's transformation Matrix34 transformation = m_pEntity->GetWorldTM(); transformation.AddTranslation(transformation.TransformVector(velocity)); // Update entity rotation based on latest input Ang3 ypr = CCamera::CreateAnglesYPR(Matrix33(transformation)); const float rotationSpeed = 0.002f; ypr.x += m_mouseDeltaRotation.x * rotationSpeed; ypr.y += m_mouseDeltaRotation.y * rotationSpeed; // Disable roll ypr.z = 0; transformation.SetRotation33(CCamera::CreateOrientationYPR(ypr)); // Reset the mouse delta since we "used" it this frame m_mouseDeltaRotation = ZERO; // Apply set position and rotation to the entity m_pEntity->SetWorldTM(transformation); Update(pCtx->fFrameTime); } break; } } void CPlayerComponent::Revive() { // Set player transformation, but skip this in the Editor if (!gEnv->IsEditor()) { Vec3 playerScale = Vec3(1.f); Quat playerRotation = IDENTITY; // Position the player in the center of the map const float heightOffset = 20.f; float terrainCenter = gEnv->p3DEngine->GetTerrainSize() / 2.f; float height = gEnv->p3DEngine->GetTerrainZ(terrainCenter, terrainCenter); Vec3 playerPosition = Vec3(terrainCenter, terrainCenter, height + heightOffset); m_pEntity->SetWorldTM(Matrix34::Create(playerScale, playerRotation, playerPosition)); } // Unhide the entity in case hidden by the Editor GetEntity()->Hide(false); // Reset input now that the player respawned m_inputFlags = 0; m_mouseDeltaRotation = ZERO; } void CPlayerComponent::RenderCamera1ToCube() { } void CPlayerComponent::HandleInputFlagChange(TInputFlags flags, int activationMode, EInputFlagType type) { switch (type) { case EInputFlagType::Hold: { if (activationMode == eIS_Released) { m_inputFlags &= ~flags; } else { m_inputFlags |= flags; } } break; case EInputFlagType::Toggle: { if (activationMode == eIS_Released) { // Toggle the bit(s) m_inputFlags ^= flags; } } break; } } void CPlayerComponent::switchView() { if (isOriginCamera) switchOtherView(*camera1); else switchOtherView(originCamera); isOriginCamera =!isOriginCamera; } void CPlayerComponent::switchOtherView( CCamera & cam) { gEnv->pSystem->SetViewCamera(cam); } void CPlayerComponent::Update(float frametime) { SDisplayContextKey key = {}; if(camera1){ int width = gEnv->pRenderer->GetWidth(); int height = gEnv->pRenderer->GetHeight(); gEnv->pSystem->RenderBegin(key); uint32 *c = new uint32[width*height]; gEnv->pSystem->SetViewCamera(*camera1); //gEnv->pRenderer->UpdateAuxDefaultCamera(*camera1); //CRenderView * iview = gEnv->pRenderer->GetOrCreateRenderView(IRenderView::eViewType_Recursive); Render(*camera1); //gEnv->p3DEngine->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(*camera1), __FUNCTION__); //gEnv->p3DEngine->RenderWorld(IRenderer::eViewportType_Default,SRenderingPassInfo::CreateGeneralPassRenderingInfo(*gEnv->p3DEngine->GetRenderingPassCamera(*camera1)),"1"); //gEnv->pSystem->GetIProcess()->RenderWorld(805, SRenderingPassInfo::CreateGeneralPassRenderingInfo(*camera1), __FUNCTION__); gEnv->pRenderer->ReadFrameBuffer(c,width,height,false,EReadTextureFormat::RGBA8); //CryLogAlways("%0x",c[0]); if(c[0]!=0){ int textureID = gEnv->pRenderer->UploadToVideoMemory(nullptr, width, height, eTF_R8G8B8A8, eTF_R8G8B8A8, 0, false, FILTER_BILINEAR, 0, "$texture_1", FT_NOMIPS); gEnv->pRenderer->UpdateTextureInVideoMemory(textureID, (uchar*)c, 0, 0, width,height, eTF_R8G8B8A8); } gEnv->pSystem->SetViewCamera(originCamera); //gEnv->pRenderer->UpdateAuxDefaultCamera(originCamera); gEnv->pSystem->RenderBegin(key); delete[]c; } } void CPlayerComponent::Print(char * p, int size) { for (int i = 0; i < size; i++) { printf("%x",p[i]); } //CryLogAlways("%s", p[i]); } void CPlayerComponent::Render(const CCamera& cam) { if (!gEnv->pSystem->GetIProcess()) return; //should never happen SRenderingPassInfo passInfo = SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam); gEnv->p3DEngine->PrepareOcclusion(cam); gEnv->p3DEngine->PreWorldStreamUpdate(cam); if (gEnv->pRenderer) { if (gEnv->pSystem->GetIProcess()->GetFlags() & PROC_3DENGINE) { if (!gEnv->IsEditing()) // Editor calls it's own rendering update { #if !defined(_RELEASE) if (gEnv->pSystem->GetITestSystem()) gEnv->pSystem->GetITestSystem()->BeforeRender(); #endif if (gEnv->p3DEngine && !gEnv->IsFMVPlaying()) { if ((!IsEquivalent(cam.GetPosition(), Vec3(0, 0, 0), VEC_EPSILON) && (!gEnv->pSystem->IsLoading())) || // never pass undefined camera to p3DEngine->RenderWorld() gEnv->IsDedicated() || gEnv->pRenderer->IsPost3DRendererEnabled()) { gEnv->p3DEngine->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam), __FUNCTION__); } else { gEnv->pRenderer->FillFrame(Col_Black); } } } } else { gEnv->pSystem->GetIProcess()->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam), __FUNCTION__); } } gEnv->p3DEngine->WorldStreamUpdate(); }
Re: Render to texture
#9Only a fraction of that code was related to render to texture. Im sure he made changes to the renderer to make it work in CE.
Re: Render to texture
#10geometry mesh object materials,diffuse filename is $texture_1I compile your code , but failed in "$texture_1". can upload sample project???the my code use CryEngine V,custom version 5.5.2Code: Select all
#include "StdAfx.h" #include "Player.h" #include <CryRenderer/IRenderAuxGeom.h> void CPlayerComponent::Initialize() { m_timer = gEnv->pSystem->GetITimer(); // Create the camera component, will automatically update the viewport every frame m_pCameraComponent = m_pEntity->GetOrCreateComponent<Cry::DefaultComponents::CCameraComponent>(); // Get the input component, wraps access to action mapping so we can easily get callbacks when inputs are triggered m_pInputComponent = m_pEntity->GetOrCreateComponent<Cry::DefaultComponents::CInputComponent>(); m_pCameraManager = gEnv->pSystem->GetIPluginManager()->QueryPlugin<IPlugin_CryDefaultEntities>()->GetICameraManager(); // Register an action, and the callback that will be sent when it's triggered m_pInputComponent->RegisterAction("player", "moveleft", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveLeft, activationMode); }); // Bind the 'A' key the "moveleft" action m_pInputComponent->BindAction("player", "moveleft", eAID_KeyboardMouse, EKeyId::eKI_A); m_pInputComponent->RegisterAction("player", "moveright", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveRight, activationMode); }); m_pInputComponent->BindAction("player", "moveright", eAID_KeyboardMouse, EKeyId::eKI_D); m_pInputComponent->RegisterAction("player", "moveforward", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveForward, activationMode); }); m_pInputComponent->BindAction("player", "moveforward", eAID_KeyboardMouse, EKeyId::eKI_W); m_pInputComponent->RegisterAction("player", "moveback", [this](int activationMode, float value) { HandleInputFlagChange((TInputFlags)EInputFlag::MoveBack, activationMode); }); m_pInputComponent->BindAction("player", "moveback", eAID_KeyboardMouse, EKeyId::eKI_S); m_pInputComponent->RegisterAction("player", "mouse_rotateyaw", [this](int activationMode, float value) { m_mouseDeltaRotation.x -= value; }); m_pInputComponent->BindAction("player", "mouse_rotateyaw", eAID_KeyboardMouse, EKeyId::eKI_MouseX); m_pInputComponent->RegisterAction("player", "mouse_rotatepitch", [this](int activationMode, float value) { m_mouseDeltaRotation.y -= value; }); m_pInputComponent->BindAction("player", "mouse_rotatepitch", eAID_KeyboardMouse, EKeyId::eKI_MouseY); m_pInputComponent->RegisterAction("player", "switchCamera", [this](int activationMode, float value) { switchView(); }); m_pInputComponent->BindAction("player", "switchCamera", eAID_KeyboardMouse, EKeyId::eKI_P); Revive(); } uint64 CPlayerComponent::GetEventMask() const { return ENTITY_EVENT_BIT(ENTITY_EVENT_START_GAME) | ENTITY_EVENT_BIT(ENTITY_EVENT_UPDATE)| ENTITY_EVENT_BIT(ENTITY_EVENT_START_LEVEL); } void CPlayerComponent::ProcessEvent(const SEntityEvent& event) { switch (event.event) { case ENTITY_EVENT_START_LEVEL: { IEntity * entity1 = gEnv->pEntitySystem->FindEntityByName("Camera-2"); IEntityClass * camera_class = entity1->GetClass(); Cry::DefaultComponents::CCameraComponent * camera = entity1->GetComponent<Cry::DefaultComponents::CCameraComponent>(); if (camera) { //Quat rotate = entity1->GetWorldRotation(); camera1 = &camera->GetCamera(); camera1->SetMatrix(entity1->GetWorldTM()); //camera1->SetPosition(entity1->GetPos()); //Vec3 dir = camera1->CreateViewdir(Ang3(rotate.GetFwdX(),rotate.GetFwdY(), rotate.GetFwdZ())); } originCamera = gEnv->pSystem->GetViewCamera(); /* IEntity * entity2 = gEnv->pEntitySystem->FindEntityByName("Camera-2"); if (entity2) { camera2 = entity2->GetComponent<Cry::DefaultComponents::CCameraComponent>(); camera1 = &camera2->GetCamera(); }*/ } break; case ENTITY_EVENT_START_GAME: { // Revive the entity when gameplay starts Revive(); } break; case ENTITY_EVENT_UPDATE: { SEntityUpdateContext* pCtx = (SEntityUpdateContext*)event.nParam[0]; const float moveSpeed = 20.5f; Vec3 velocity = ZERO; // Check input to calculate local space velocity if (m_inputFlags & (TInputFlags)EInputFlag::MoveLeft) { velocity.x -= moveSpeed * pCtx->fFrameTime; } if (m_inputFlags & (TInputFlags)EInputFlag::MoveRight) { velocity.x += moveSpeed * pCtx->fFrameTime; } if (m_inputFlags & (TInputFlags)EInputFlag::MoveForward) { velocity.y += moveSpeed * pCtx->fFrameTime; } if (m_inputFlags & (TInputFlags)EInputFlag::MoveBack) { velocity.y -= moveSpeed * pCtx->fFrameTime; } // Update the player's transformation Matrix34 transformation = m_pEntity->GetWorldTM(); transformation.AddTranslation(transformation.TransformVector(velocity)); // Update entity rotation based on latest input Ang3 ypr = CCamera::CreateAnglesYPR(Matrix33(transformation)); const float rotationSpeed = 0.002f; ypr.x += m_mouseDeltaRotation.x * rotationSpeed; ypr.y += m_mouseDeltaRotation.y * rotationSpeed; // Disable roll ypr.z = 0; transformation.SetRotation33(CCamera::CreateOrientationYPR(ypr)); // Reset the mouse delta since we "used" it this frame m_mouseDeltaRotation = ZERO; // Apply set position and rotation to the entity m_pEntity->SetWorldTM(transformation); Update(pCtx->fFrameTime); } break; } } void CPlayerComponent::Revive() { // Set player transformation, but skip this in the Editor if (!gEnv->IsEditor()) { Vec3 playerScale = Vec3(1.f); Quat playerRotation = IDENTITY; // Position the player in the center of the map const float heightOffset = 20.f; float terrainCenter = gEnv->p3DEngine->GetTerrainSize() / 2.f; float height = gEnv->p3DEngine->GetTerrainZ(terrainCenter, terrainCenter); Vec3 playerPosition = Vec3(terrainCenter, terrainCenter, height + heightOffset); m_pEntity->SetWorldTM(Matrix34::Create(playerScale, playerRotation, playerPosition)); } // Unhide the entity in case hidden by the Editor GetEntity()->Hide(false); // Reset input now that the player respawned m_inputFlags = 0; m_mouseDeltaRotation = ZERO; } void CPlayerComponent::RenderCamera1ToCube() { } void CPlayerComponent::HandleInputFlagChange(TInputFlags flags, int activationMode, EInputFlagType type) { switch (type) { case EInputFlagType::Hold: { if (activationMode == eIS_Released) { m_inputFlags &= ~flags; } else { m_inputFlags |= flags; } } break; case EInputFlagType::Toggle: { if (activationMode == eIS_Released) { // Toggle the bit(s) m_inputFlags ^= flags; } } break; } } void CPlayerComponent::switchView() { if (isOriginCamera) switchOtherView(*camera1); else switchOtherView(originCamera); isOriginCamera =!isOriginCamera; } void CPlayerComponent::switchOtherView( CCamera & cam) { gEnv->pSystem->SetViewCamera(cam); } void CPlayerComponent::Update(float frametime) { SDisplayContextKey key = {}; if(camera1){ int width = gEnv->pRenderer->GetWidth(); int height = gEnv->pRenderer->GetHeight(); gEnv->pSystem->RenderBegin(key); uint32 *c = new uint32[width*height]; gEnv->pSystem->SetViewCamera(*camera1); //gEnv->pRenderer->UpdateAuxDefaultCamera(*camera1); //CRenderView * iview = gEnv->pRenderer->GetOrCreateRenderView(IRenderView::eViewType_Recursive); Render(*camera1); //gEnv->p3DEngine->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(*camera1), __FUNCTION__); //gEnv->p3DEngine->RenderWorld(IRenderer::eViewportType_Default,SRenderingPassInfo::CreateGeneralPassRenderingInfo(*gEnv->p3DEngine->GetRenderingPassCamera(*camera1)),"1"); //gEnv->pSystem->GetIProcess()->RenderWorld(805, SRenderingPassInfo::CreateGeneralPassRenderingInfo(*camera1), __FUNCTION__); gEnv->pRenderer->ReadFrameBuffer(c,width,height,false,EReadTextureFormat::RGBA8); //CryLogAlways("%0x",c[0]); if(c[0]!=0){ int textureID = gEnv->pRenderer->UploadToVideoMemory(nullptr, width, height, eTF_R8G8B8A8, eTF_R8G8B8A8, 0, false, FILTER_BILINEAR, 0, "$texture_1", FT_NOMIPS); gEnv->pRenderer->UpdateTextureInVideoMemory(textureID, (uchar*)c, 0, 0, width,height, eTF_R8G8B8A8); } gEnv->pSystem->SetViewCamera(originCamera); //gEnv->pRenderer->UpdateAuxDefaultCamera(originCamera); gEnv->pSystem->RenderBegin(key); delete[]c; } } void CPlayerComponent::Print(char * p, int size) { for (int i = 0; i < size; i++) { printf("%x",p[i]); } //CryLogAlways("%s", p[i]); } void CPlayerComponent::Render(const CCamera& cam) { if (!gEnv->pSystem->GetIProcess()) return; //should never happen SRenderingPassInfo passInfo = SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam); gEnv->p3DEngine->PrepareOcclusion(cam); gEnv->p3DEngine->PreWorldStreamUpdate(cam); if (gEnv->pRenderer) { if (gEnv->pSystem->GetIProcess()->GetFlags() & PROC_3DENGINE) { if (!gEnv->IsEditing()) // Editor calls it's own rendering update { #if !defined(_RELEASE) if (gEnv->pSystem->GetITestSystem()) gEnv->pSystem->GetITestSystem()->BeforeRender(); #endif if (gEnv->p3DEngine && !gEnv->IsFMVPlaying()) { if ((!IsEquivalent(cam.GetPosition(), Vec3(0, 0, 0), VEC_EPSILON) && (!gEnv->pSystem->IsLoading())) || // never pass undefined camera to p3DEngine->RenderWorld() gEnv->IsDedicated() || gEnv->pRenderer->IsPost3DRendererEnabled()) { gEnv->p3DEngine->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam), __FUNCTION__); } else { gEnv->pRenderer->FillFrame(Col_Black); } } } } else { gEnv->pSystem->GetIProcess()->RenderWorld(SHDF_ALLOW_WATER | SHDF_ALLOWPOSTPROCESS | SHDF_ALLOWHDR | SHDF_ZPASS | SHDF_ALLOW_AO, SRenderingPassInfo::CreateGeneralPassRenderingInfo(cam), __FUNCTION__); } } gEnv->p3DEngine->WorldStreamUpdate(); }