Guest User

Untitled

a guest
May 13th, 2014
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. GBuffer::GBuffer() {
  2.  
  3. }
  4.  
  5. GBuffer::~GBuffer() {
  6. glDeleteTextures(2, &mTextures[0]);
  7. glDeleteTextures(1, &mDepthBuffer);
  8. glDeleteFramebuffers(1, &mFrameBuffer);
  9. }
  10.  
  11. bool GBuffer::create(std::uint32_t width, std::uint32_t height) {
  12. mWidth = width;
  13. mHeight = height;
  14.  
  15. mRenderState = RenderState(mWidth, mHeight);
  16.  
  17. return initialize();
  18. }
  19.  
  20. void GBuffer::readBind() {
  21. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  22.  
  23. glActiveTexture(GL_TEXTURE0);
  24. glBindTexture(GL_TEXTURE_2D, mTextures[TEX_DIFFUSE]);
  25.  
  26. glActiveTexture(GL_TEXTURE1);
  27. glBindTexture(GL_TEXTURE_2D, mTextures[TEX_NORMALS]);
  28. }
  29.  
  30. void GBuffer::readUnbind() {
  31. //glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
  32. }
  33.  
  34. void GBuffer::writeBind(RenderContext *context) {
  35. glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFrameBuffer);
  36. context->push(&mRenderState);
  37. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  38. }
  39.  
  40. void GBuffer::writeUnbind(RenderContext *context) {
  41. context->pop();
  42. glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
  43. }
  44.  
  45. RenderState* GBuffer::state() {
  46. return &mRenderState;
  47. }
  48.  
  49. bool GBuffer::initialize() {
  50. // Create textures
  51. glGenTextures(2, &mTextures[0]);
  52. glGenTextures(1, &mDepthBuffer);
  53.  
  54. // Setup diffuse and normal maps
  55. for(int i = 0; i < 2; i++) {
  56. glBindTexture(GL_TEXTURE_2D, mTextures[0]);
  57.  
  58. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  59. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  60. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  61. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  62.  
  63. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mWidth, mHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
  64. }
  65.  
  66. // Setup depth buffer
  67. glBindTexture(GL_TEXTURE_2D, mDepthBuffer);
  68.  
  69. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  70. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  71. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  72. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  73. glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
  74. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
  75. GL_COMPARE_R_TO_TEXTURE);
  76. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
  77.  
  78. glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, mWidth, mHeight, 0,
  79. GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
  80.  
  81. glBindTexture(GL_TEXTURE_2D, 0);
  82.  
  83. // Create the framebuffer
  84. glGenFramebuffers(1, &mFrameBuffer);
  85. glBindFramebuffer(GL_FRAMEBUFFER, mFrameBuffer);
  86.  
  87. glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTextures[0],0);
  88. glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, mTextures[1],0);
  89. glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mDepthBuffer, 0);
  90.  
  91. GLenum attachments[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
  92. glDrawBuffers(2, &attachments[0]);
  93.  
  94. GLenum err = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  95. if(err != GL_FRAMEBUFFER_COMPLETE) {
  96. LOG_ERROR(mLog, "Failed to create GBuffer: " + StringParser::intToString(err));
  97. return false;
  98. }
  99.  
  100. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  101.  
  102. return true;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment