Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
procedure TMultiSampleFBO.Bind; begin inherited; glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Container); glPushAttrib(GL_VIEWPORT_BIT); glViewport(0,0,Width,Height); glClearColor(1,0,0,1); glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); end; function TMultiSampleFBO.Generate(Attachments: Integer; const MRTcount, Texis32BitIdx: Integer): Boolean; var I: Integer; FBOState: TuInt32; begin setLength(tex, Attachments); setLength(ColorBuffers, Attachments); // Attach them glGenFramebuffersEXT(1, @Container); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Container); // Multi sample colorbuffer for I := 0 to high(tex) do begin glGenRenderbuffersEXT(1, @colorBuffers[i]); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, colorBuffers[i]); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_RGBA, width, height); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_RENDERBUFFER_EXT, colorBuffers[i]); end; // Multi sample depth buffer glGenRenderbuffersEXT(1, @depthBufferID); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBufferID); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_DEPTH_COMPONENT, width, height); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBufferID); FBOState:= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); If FBOState = GL_FRAMEBUFFER_COMPLETE_EXT Then Result:= TRUE Else Result:= FALSE; if result = false then ShowmessagE('FBO Incomplete'); //Final FBO glGenFramebuffersEXT(1, @finalFBO); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FinalFBO); // Final framebuffer color buffer for I := 0 to high(tex) do begin glGenTextures(1, @tex[i]); glBindTexture(GL_TEXTURE_2D, tex[i]); glTexImage2D(GL_TEXTURE_2D, 0, // Set properties GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NIL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, tex[0], 0); end; FBOState:= glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); If FBOState = GL_FRAMEBUFFER_COMPLETE_EXT Then Result:= TRUE Else Result:= FALSE; if result = false then ShowmessagE('FBO Incomplete'); glBindTexture(GL_TEXTURE_2D, 0); end; procedure TMultiSampleFBO.Unbind; var I: Integer; begin for I := 0 to high(tex) do begin glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, Container); glReadBuffer(GL_COLOR_ATTACHMENT0_EXT + i); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, finalFBO); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT + i); glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); end; glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, 0 ); glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 ); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); inherited; glPopAttrib; end; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
void GLFramebufferObject::createFramebufferMultisample( GLuint TexID, const dim::size2di &Size, GLenum GLDimension, GLenum GLInternalFormat, s32 Samples, const std::vector<Texture*> &MultiRenderTargets, const EPixelFormats Format, const ETextureDimensions DimensionType, const ECubeMapDirections CubeMapFace, GLuint DepthBufferSourceID) { if (!__spVideoDriver->RenderQuery_[RenderSystem::RENDERQUERY_RENDERTARGET] || !__spVideoDriver->RenderQuery_[RenderSystem::RENDERQUERY_MULTISAMPLE_RENDERTARGET] || !TexID || Samples < 0) { return; } MSColorBufferID_.resize(MultiRenderTargets.size() + 1); math::Clamp(Samples, 0, GL_MAX_SAMPLES); /* Create multi-sample color buffer */ if (!MSColorBufferID_.empty()) { glGenRenderbuffersEXT(MSColorBufferID_.size(), &MSColorBufferID_[0]); for (s32 i = 0; i < MSColorBufferID_.size(); ++i) { if (i) GLInternalFormat = static_cast<GLTextureBase*>(MultiRenderTargets[i - 1])->GLInternalFormat_; glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, MSColorBufferID_[i]); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, Samples, GLInternalFormat, Size.Width, Size.Height); } } /* Create multi-sample depth buffer */ if (!DepthBufferSourceID) { glGenRenderbuffersEXT(1, &DepthBufferID_); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthBufferID_); glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, Samples, GL_DEPTH_COMPONENT24, Size.Width, Size.Height); } /* Create multi-sample frame buffer */ glGenFramebuffersEXT(1, &MSFrameBufferID_); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MSFrameBufferID_); /* Bind color- and depth buffers */ GLenum Attachment = GL_COLOR_ATTACHMENT0_EXT; foreach (GLuint Id, MSColorBufferID_) glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, Attachment++, GL_RENDERBUFFER_EXT, Id); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, DepthBufferSourceID ? DepthBufferSourceID : DepthBufferID_ ); /* Create frame buffer */ glGenFramebuffersEXT(1, &FrameBufferID_); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FrameBufferID_); /* Attach frame buffer texture */ attachFramebufferTexture(TexID, GLDimension, Format, DimensionType, CubeMapFace); } void GLFramebufferObject::blitFramebufferMultisample(const dim::size2di &Size, u32 RTCount) { if (!__spVideoDriver->RenderQuery_[RenderSystem::RENDERQUERY_RENDERTARGET] || !__spVideoDriver->RenderQuery_[RenderSystem::RENDERQUERY_MULTISAMPLE_RENDERTARGET]) { return; } /* Blit framebuffer */ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, MSFrameBufferID_); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, FrameBufferID_); for (s32 i = 0; i <= RTCount; ++i) { glReadBuffer(GL_COLOR_ATTACHMENT0_EXT + i); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT + i); glBlitFramebufferEXT(0, 0, Size.Width, Size.Height, 0, 0, Size.Width, Size.Height, GL_COLOR_BUFFER_BIT, GL_NEAREST); } glReadBuffer(GL_NONE); glDrawBuffer(GL_NONE); /* Unbind multisample framebuffer objects */ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0); } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 |
/* Activate draw buffers multi-render-targets */ if (isMultiSampled()) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MSFrameBufferID_); if (MultiRTBuffers.empty()) glDrawBuffer(GL_NONE); else glDrawBuffersARB(MultiRTBuffers.size(), &MultiRTBuffers[0]); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); |
Werbeanzeige