putting some actors into their own framebuffer for shadowing

This commit is contained in:
minjaesong
2024-11-24 13:10:08 +09:00
parent 89b12aabb4
commit 5cc7db8ecc
2 changed files with 55 additions and 3 deletions

View File

@@ -76,6 +76,9 @@ object IngameRenderer : Disposable {
private lateinit var fboEmissive: Float16FrameBuffer private lateinit var fboEmissive: Float16FrameBuffer
private lateinit var fboMixedOut: Float16FrameBuffer private lateinit var fboMixedOut: Float16FrameBuffer
private lateinit var fboRGBactorsBehind: Float16FrameBuffer // for small shadow eff; A channel is for glow effects so they don't get shadow effects
private lateinit var fboRGBactorsMiddle: Float16FrameBuffer // for large shadew eff; A channel is for glow effects so they don't get shadow effects
private lateinit var rgbTex: TextureRegion private lateinit var rgbTex: TextureRegion
private lateinit var aTex: TextureRegion private lateinit var aTex: TextureRegion
private lateinit var mixedOutTex: TextureRegion private lateinit var mixedOutTex: TextureRegion
@@ -498,9 +501,35 @@ object IngameRenderer : Disposable {
fboRGB_lightMixed0.inAction(null, null) { clearBuffer() } fboRGB_lightMixed0.inAction(null, null) { clearBuffer() }
fboRGB_lightMixed.inAction(null, null) { clearBuffer() } fboRGB_lightMixed.inAction(null, null) { clearBuffer() }
fboRGB.inAction(camera, batch) {
fboRGBactorsBehind.inAction(camera, batch) {
clearBuffer()
setCameraPosition(0f, 0f) setCameraPosition(0f, 0f)
batch.inUse {
batch.shader = shaderForActors
batch.color = Color.WHITE
moveCameraToWorldCoord()
actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) }
}
}
fboRGBactorsMiddle.inAction(camera, batch) {
clearBuffer()
setCameraPosition(0f, 0f)
batch.inUse {
batch.shader = shaderForActors
batch.color = Color.WHITE
moveCameraToWorldCoord()
actorsRenderMiddle?.forEach { it.drawBody(frameDelta, batch) }
}
}
fboRGB.inAction(camera, batch) {
setCameraPosition(0f, 0f)
BlocksDrawer.drawWall(batch.projectionMatrix, false) BlocksDrawer.drawWall(batch.projectionMatrix, false)
batch.inUse { batch.inUse {
@@ -508,7 +537,12 @@ object IngameRenderer : Disposable {
batch.color = Color.WHITE batch.color = Color.WHITE
moveCameraToWorldCoord() moveCameraToWorldCoord()
actorsRenderFarBehind?.forEach { it.drawBody(frameDelta, batch) } actorsRenderFarBehind?.forEach { it.drawBody(frameDelta, batch) }
actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) }
// actorsRenderBehind?.forEach { it.drawBody(frameDelta, batch) }
setCameraPosition(0f, 0f)
batch.drawFlipped(fboRGBactorsBehind.colorBufferTexture, 0f, 0f)
moveCameraToWorldCoord()
particlesContainer?.forEach { it.drawBody(frameDelta, batch) } particlesContainer?.forEach { it.drawBody(frameDelta, batch) }
} }
@@ -522,8 +556,12 @@ object IngameRenderer : Disposable {
///////////////// /////////////////
// draw actors // // draw actors //
///////////////// /////////////////
// moveCameraToWorldCoord()
// actorsRenderMiddle?.forEach { it.drawBody(frameDelta, batch) }
setCameraPosition(0f, 0f)
batch.drawFlipped(fboRGBactorsMiddle.colorBufferTexture, 0f, 0f)
moveCameraToWorldCoord() moveCameraToWorldCoord()
actorsRenderMiddle?.forEach { it.drawBody(frameDelta, batch) }
actorsRenderMidTop?.forEach { it.drawBody(frameDelta, batch) } actorsRenderMidTop?.forEach { it.drawBody(frameDelta, batch) }
player?.drawBody(frameDelta, batch) player?.drawBody(frameDelta, batch)
actorsRenderFront?.forEach { it.drawBody(frameDelta, batch) } actorsRenderFront?.forEach { it.drawBody(frameDelta, batch) }
@@ -1210,6 +1248,8 @@ object IngameRenderer : Disposable {
fboA_lightMixed = Float16FrameBuffer(width, height, false) fboA_lightMixed = Float16FrameBuffer(width, height, false)
fboEmissive = Float16FrameBuffer(width, height, false) fboEmissive = Float16FrameBuffer(width, height, false)
fboMixedOut = Float16FrameBuffer(width, height, false) fboMixedOut = Float16FrameBuffer(width, height, false)
fboRGBactorsBehind = Float16FrameBuffer(width, height, false)
fboRGBactorsMiddle = Float16FrameBuffer(width, height, false)
lightmapFbo = Float16FrameBuffer( lightmapFbo = Float16FrameBuffer(
LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.width * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(), LightmapRenderer.lightBuffer.height * LightmapRenderer.DRAW_TILE_SIZE.toInt(),
@@ -1272,6 +1312,8 @@ object IngameRenderer : Disposable {
if (::fboEmissive.isInitialized) fboEmissive.tryDispose() if (::fboEmissive.isInitialized) fboEmissive.tryDispose()
if (::fboMixedOut.isInitialized) fboMixedOut.tryDispose() if (::fboMixedOut.isInitialized) fboMixedOut.tryDispose()
if (::lightmapFbo.isInitialized) lightmapFbo.tryDispose() if (::lightmapFbo.isInitialized) lightmapFbo.tryDispose()
if (::fboRGBactorsBehind.isInitialized) fboRGBactorsBehind.tryDispose()
if (::fboRGBactorsMiddle.isInitialized) fboRGBactorsMiddle.tryDispose()
blurtex0.tryDispose() blurtex0.tryDispose()

View File

@@ -102,6 +102,16 @@ internal object ExportFBO : ConsoleCommand {
fun fboemissive(): FrameBuffer { fun fboemissive(): FrameBuffer {
return IngameRenderer.extortField<Float16FrameBuffer>("fboEmissive")!! return IngameRenderer.extortField<Float16FrameBuffer>("fboEmissive")!!
} }
@ExportFBOCmd("Framebuffer for render-behind actors used for creating shallow shadow effects")
fun fboergbactorsbehind(): FrameBuffer {
return IngameRenderer.extortField<Float16FrameBuffer>("fboRGBactorsBehind")!!
}
@ExportFBOCmd("Framebuffer for render-middle actors used for creating large shadow effects")
fun fboergbactorsmiddle(): FrameBuffer {
return IngameRenderer.extortField<Float16FrameBuffer>("fboRGBactorsMiddle")!!
}
} }
internal annotation class ExportFBOCmd(val description: String) internal annotation class ExportFBOCmd(val description: String)