mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-11-10 12:34:11 +01:00
Debugging broken overlay/lighting
- Break instance overlay/light back into 2 layout elements - Write light directly as an int - Make light a short backed float element - Clamp overlay coords in common.frag to avoid explosions - Explosions: integer vertex attributes sometimes blow up to massive sizes, greater than Short.MAX_VALUE which should not be possible. - Reorganize some texture/uniform binding code
This commit is contained in:
parent
df83277692
commit
68daac8659
@ -4,9 +4,9 @@ import java.util.List;
|
|||||||
|
|
||||||
import com.jozufozu.flywheel.Flywheel;
|
import com.jozufozu.flywheel.Flywheel;
|
||||||
import com.jozufozu.flywheel.api.layout.FloatRepr;
|
import com.jozufozu.flywheel.api.layout.FloatRepr;
|
||||||
|
import com.jozufozu.flywheel.api.layout.IntegerRepr;
|
||||||
import com.jozufozu.flywheel.api.layout.Layout;
|
import com.jozufozu.flywheel.api.layout.Layout;
|
||||||
import com.jozufozu.flywheel.api.layout.LayoutBuilder;
|
import com.jozufozu.flywheel.api.layout.LayoutBuilder;
|
||||||
import com.jozufozu.flywheel.api.layout.UnsignedIntegerRepr;
|
|
||||||
import com.jozufozu.flywheel.api.vertex.VertexView;
|
import com.jozufozu.flywheel.api.vertex.VertexView;
|
||||||
import com.jozufozu.flywheel.backend.engine.LayoutAttributes;
|
import com.jozufozu.flywheel.backend.engine.LayoutAttributes;
|
||||||
import com.jozufozu.flywheel.backend.gl.array.VertexAttribute;
|
import com.jozufozu.flywheel.backend.gl.array.VertexAttribute;
|
||||||
@ -19,7 +19,7 @@ public final class InternalVertex {
|
|||||||
.vector("position", FloatRepr.FLOAT, 3)
|
.vector("position", FloatRepr.FLOAT, 3)
|
||||||
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
|
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
|
||||||
.vector("tex", FloatRepr.FLOAT, 2)
|
.vector("tex", FloatRepr.FLOAT, 2)
|
||||||
.vector("overlay_light", UnsignedIntegerRepr.UNSIGNED_SHORT, 4)
|
.vector("overlay_light", IntegerRepr.SHORT, 4)
|
||||||
.vector("normal", FloatRepr.NORMALIZED_BYTE, 3)
|
.vector("normal", FloatRepr.NORMALIZED_BYTE, 3)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@ -207,12 +207,13 @@ public class MeshPool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setup(GlVertexArray vao) {
|
public void setup(GlVertexArray vao) {
|
||||||
if (boundTo.add(vao)) {
|
if (!boundTo.add(vao)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
MeshPool.this.indexPool.bind(vao);
|
MeshPool.this.indexPool.bind(vao);
|
||||||
vao.bindVertexBuffer(0, MeshPool.this.vbo.handle(), byteIndex, InternalVertex.STRIDE);
|
vao.bindVertexBuffer(0, MeshPool.this.vbo.handle(), byteIndex, InternalVertex.STRIDE);
|
||||||
vao.bindAttributes(0, 0, InternalVertex.ATTRIBUTES);
|
vao.bindAttributes(0, 0, InternalVertex.ATTRIBUTES);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void acquire() {
|
public void acquire() {
|
||||||
referenceCount++;
|
referenceCount++;
|
||||||
|
@ -64,6 +64,7 @@ public class InstancingEngine extends AbstractEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try (var state = GlStateTracker.getRestoreState()) {
|
try (var state = GlStateTracker.getRestoreState()) {
|
||||||
|
Uniforms.bindForDraw();
|
||||||
render(drawSet);
|
render(drawSet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +105,6 @@ public class InstancingEngine extends AbstractEngine {
|
|||||||
var program = programs.get(shader.instanceType(), context.contextShader());
|
var program = programs.get(shader.instanceType(), context.contextShader());
|
||||||
program.bind();
|
program.bind();
|
||||||
|
|
||||||
Uniforms.bindForDraw();
|
|
||||||
uploadMaterialUniform(program, material);
|
uploadMaterialUniform(program, material);
|
||||||
|
|
||||||
context.prepare(material, program, textures);
|
context.prepare(material, program, textures);
|
||||||
|
@ -48,14 +48,15 @@ public class TextureBinder {
|
|||||||
|
|
||||||
public static void bindLightAndOverlay() {
|
public static void bindLightAndOverlay() {
|
||||||
var gameRenderer = Minecraft.getInstance().gameRenderer;
|
var gameRenderer = Minecraft.getInstance().gameRenderer;
|
||||||
gameRenderer.overlayTexture()
|
|
||||||
.setupOverlayColor();
|
|
||||||
gameRenderer.lightTexture()
|
|
||||||
.turnOnLightLayer();
|
|
||||||
|
|
||||||
GlTextureUnit.T1.makeActive();
|
GlTextureUnit.T1.makeActive();
|
||||||
|
gameRenderer.overlayTexture()
|
||||||
|
.setupOverlayColor();
|
||||||
RenderSystem.bindTexture(RenderSystem.getShaderTexture(1));
|
RenderSystem.bindTexture(RenderSystem.getShaderTexture(1));
|
||||||
|
|
||||||
GlTextureUnit.T2.makeActive();
|
GlTextureUnit.T2.makeActive();
|
||||||
|
gameRenderer.lightTexture()
|
||||||
|
.turnOnLightLayer();
|
||||||
RenderSystem.bindTexture(RenderSystem.getShaderTexture(2));
|
RenderSystem.bindTexture(RenderSystem.getShaderTexture(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,8 @@ public final class InstanceTypes {
|
|||||||
public static final InstanceType<TransformedInstance> TRANSFORMED = SimpleInstanceType.builder(TransformedInstance::new)
|
public static final InstanceType<TransformedInstance> TRANSFORMED = SimpleInstanceType.builder(TransformedInstance::new)
|
||||||
.layout(LayoutBuilder.create()
|
.layout(LayoutBuilder.create()
|
||||||
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
|
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
|
||||||
.vector("overlay_light", IntegerRepr.SHORT, 4)
|
.vector("overlay", IntegerRepr.SHORT, 2)
|
||||||
|
.vector("light", FloatRepr.UNSIGNED_SHORT, 2)
|
||||||
.matrix("pose", FloatRepr.FLOAT, 4)
|
.matrix("pose", FloatRepr.FLOAT, 4)
|
||||||
.matrix("normal", FloatRepr.FLOAT, 3)
|
.matrix("normal", FloatRepr.FLOAT, 3)
|
||||||
.build())
|
.build())
|
||||||
@ -24,8 +25,7 @@ public final class InstanceTypes {
|
|||||||
MemoryUtil.memPutByte(ptr + 2, instance.b);
|
MemoryUtil.memPutByte(ptr + 2, instance.b);
|
||||||
MemoryUtil.memPutByte(ptr + 3, instance.a);
|
MemoryUtil.memPutByte(ptr + 3, instance.a);
|
||||||
MemoryUtil.memPutInt(ptr + 4, instance.overlay);
|
MemoryUtil.memPutInt(ptr + 4, instance.overlay);
|
||||||
MemoryUtil.memPutShort(ptr + 8, instance.blockLight);
|
MemoryUtil.memPutInt(ptr + 8, (int) instance.blockLight | (int) instance.skyLight << 16);
|
||||||
MemoryUtil.memPutShort(ptr + 10, instance.skyLight);
|
|
||||||
MatrixMath.writeUnsafe(instance.model, ptr + 12);
|
MatrixMath.writeUnsafe(instance.model, ptr + 12);
|
||||||
MatrixMath.writeUnsafe(instance.normal, ptr + 76);
|
MatrixMath.writeUnsafe(instance.normal, ptr + 76);
|
||||||
})
|
})
|
||||||
@ -36,7 +36,8 @@ public final class InstanceTypes {
|
|||||||
public static final InstanceType<OrientedInstance> ORIENTED = SimpleInstanceType.builder(OrientedInstance::new)
|
public static final InstanceType<OrientedInstance> ORIENTED = SimpleInstanceType.builder(OrientedInstance::new)
|
||||||
.layout(LayoutBuilder.create()
|
.layout(LayoutBuilder.create()
|
||||||
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
|
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
|
||||||
.vector("overlay_light", IntegerRepr.SHORT, 4)
|
.vector("overlay", IntegerRepr.SHORT, 2)
|
||||||
|
.vector("light", FloatRepr.UNSIGNED_SHORT, 2)
|
||||||
.vector("position", FloatRepr.FLOAT, 3)
|
.vector("position", FloatRepr.FLOAT, 3)
|
||||||
.vector("pivot", FloatRepr.FLOAT, 3)
|
.vector("pivot", FloatRepr.FLOAT, 3)
|
||||||
.vector("rotation", FloatRepr.FLOAT, 4)
|
.vector("rotation", FloatRepr.FLOAT, 4)
|
||||||
@ -47,8 +48,7 @@ public final class InstanceTypes {
|
|||||||
MemoryUtil.memPutByte(ptr + 2, instance.b);
|
MemoryUtil.memPutByte(ptr + 2, instance.b);
|
||||||
MemoryUtil.memPutByte(ptr + 3, instance.a);
|
MemoryUtil.memPutByte(ptr + 3, instance.a);
|
||||||
MemoryUtil.memPutInt(ptr + 4, instance.overlay);
|
MemoryUtil.memPutInt(ptr + 4, instance.overlay);
|
||||||
MemoryUtil.memPutShort(ptr + 8, instance.blockLight);
|
MemoryUtil.memPutInt(ptr + 8, (int) instance.blockLight | (int) instance.skyLight << 16);
|
||||||
MemoryUtil.memPutShort(ptr + 10, instance.skyLight);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 12, instance.posX);
|
MemoryUtil.memPutFloat(ptr + 12, instance.posX);
|
||||||
MemoryUtil.memPutFloat(ptr + 16, instance.posY);
|
MemoryUtil.memPutFloat(ptr + 16, instance.posY);
|
||||||
MemoryUtil.memPutFloat(ptr + 20, instance.posZ);
|
MemoryUtil.memPutFloat(ptr + 20, instance.posZ);
|
||||||
|
@ -4,6 +4,6 @@ void flw_instanceVertex(in FlwInstance i) {
|
|||||||
flw_vertexPos = vec4(rotateByQuaternion(flw_vertexPos.xyz - i.pivot, i.rotation) + i.pivot + i.position, 1.0);
|
flw_vertexPos = vec4(rotateByQuaternion(flw_vertexPos.xyz - i.pivot, i.rotation) + i.pivot + i.position, 1.0);
|
||||||
flw_vertexNormal = rotateByQuaternion(flw_vertexNormal, i.rotation);
|
flw_vertexNormal = rotateByQuaternion(flw_vertexNormal, i.rotation);
|
||||||
flw_vertexColor = i.color;
|
flw_vertexColor = i.color;
|
||||||
flw_vertexOverlay = i.overlay_light.xy;
|
flw_vertexOverlay = i.overlay;
|
||||||
flw_vertexLight = i.overlay_light.zw / 15.0;
|
flw_vertexLight = i.light / 15.;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,6 @@ void flw_instanceVertex(in FlwInstance i) {
|
|||||||
flw_vertexPos = i.pose * flw_vertexPos;
|
flw_vertexPos = i.pose * flw_vertexPos;
|
||||||
flw_vertexNormal = i.normal * flw_vertexNormal;
|
flw_vertexNormal = i.normal * flw_vertexNormal;
|
||||||
flw_vertexColor = i.color;
|
flw_vertexColor = i.color;
|
||||||
flw_vertexOverlay = i.overlay_light.xy;
|
flw_vertexOverlay = i.overlay;
|
||||||
flw_vertexLight = i.overlay_light.zw / 15.0;
|
flw_vertexLight = i.light / 15.;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,14 @@ void _flw_main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flw_material.useOverlay) {
|
if (flw_material.useOverlay) {
|
||||||
vec4 overlayColor = texelFetch(_flw_overlayTex, flw_fragOverlay, 0);
|
// Need to clamp the overlay texture coords to sane coordinates because integer vertex attributes explode on
|
||||||
|
// some drivers for some draw calls.
|
||||||
|
// This can be removed once instancing uses sampler buffers, though
|
||||||
|
// we may need a solution for the internal vertex format. Perhaps
|
||||||
|
// pass as floats and convert to integers in the shader?
|
||||||
|
ivec2 actualCoord = clamp(flw_fragOverlay, ivec2(3), ivec2(10));
|
||||||
|
|
||||||
|
vec4 overlayColor = texelFetch(_flw_overlayTex, actualCoord, 0);
|
||||||
color.rgb = mix(overlayColor.rgb, color.rgb, overlayColor.a);
|
color.rgb = mix(overlayColor.rgb, color.rgb, overlayColor.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user