Войти
WarZesФорум

Пишу движок - Основа рендера (1 часть) (комментарии) (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
14:09, 9 ноя. 2012

Grettir
> А вот средненький движок, заточенный под WinMobile для казуальщиков пойдет -
> причем тут главное не архитектура, а удобный редактор со скриптами и хорошая
> документация.
а че WinMobile имеет шансы на хорошее будущее? Просто если так, то попозже начну делать порт:) А то очень давно хочу на мобильные платформы перейти, но вечно какие-то ограничения( айфоны можно прогать только на маках, до сих пор не допер как на андроиде на с++ прогать.. поставил ndk, а что с ней делать дальше и почему во всех уроках по ней все так же прогают на джаве, только вставки кода на с++ вставляют..)


#31
14:09, 9 ноя. 2012

Grettir
> кинь картинку, где ты всем этим пользуешься.
  Есть у него одна игра, шашки называется, посмотри
в профиле.

#32
14:15, 9 ноя. 2012

RenGD
Я знаю =)

Ему и dx 9 не нужен...

#33
14:38, 9 ноя. 2012

RenGD
> Есть у него одна игра, шашки называется, посмотри в профиле.
К чему ты это написал?
К тому, что, если посмотреть вы твой профиль, там не одной игры не будет?
:)

#34
14:54, 9 ноя. 2012

Jimnik
> К чему ты это написал?
  Чтобы показать пример игры, где ты используешь DX11.
Где-то еще тема была, но не могу ее найти

Jimnik
> К тому, что, если посмотреть вы твой профиль, там не одной игры не будет?
> :)
  У нас все таки разные игры - ты делаешь говноказуалки, а я стратегию.
Так до моего ландшафта тебе еще расти и расти

#35
15:06, 9 ноя. 2012

Большинство нового функционала в новых видеокартах направлено на новые возможности уменьшить процессорозависимость рендера. Ожидать, что там как-то вдруг внезапно улучшится картинка - это детский сад.

#36
15:11, 9 ноя. 2012

RenGD
> У нас все таки разные игры - ты делаешь говноказуалки, а я стратегию.
Мои "говноказуалки" входят в дополнительную програграмму к Летним Олимпийским Играм, и одна из игр, Го, является самой интеллектуальной и самой популярной стратегией в мире.
Твоя же стратегия - это вещь в себе.

> Так до моего ландшафта тебе еще расти и расти
Это только потому, что я им пока не занимался.

#37
15:13, 9 ноя. 2012

SNVampyre
Новый фуекционал и позволяет использовать новые техники рендеринга, что повышает качество выходной картинки.

#38
18:51, 9 ноя. 2012

Напоследок, сегодня собирал тестовую демку (ландшафт и скайбокс), и решил показать как код выглядит сейчас.

main.cpp

#include "../Engine/stdafx.h"
#include "../Engine/Application.h"
#include "TestModule.h"

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hLastInst, LPSTR lpszCmdLine, int nCmdShow)
{
  Application app;
  Config config;
  TestModule test;
  
  app.Create(config);

  app.AddModule(&test, "Test");
  app.SetActiveModule("Test");

  app.Run();

  app.Close();
  
  return 0;
}

TestModule.h

#pragma once

#include "../Engine/stdafx.h"
#include "../Engine/IModule.h"
#include "../Engine/InputCodes.h"
#include "../Engine/InputListener.h"
#include "../Engine/WndListener.h"
#include "../Engine/Engine.h"

#include "../Render/stdafx.h"

using namespace Sapphire3D;

class TestModule : public IModule, public InputListener, public WndListener
{
public:
  void doInit();
  bool doRun();
  void doClose();

  virtual bool KeyPressed(const KeyEvent &arg);
  virtual bool KeyReleased(const KeyEvent &arg);
  virtual bool MouseMove(const MouseEvent &arg);
  virtual void Resize(uint w, uint h);

  void Сontrols();

private:
  uint m_idinput;
  uint m_idwnd;
  uint m_w,m_h;

  Vector3 camPos;
  float wx, wy;
  float speed;
   
  RenderView *m_view;

  bool leftKey;
  bool rightKey;
  bool downKey;
  bool upKey;
  bool backwardKey;
  bool forwardKey;

  Matrix4 projection;

  Image m_TerrainImage;

  TextureID m_DepthRT;
  TextureID m_Terrain;
  TextureID m_TerrainShadow;
  TextureID m_Ground0;
  TextureID m_Ground1;
  TextureID m_Environment;

  ShaderID m_TerrainShader;
  ShaderID m_SkyboxShader;

  SamplerStateID m_TrilinearAniso;
  SamplerStateID m_TrilinearClamp;
};

TestModule.cpp

#include "TestModule.h"

void TestModule::doInit()
{
  m_idinput = EngineEventMgr->AddInputListener(this);
  m_idwnd = EngineEventMgr->AddWndListener(this);
  
  camPos = Vector3(-5.3f, 27.4f, 109.6f);
  wx = 0.19f;
  wy = 3.10f;
  speed = 50;

  leftKey = false;
  rightKey = false;
  downKey = false;
  upKey = false;
  backwardKey = false;
  forwardKey = false;

  m_w = Engine::Get()->GetDesc().wnd.width;
  m_h = Engine::Get()->GetDesc().wnd.height;

  CHECK((m_TerrainShader = EngineRenderRes->AddShader("terrain.hlsl")) != SHADER_NONE, "!m_TerrainShader");
  CHECK((m_SkyboxShader = EngineRenderRes->AddShader("skybox.hlsl")) != SHADER_NONE, "!m_SkyboxShader");

  CHECK((m_DepthRT = EngineRenderRes->AddRenderDepth(m_w, m_h, 1)) != TEXTURE_NONE, "!m_DepthRT");

  CHECK((m_TrilinearClamp = EngineRenderRes->AddSamplerState(TRILINEAR, CLAMP, CLAMP, CLAMP)) != SS_NONE, "!m_TrilinearClamp");
  CHECK((m_TrilinearAniso = EngineRenderRes->AddSamplerState(TRILINEAR_ANISO, WRAP, WRAP, WRAP)) != SS_NONE, "!m_TrilinearAniso");

  m_TerrainImage.LoadDDS("Terrain.dds");
  CHECK((m_Terrain = EngineRenderRes->AddTexture(m_TerrainImage, false, EngineRenderDevice->linearClamp)) != TEXTURE_NONE, "!m_Terrain") ;
  m_TerrainImage.UncompressImage();

  CHECK((m_TerrainShadow = EngineRenderRes->AddTexture("TerrainShadow.dds", false, EngineRenderDevice->linearClamp)) != TEXTURE_NONE, "!m_TerrainShadow");

  CHECK((m_Ground0 = EngineRenderRes->AddTexture("Textures/Grass2.jpg", true, m_TrilinearAniso)) != TEXTURE_NONE, "!m_Ground0");
  CHECK((m_Ground1 = EngineRenderRes->AddTexture("Textures/rock.pcx", true, m_TrilinearAniso)) != TEXTURE_NONE, "!m_Ground1");

  const char *files[] =
  {
    "Textures/CubeMaps/MountainPath/posx.jpg", 
    "Textures/CubeMaps/MountainPath/negx.jpg",
    "Textures/CubeMaps/MountainPath/posy.jpg", 
    "Textures/CubeMaps/MountainPath/negy.jpg",
    "Textures/CubeMaps/MountainPath/posz.jpg", 
    "Textures/CubeMaps/MountainPath/negz.jpg",
  };
  CHECK((m_Environment = EngineRenderRes->AddCubemap(files, true, m_TrilinearClamp)) != TEXTURE_NONE, "!m_Environment");

  Resize(m_w,m_h);

  float x,y;
  x = m_w/2;
  y = m_h/2;
  POINT point = {x, y};
  ClientToScreen(Engine::Get()->GetDesc().render.hwnd, &point);
  SetCursorPos(point.x, point.y);

  m_view = new RenderView();
  EngineRenderDevice->GetFrame()->SetView(m_view);
}

bool TestModule::doRun()
{
  controls();
  Matrix4 modelview = rotateXY(-wx, -wy);
  Matrix4 invMvpEnv = !(projection * modelview);
  modelview.translate(-camPos);
  Matrix4 mvp = projection * modelview;
  
  EngineRenderPipeline->ChangeRenderTarget(FB_COLOR, m_DepthRT);
  EngineRenderPipeline->Clear(false, true, true);
  
  EngineRenderPipeline->Reset();
  EngineRenderPipeline->SetRasterizerState(EngineRenderDevice->cullBack);
  EngineRenderPipeline->SetShader(m_TerrainShader);
  EngineRenderPipeline->SetShaderConstant4x4f("mvp", mvp);
  EngineRenderPipeline->SetTexture("terrain", m_Terrain);
  EngineRenderPipeline->SetTexture("ground0", m_Ground0);
  EngineRenderPipeline->SetTexture("ground1", m_Ground1);
  EngineRenderPipeline->SetTexture("shadow", m_TerrainShadow);
  EngineRenderPipeline->SetSamplerState("filter", m_TrilinearAniso);
  EngineRenderPipeline->SetSamplerState("shadow_filter", EngineRenderDevice->linearClamp);
  EngineRenderPipeline->SetSamplerState("vsfilter", EngineRenderDevice->linearClamp);
  
  EngineRenderPipeline->Apply();

  EngineRenderDevice->devicecontext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
  EngineRenderDevice->devicecontext->DrawInstanced(256, 255, 0, 0);
  
  EngineRenderPipeline->Reset();
  EngineRenderPipeline->SetRasterizerState(EngineRenderDevice->cullBack);
  EngineRenderPipeline->SetShader(m_SkyboxShader);
  EngineRenderPipeline->SetShaderConstant4x4f("invMvp", invMvpEnv);
  EngineRenderPipeline->SetTexture("env", m_Environment);
  EngineRenderPipeline->SetSamplerState("filter", m_TrilinearClamp);
  EngineRenderPipeline->SetDepthState(EngineRenderDevice->noDepthWrite);
  EngineRenderPipeline->Apply();

  EngineRenderDevice->devicecontext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  EngineRenderDevice->devicecontext->Draw(3, 0);

  return true;
}

void TestModule::controls()
{
  float cosX = cosf(wx), sinX = sinf(wx), cosY = cosf(wy), sinY = sinf(wy);
  Vector3 dx(cosY, 0, sinY);
  Vector3 dy(-sinX * sinY,  cosX, sinX * cosY);
  Vector3 dz(-cosX * sinY, -sinX, cosX * cosY);

  Vector3 dir(0, 0, 0);
  if (leftKey)     
    dir -= dx;
  if (rightKey)    
    dir += dx;
  if (downKey)     
    dir -= dy;
  if (upKey)       
    dir += dy;
  if (backwardKey) 
    dir -= dz;
  if (forwardKey)  
    dir += dz;

  float lenSq = dot(dir, dir);
  if (lenSq > 0)
    camPos += (dir * (1.0f / sqrtf(lenSq))) * (0.005 * speed);
}

void TestModule::doClose()
{
  EngineEventMgr->RemoveInputListener(m_idinput);
  EngineEventMgr->RemoveWndListener(m_idwnd);
}

bool TestModule::KeyPressed(const KeyEvent &arg)
{
  if (arg.code == KEY_A)
    leftKey = true;
  if (arg.code == KEY_D)
    rightKey = true;
  if (arg.code == KEY_Q)
    downKey = true;
  if (arg.code == KEY_E)
    upKey = true;
  if (arg.code == KEY_S)
    backwardKey = true;
  if (arg.code == KEY_W)
    forwardKey = true;
  if (arg.code == KEY_ESCAPE)
    Exit();

  return false;
}

void TestModule::Resize(uint w, uint h)
{
  m_w = w;
  m_h = h;
  EngineRenderRes->resizeRenderTarget(m_DepthRT, m_w, m_h, 1, 1, 1);

  projection = perspectiveMatrixX(1.5f, m_w, m_h, 0.1f, 500);
}

bool TestModule::KeyReleased(const KeyEvent &arg)
{
  if (arg.code == KEY_A)
    leftKey = false;
  if (arg.code == KEY_D)
    rightKey = false;
  if (arg.code == KEY_Q)
    downKey = false;
  if (arg.code == KEY_E)
    upKey = false;
  if (arg.code == KEY_S)
    backwardKey = false;
  if (arg.code == KEY_W)
    forwardKey = false;
  return false;
}

bool TestModule::MouseMove(const MouseEvent &arg)
{
  float x,y;
  x = m_w/2;
  y = m_h/2;
  wx += -1 * 0.003f * (y - arg.y);
  wy += 0.003f * (x - arg.x);

  POINT point = {x, y};
  ClientToScreen(Engine::Get()->GetDesc().render.hwnd, &point);
  SetCursorPos(point.x, point.y);

  return true;
}

Здесь можно на практике увидеть те самые модули, как видите - Application не нужно перегружать (как это делают в 90% движков), вместо этого надо писать модули (а их может быть несколько) в которых весь функционал и выполняется, имхо это сильно облегчает юзанье движка скрывая кучу лишнего кода.
Также здесь выполняется голый папелайн (так как frame еще не написан а view только начат)ground0

#39
18:54, 9 ноя. 2012

Даешь стрим кодинга!

#40
19:00, 9 ноя. 2012

Che@ter
это че такое?

#41
19:12, 9 ноя. 2012

war_zes
> EngineRenderPipeline->SetShaderConstant4x4f("mvp", mvp);
> EngineRenderPipeline->SetTexture("terrain", m_Terrain);
устанавливать параметры по строкам как то не тру, не?

#42
19:32, 9 ноя. 2012

war_zes, ты бы код хоть в спойлер обернул что ли ))) Кто его читать-то особо будет? )

#43
20:08, 9 ноя. 2012

war_zes
Как-то странно у тебя.
Сочетаются сразу две архитектуры. Одна как в огре, только вместо синглетона глобальный указатель:

EngineEventMgr->AddInputListener(this);
А другая вообще диаметрально противоположная. Берём синглетон на указатель на движок и из него тащим какую-то структуру с сокращёнными названиями...
  m_w = Engine::Get()->GetDesc().wnd.width;
Сочетаются два стиля оформления членов класса: с "m_" и без.

И плюс WinAPI в перемешку, мда...

Боюсь, разбираться с такой кашей будет адски тяжело.

#44
21:29, 9 ноя. 2012

Jimnik
> что повышает качество выходной картинки.
Качество твоей картинки - как рыгля бомжа на тротуаре.
И Го - придумал не ты - тупо скопировал - и кричишь что игра супер, и ты супер. Игра так себе - на любителя - но не ты же ее придумал. Так что твои знания - на уровне - написания крестиков ноликов.

> Мои "говноказуалки" входят в дополнительную програграмму к Летним Олимпийским
> Играм
Пруф пожалуйста или опять ололшкин?

Страницы: 1 2 3 4 Следующая »
WarZesФорум

Тема в архиве.