More GPU shadows tests
This commit is contained in:
parent
bacda9dd97
commit
5458a4a60d
@ -127,7 +127,7 @@ class ClientWorld(
|
|||||||
client.pushScissorRect(x, client.viewportHeight - y, x2 - x, y - y2)
|
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) {
|
if (isScreenspaceRender) {
|
||||||
client.popScissorRect()
|
client.popScissorRect()
|
||||||
|
@ -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> {
|
private class GLStateGenericTracker<T>(private var value: T, private val callback: (T) -> Unit) : ReadWriteProperty<GLStateTracker, T> {
|
||||||
override fun getValue(thisRef: GLStateTracker, property: KProperty<*>): T {
|
override fun getValue(thisRef: GLStateTracker, property: KProperty<*>): T {
|
||||||
return value
|
return value
|
||||||
@ -248,6 +265,9 @@ class GLStateTracker {
|
|||||||
var blend by GLStateSwitchTracker(GL_BLEND)
|
var blend by GLStateSwitchTracker(GL_BLEND)
|
||||||
var scissor by GLStateSwitchTracker(GL_SCISSOR_TEST)
|
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)) {
|
var scissorRect by GLStateGenericTracker(ScissorRect(0, 0, 0, 0)) {
|
||||||
// require(it.x >= 0) { "Invalid X ${it.x}"}
|
// require(it.x >= 0) { "Invalid X ${it.x}"}
|
||||||
// require(it.y >= 0) { "Invalid Y ${it.y}"}
|
// require(it.y >= 0) { "Invalid Y ${it.y}"}
|
||||||
|
@ -87,6 +87,7 @@ class GLHardLightGeometryProgram(state: GLStateTracker) : GLInternalProgram(stat
|
|||||||
val transform = this["transform"]!!
|
val transform = this["transform"]!!
|
||||||
val localToWorldTransform = this["localToWorldTransform"]!!
|
val localToWorldTransform = this["localToWorldTransform"]!!
|
||||||
val lightPosition = this["lightPosition"]!!
|
val lightPosition = this["lightPosition"]!!
|
||||||
|
val lightPenetration = this["lightPenetration"]!!
|
||||||
|
|
||||||
val builder by lazy {
|
val builder by lazy {
|
||||||
StreamVertexBuilder(state, LightRenderer.SHADOW_FORMAT, GeometryType.QUADS_AS_LINES, 32)
|
StreamVertexBuilder(state, LightRenderer.SHADOW_FORMAT, GeometryType.QUADS_AS_LINES, 32)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package ru.dbotthepony.kstarbound.client.render
|
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_COLOR_BUFFER_BIT
|
||||||
|
import org.lwjgl.opengl.GL11.GL_FRONT
|
||||||
import org.lwjgl.opengl.GL11.GL_RGBA
|
import org.lwjgl.opengl.GL11.GL_RGBA
|
||||||
import org.lwjgl.opengl.GL11.glClear
|
import org.lwjgl.opengl.GL11.glClear
|
||||||
import ru.dbotthepony.kstarbound.client.gl.BlendFunc
|
import ru.dbotthepony.kstarbound.client.gl.BlendFunc
|
||||||
@ -139,6 +141,7 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
position: Vector2f,
|
position: Vector2f,
|
||||||
color: Color = Color.WHITE,
|
color: Color = Color.WHITE,
|
||||||
radius: Float = 10f,
|
radius: Float = 10f,
|
||||||
|
lightPenetration: Float = 0.1f,
|
||||||
stack: Matrix4fStack = state.matrixStack
|
stack: Matrix4fStack = state.matrixStack
|
||||||
) {
|
) {
|
||||||
state.ensureSameThread()
|
state.ensureSameThread()
|
||||||
@ -157,7 +160,7 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
|
|
||||||
// Геометрия
|
// Геометрия
|
||||||
val old = state.clearColor
|
val old = state.clearColor
|
||||||
state.clearColor = Color.BLACK
|
state.clearColor = CLEAR_COLOR_HARD
|
||||||
glClear(GL_COLOR_BUFFER_BIT)
|
glClear(GL_COLOR_BUFFER_BIT)
|
||||||
checkForGLError()
|
checkForGLError()
|
||||||
state.clearColor = old
|
state.clearColor = old
|
||||||
@ -165,8 +168,9 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
state.programs.hardLightGeometry.use()
|
state.programs.hardLightGeometry.use()
|
||||||
state.programs.hardLightGeometry.transform.set(stack.last)
|
state.programs.hardLightGeometry.transform.set(stack.last)
|
||||||
state.programs.hardLightGeometry.lightPosition.set(position)
|
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) {
|
for (renderer in geometry) {
|
||||||
renderer.renderHardGeometry(this, position, radius, stack, state.programs.hardLightGeometry)
|
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.quad(position.x - radius, position.y - radius, position.x + radius, position.y + radius, QuadTransformers.uv())
|
||||||
builder.upload()
|
builder.upload()
|
||||||
|
|
||||||
state.blendFunc = BLEND_MODE
|
state.blendFunc = BLEND_MODE_INV
|
||||||
builder.draw()
|
builder.draw()
|
||||||
} finally {
|
} finally {
|
||||||
state.blendFunc = oldFunc
|
state.blendFunc = oldFunc
|
||||||
@ -229,10 +233,15 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
|
|
||||||
state.blendFunc = BlendFunc.ONLY_BLEND_ALPHA
|
state.blendFunc = BlendFunc.ONLY_BLEND_ALPHA
|
||||||
|
|
||||||
|
state.cull = true
|
||||||
|
state.cullMode = GL_BACK
|
||||||
|
|
||||||
for (renderer in geometry) {
|
for (renderer in geometry) {
|
||||||
renderer.renderSoftGeometry(this, position, radius, stack, state.programs.softLightGeometry)
|
renderer.renderSoftGeometry(this, position, radius, stack, state.programs.softLightGeometry)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.cull = false
|
||||||
|
|
||||||
state.programs.light.use()
|
state.programs.light.use()
|
||||||
state.programs.light.transform.set(stack.last)
|
state.programs.light.transform.set(stack.last)
|
||||||
state.programs.light.baselineColor.set(color)
|
state.programs.light.baselineColor.set(color)
|
||||||
@ -247,6 +256,7 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
state.blendFunc = BLEND_MODE_SOFT
|
state.blendFunc = BLEND_MODE_SOFT
|
||||||
builder.draw()
|
builder.draw()
|
||||||
} finally {
|
} finally {
|
||||||
|
state.cull = false
|
||||||
state.blendFunc = oldFunc
|
state.blendFunc = oldFunc
|
||||||
framebufferRender.unbind()
|
framebufferRender.unbind()
|
||||||
}
|
}
|
||||||
@ -275,6 +285,7 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
val CLEAR_COLOR_HARD = Color(0f, 0f, 0f, 0f)
|
||||||
val CLEAR_COLOR_SOFT = Color(0f, 0f, 0f, 0f)
|
val CLEAR_COLOR_SOFT = Color(0f, 0f, 0f, 0f)
|
||||||
|
|
||||||
val BLEND_MODE = BlendFunc(
|
val BLEND_MODE = BlendFunc(
|
||||||
@ -284,6 +295,13 @@ class LightRenderer(val state: GLStateTracker) {
|
|||||||
BlendFunc.Func.ONE,
|
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(
|
val BLEND_MODE_SOFT = BlendFunc(
|
||||||
BlendFunc.Func.ONE_MINUS_DST_ALPHA,
|
BlendFunc.Func.ONE_MINUS_DST_ALPHA,
|
||||||
BlendFunc.Func.ZERO,
|
BlendFunc.Func.ZERO,
|
||||||
|
@ -5,6 +5,8 @@ uniform vec2 lightPosition;
|
|||||||
|
|
||||||
out vec4 resultColor;
|
out vec4 resultColor;
|
||||||
|
|
||||||
|
uniform float lightPenetration;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
resultColor = vec4(0.0, 0.0, 0.0, 0.0);
|
resultColor = vec4(0.0, 0.0, 0.0, lightPenetration);
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,11 @@ layout (location = 0) in vec2 vertexPos;
|
|||||||
uniform mat4 transform;
|
uniform mat4 transform;
|
||||||
uniform mat4 localToWorldTransform;
|
uniform mat4 localToWorldTransform;
|
||||||
|
|
||||||
|
uniform float lightPenetration;
|
||||||
|
|
||||||
out vec2 originalPos;
|
out vec2 originalPos;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
gl_Position = transform * localToWorldTransform * vec4(vertexPos, 0.0, 1.0);
|
|
||||||
originalPos = (localToWorldTransform * vec4(vertexPos, 0.0, 1.0)).xy;
|
originalPos = (localToWorldTransform * vec4(vertexPos, 0.0, 1.0)).xy;
|
||||||
|
gl_Position = transform * localToWorldTransform * vec4(vertexPos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user