示例#1
0
bool SplineTest::render() {
  ADD_PROFILE_SCOPE();
  _ctx->begin_frame();

  int w = GRAPHICS.width();
  int h = GRAPHICS.height();

  KASSERT(w && h);

  XMFLOAT4X4 worldViewProj;
  XMMATRIX xWorldViewProj = XMMatrixMultiply(XMLoadFloat4x4(&_view), XMLoadFloat4x4(&_proj));
  XMStoreFloat4x4(&worldViewProj, XMMatrixMultiply(XMLoadFloat4x4(&_view), XMLoadFloat4x4(&_proj)));
  XMFLOAT4 clipSpaceLightPos(0,100,200,1);
  XMStoreFloat4(&clipSpaceLightPos, XMVector3TransformCoord(XMLoadFloat4(&clipSpaceLightPos), xWorldViewProj));
  // divide by w -> ndc
  clipSpaceLightPos.x /= clipSpaceLightPos.w;
  clipSpaceLightPos.y /= clipSpaceLightPos.w;
  clipSpaceLightPos.z /= clipSpaceLightPos.w;

  // convert to texture space
  struct {
    XMFLOAT4 ssLight;
    XMFLOAT4 texLight;
    XMFLOAT2 screenSize;
  } cbufferLight;

  cbufferLight.texLight.x = (0.5f + 0.5f * clipSpaceLightPos.x);
  cbufferLight.texLight.y = (1.0f - (0.5f + 0.5f * clipSpaceLightPos.y));
  cbufferLight.ssLight.x = cbufferLight.texLight.x * w;
  cbufferLight.ssLight.y = cbufferLight.texLight.y * h;

  cbufferLight.screenSize = XMFLOAT2((float)w, (float)h);

  ScopedRt rtColor(w, h, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateDepthBuffer, "rtColor");
  ScopedRt rtOcclude(w, h, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateDepthBuffer, "rtOcclude");

  {
    Technique *technique;
    Shader *ps, *vs;
    setupTechnique(_ctx, _gradient_technique, true, &technique, &vs, nullptr, &ps);
    _ctx->set_cbuffer(ps->find_cbuffer("WorldToScreenSpace"), 0, ShaderType::kPixelShader, &cbufferLight, sizeof(cbufferLight));

    _ctx->set_render_target(rtColor, true);
    _ctx->draw_indexed(technique->index_count(), 0, 0);

    //_ctx->set_render_target(rtOcclude, true);
    //_ctx->draw_indexed(technique->index_count(), 0, 0);
  }


  GraphicsObjectHandle rts[] = { rtColor, rtOcclude };
  bool clear[] = { false, true };
  _ctx->set_render_targets(rts, clear, 2);

  int w4 = w/4;
  int h4 = h/4;
  ScopedRt rtMirror(w4, h4, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateDepthBuffer, "rtMirror");
  renderSplines(rtMirror);

  _ctx->set_render_target(rtColor, false);
  renderParticles();

  ScopedRt rtMirrorBlur1(w4, h4, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateUav, "rtMirrorBlur1");
  ScopedRt rtMirrorBlur2(w4, h4, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateUav, "rtMirrorBlur2");
  _blur.do_blur(4, rtMirror, rtMirrorBlur1, rtMirrorBlur2, w4, h4, _ctx);

  renderPlane(rtMirrorBlur2);

  int w2 = w/2;
  int h2 = h/2;
  ScopedRt rtDownscale(w2, h2, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv, "rtDownscale");
  ScopedRt rtBlur1(w2, h2, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateUav, "rtBlur1");
  ScopedRt rtBlur2(w2, h2, DXGI_FORMAT_R16G16B16A16_FLOAT, Graphics::kCreateSrv | Graphics::kCreateUav, "rtBlur2");

  post_process(rtOcclude, rtDownscale, _scale);
  _blur.do_blur(10, rtDownscale, rtBlur1, rtBlur2, w2, h2, _ctx);


  {
    Technique *technique;
    Shader *ps, *vs;
    setupTechnique(_ctx, _compose_technique, true, &technique, &vs, nullptr, &ps);

    _ctx->set_cbuffer(ps->find_cbuffer("WorldToScreenSpace"), 0, ShaderType::kPixelShader, &cbufferLight, sizeof(cbufferLight));

    _ctx->set_default_render_target(false);
    TextureArray arr = { rtColor, rtBlur2 };
    _ctx->set_samplers(ps->samplers());
    _ctx->set_shader_resources(arr, ShaderType::kPixelShader);

    _ctx->draw_indexed(technique->index_count(), 0, 0);
    _ctx->unset_shader_resource(0, 2, ShaderType::kPixelShader);
  }

  _ctx->end_frame();

  return true;
}