More GPU shadows tests

This commit is contained in:
DBotThePony 2022-09-16 13:27:22 +07:00
parent bacda9dd97
commit 5458a4a60d
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 49 additions and 6 deletions

View File

@ -127,7 +127,7 @@ class ClientWorld(
client.pushScissorRect(x, client.viewportHeight - y, x2 - x, y - y2)
}
client.lightRenderer.renderSoftLight(lightPosition, color, radius = 20f, innerRadius = 1f)
client.lightRenderer.renderHardLight(lightPosition, color, radius = 20f)
if (isScreenspaceRender) {
client.popScissorRect()

View File

@ -52,6 +52,23 @@ private class GLStateSwitchTracker(private val enum: Int, private var value: Boo
}
}
private class GLStateFuncTracker(private val glFunc: (Int) -> Unit, private var value: Int) {
operator fun getValue(glStateTracker: GLStateTracker, property: KProperty<*>): Int {
return value
}
operator fun setValue(glStateTracker: GLStateTracker, property: KProperty<*>, value: Int) {
glStateTracker.ensureSameThread()
if (value == this.value)
return
glFunc.invoke(value)
checkForGLError()
this.value = value
}
}
private class GLStateGenericTracker<T>(private var value: T, private val callback: (T) -> Unit) : ReadWriteProperty<GLStateTracker, T> {
override fun getValue(thisRef: GLStateTracker, property: KProperty<*>): T {
return value
@ -248,6 +265,9 @@ class GLStateTracker {
var blend by GLStateSwitchTracker(GL_BLEND)
var scissor by GLStateSwitchTracker(GL_SCISSOR_TEST)
var cull by GLStateSwitchTracker(GL_CULL_FACE)
var cullMode by GLStateFuncTracker(::glCullFace, GL_BACK)
var scissorRect by GLStateGenericTracker(ScissorRect(0, 0, 0, 0)) {
// require(it.x >= 0) { "Invalid X ${it.x}"}
// require(it.y >= 0) { "Invalid Y ${it.y}"}

View File

@ -87,6 +87,7 @@ class GLHardLightGeometryProgram(state: GLStateTracker) : GLInternalProgram(stat
val transform = this["transform"]!!
val localToWorldTransform = this["localToWorldTransform"]!!
val lightPosition = this["lightPosition"]!!
val lightPenetration = this["lightPenetration"]!!
val builder by lazy {
StreamVertexBuilder(state, LightRenderer.SHADOW_FORMAT, GeometryType.QUADS_AS_LINES, 32)

View File

@ -1,6 +1,8 @@
package ru.dbotthepony.kstarbound.client.render
import org.lwjgl.opengl.GL11.GL_BACK
import org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT
import org.lwjgl.opengl.GL11.GL_FRONT
import org.lwjgl.opengl.GL11.GL_RGBA
import org.lwjgl.opengl.GL11.glClear
import ru.dbotthepony.kstarbound.client.gl.BlendFunc
@ -139,6 +141,7 @@ class LightRenderer(val state: GLStateTracker) {
position: Vector2f,
color: Color = Color.WHITE,
radius: Float = 10f,
lightPenetration: Float = 0.1f,
stack: Matrix4fStack = state.matrixStack
) {
state.ensureSameThread()
@ -157,7 +160,7 @@ class LightRenderer(val state: GLStateTracker) {
// Геометрия
val old = state.clearColor
state.clearColor = Color.BLACK
state.clearColor = CLEAR_COLOR_HARD
glClear(GL_COLOR_BUFFER_BIT)
checkForGLError()
state.clearColor = old
@ -165,8 +168,9 @@ class LightRenderer(val state: GLStateTracker) {
state.programs.hardLightGeometry.use()
state.programs.hardLightGeometry.transform.set(stack.last)
state.programs.hardLightGeometry.lightPosition.set(position)
state.programs.hardLightGeometry.lightPenetration.set(1f - lightPenetration)
state.blendFunc = BlendFunc.ONLY_ALPHA
state.blendFunc = BlendFunc.ONLY_BLEND_ALPHA
for (renderer in geometry) {
renderer.renderHardGeometry(this, position, radius, stack, state.programs.hardLightGeometry)
@ -183,7 +187,7 @@ class LightRenderer(val state: GLStateTracker) {
builder.quad(position.x - radius, position.y - radius, position.x + radius, position.y + radius, QuadTransformers.uv())
builder.upload()
state.blendFunc = BLEND_MODE
state.blendFunc = BLEND_MODE_INV
builder.draw()
} finally {
state.blendFunc = oldFunc
@ -229,10 +233,15 @@ class LightRenderer(val state: GLStateTracker) {
state.blendFunc = BlendFunc.ONLY_BLEND_ALPHA
state.cull = true
state.cullMode = GL_BACK
for (renderer in geometry) {
renderer.renderSoftGeometry(this, position, radius, stack, state.programs.softLightGeometry)
}
state.cull = false
state.programs.light.use()
state.programs.light.transform.set(stack.last)
state.programs.light.baselineColor.set(color)
@ -247,6 +256,7 @@ class LightRenderer(val state: GLStateTracker) {
state.blendFunc = BLEND_MODE_SOFT
builder.draw()
} finally {
state.cull = false
state.blendFunc = oldFunc
framebufferRender.unbind()
}
@ -275,6 +285,7 @@ class LightRenderer(val state: GLStateTracker) {
}
companion object {
val CLEAR_COLOR_HARD = Color(0f, 0f, 0f, 0f)
val CLEAR_COLOR_SOFT = Color(0f, 0f, 0f, 0f)
val BLEND_MODE = BlendFunc(
@ -284,6 +295,13 @@ class LightRenderer(val state: GLStateTracker) {
BlendFunc.Func.ONE,
)
val BLEND_MODE_INV = BlendFunc(
BlendFunc.Func.ONE_MINUS_DST_ALPHA,
BlendFunc.Func.ZERO,
BlendFunc.Func.ZERO,
BlendFunc.Func.ONE,
)
val BLEND_MODE_SOFT = BlendFunc(
BlendFunc.Func.ONE_MINUS_DST_ALPHA,
BlendFunc.Func.ZERO,

View File

@ -5,6 +5,8 @@ uniform vec2 lightPosition;
out vec4 resultColor;
uniform float lightPenetration;
void main() {
resultColor = vec4(0.0, 0.0, 0.0, 0.0);
resultColor = vec4(0.0, 0.0, 0.0, lightPenetration);
}

View File

@ -6,9 +6,11 @@ layout (location = 0) in vec2 vertexPos;
uniform mat4 transform;
uniform mat4 localToWorldTransform;
uniform float lightPenetration;
out vec2 originalPos;
void main() {
gl_Position = transform * localToWorldTransform * vec4(vertexPos, 0.0, 1.0);
originalPos = (localToWorldTransform * vec4(vertexPos, 0.0, 1.0)).xy;
gl_Position = transform * localToWorldTransform * vec4(vertexPos, 0.0, 1.0);
}