2
0

MainRenderer.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "anki/renderer/MainRenderer.h"
  2. #include "anki/core/Logger.h"
  3. #include "anki/renderer/Deformer.h"
  4. #include "anki/util/File.h"
  5. #include "anki/core/Counters.h"
  6. #include <cstdlib>
  7. #include <cstdio>
  8. #define glewGetContext() (&glContext)
  9. namespace anki {
  10. //==============================================================================
  11. MainRenderer::~MainRenderer()
  12. {}
  13. //==============================================================================
  14. void MainRenderer::init(const RendererInitializer& initializer_)
  15. {
  16. ANKI_LOGI("Initializing main renderer...");
  17. RendererInitializer initializer = initializer_;
  18. initializer.set("offscreen", false);
  19. initializer.get("width") *= initializer.get("renderingQuality");
  20. initializer.get("height") *= initializer.get("renderingQuality");
  21. initGl();
  22. blitProg.load("shaders/Final.glsl");
  23. Renderer::init(initializer);
  24. deformer.reset(new Deformer);
  25. ANKI_LOGI("Main renderer initialized. Rendering size %dx%d",
  26. getWidth(), getHeight());
  27. }
  28. //==============================================================================
  29. void MainRenderer::render(SceneGraph& scene)
  30. {
  31. ANKI_COUNTER_START_TIMER(C_MAIN_RENDERER_TIME);
  32. Renderer::render(scene);
  33. Bool notDrawnToDefault =
  34. getRenderingQuality() != 1.0 || getDbg().getEnabled();
  35. if(notDrawnToDefault)
  36. {
  37. Fbo::bindDefault(true, Fbo::ALL_TARGETS); // Bind the window framebuffer
  38. GlStateSingleton::get().setViewport(
  39. 0, 0, getWindowWidth(), getWindowHeight());
  40. GlStateSingleton::get().disable(GL_DEPTH_TEST);
  41. GlStateSingleton::get().disable(GL_BLEND);
  42. blitProg->bind();
  43. Texture* fai;
  44. if(getPps().getEnabled())
  45. {
  46. fai = &getPps().getFai();
  47. }
  48. else
  49. {
  50. fai = &getIs().getFai();
  51. }
  52. //fai = &getPps().getHdr().getFai();
  53. fai->setFiltering(Texture::TFT_LINEAR);
  54. blitProg->findUniformVariable("rasterImage").set(*fai);
  55. drawQuad();
  56. }
  57. ANKI_COUNTER_STOP_TIMER_INC(C_MAIN_RENDERER_TIME);
  58. }
  59. //==============================================================================
  60. void MainRenderer::initGl()
  61. {
  62. // Ignore the first error
  63. glGetError();
  64. // print GL info
  65. ANKI_LOGI("OpenGL info: OGL %s, GLSL %s",
  66. reinterpret_cast<const char*>(glGetString(GL_VERSION)),
  67. reinterpret_cast<const char*>(
  68. glGetString(GL_SHADING_LANGUAGE_VERSION)));
  69. // get max texture units
  70. GlStateSingleton::get().setClearColor(Vec4(1.0, 0.0, 1.0, 1.0));
  71. GlStateSingleton::get().setClearDepthValue(1.0);
  72. GlStateSingleton::get().setClearStencilValue(0);
  73. // CullFace is always on
  74. glCullFace(GL_BACK);
  75. GlStateSingleton::get().enable(GL_CULL_FACE);
  76. // defaults
  77. GlStateSingleton::get().disable(GL_BLEND);
  78. GlStateSingleton::get().disable(GL_STENCIL_TEST);
  79. //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  80. GlStateSingleton::get().setDepthMaskEnabled(true);
  81. GlStateSingleton::get().setDepthFunc(GL_LESS);
  82. //glEnable(GL_FRAMEBUFFER_SRGB);
  83. glDisable(GL_DITHER);
  84. // Check for error
  85. ANKI_CHECK_GL_ERROR();
  86. }
  87. //==============================================================================
  88. void MainRenderer::takeScreenshotTga(const char* filename)
  89. {
  90. // open file and check
  91. File fs;
  92. try
  93. {
  94. fs.open(filename, File::OF_WRITE | File::OF_BINARY);
  95. }
  96. catch(const std::exception& e)
  97. {
  98. throw ANKI_EXCEPTION("Cannot write screenshot file") << e;
  99. }
  100. // write headers
  101. static const U8 tgaHeaderUncompressed[12] = {
  102. 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  103. Array<U8, 6> header;
  104. header[1] = getWidth() / 256;
  105. header[0] = getWidth() % 256;
  106. header[3] = getHeight() / 256;
  107. header[2] = getHeight() % 256;
  108. header[4] = 24;
  109. header[5] = 0;
  110. fs.write((char*)tgaHeaderUncompressed, sizeof(tgaHeaderUncompressed));
  111. fs.write((char*)&header[0], sizeof(header));
  112. // Create the buffers
  113. U outBufferSize = getWidth() * getHeight() * 3;
  114. Vector<U8> outBuffer;
  115. outBuffer.resize(outBufferSize);
  116. U rgbaBufferSize = getWidth() * getHeight() * 4;
  117. Vector<U8> rgbaBuffer;
  118. rgbaBuffer.resize(rgbaBufferSize);
  119. // Read pixels
  120. glReadPixels(0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
  121. &rgbaBuffer[0]);
  122. U j = 0;
  123. for(U i = 0; i < outBufferSize; i += 3)
  124. {
  125. outBuffer[i] = rgbaBuffer[j + 2];
  126. outBuffer[i + 1] = rgbaBuffer[j + 1];
  127. outBuffer[i + 2] = rgbaBuffer[j];
  128. j += 4;
  129. }
  130. fs.write((char*)&outBuffer[0], outBufferSize);
  131. // end
  132. ANKI_CHECK_GL_ERROR();
  133. }
  134. //==============================================================================
  135. void MainRenderer::takeScreenshot(const char* filename)
  136. {
  137. std::string ext = File::getFileExtension(filename);
  138. // exec from this extension
  139. if(ext == "tga")
  140. {
  141. takeScreenshotTga(filename);
  142. }
  143. else
  144. {
  145. throw ANKI_EXCEPTION("Unsupported file extension");
  146. }
  147. ANKI_LOGI("Screenshot %s saved", filename);
  148. }
  149. } // end namespace anki