Skip to content
This repository has been archived by the owner on Oct 9, 2019. It is now read-only.

Commit

Permalink
Build-143: Fixes and Optimization
Browse files Browse the repository at this point in the history
Particles now are rendered using glDrawArraysInstanced, a more efficient
way of rendering a lot of vertex also this removes the support of any
OpenGL 3.2 graphic cards. Fixed GlobalState error and now can't set an
already set state.
  • Loading branch information
Guerra24 committed Jan 3, 2016
1 parent 815e709 commit 8a8dc2e
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 72 deletions.
4 changes: 2 additions & 2 deletions assets/game/settings.conf
@@ -1,5 +1,5 @@
#Voxel Settings
#Wed Dec 30 17:22:27 CST 2015
#Sat Jan 02 23:11:52 CST 2016
UPS=30
VSYNC=false
useMotionBlur=false
Expand All @@ -8,6 +8,6 @@ DrawDistance=2
SettingsVersion=3
useVolumetricLight=false
TESTXMOD=Hello Voxel
useDOF=false
FPS=30
useDOF=false
useShadows=false
10 changes: 2 additions & 8 deletions assets/shaders/FragmentParticle.glsl
Expand Up @@ -24,24 +24,18 @@

#version 330 core

in vec3 pass_Position;
in vec2 textureCoords0;
in vec2 textureCoords1;
in float blend;

out vec4 [5] out_Color;
out vec4 out_Color;

uniform sampler2D particleTexture;

void main(void){

vec4 colour0 = texture(particleTexture, textureCoords0);
vec4 colour1 = texture(particleTexture, textureCoords1);

out_Color[0] = mix(colour0, colour1, blend);
out_Color[1] = vec4(pass_Position.xyz,0);
out_Color[2] = vec4(0,0,0,0);
out_Color[3] = vec4(0.0);
out_Color[4] = vec4(0.0,1.0,0.0,0.0);
out_Color = mix(colour0, colour1, blend);

}
24 changes: 10 additions & 14 deletions assets/shaders/VertexParticle.glsl
Expand Up @@ -25,30 +25,26 @@
#version 330 core

in vec2 position;
in mat4 modelViewMatrix;
in vec4 texOffsets;
in float blendFactor;

out vec3 pass_Position;
out vec2 textureCoords0;
out vec2 textureCoords1;
out float blend;

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 transformationMatrix;
uniform vec2 texOffset0;
uniform vec2 texOffset1;
uniform vec2 texCoordInfo;
uniform float numberOfRows;

void main(void){

vec2 textureCoords = position + vec2(0.5,0.5);
textureCoords.y = 1.0 - textureCoords.y;
textureCoords/= texCoordInfo.x;
textureCoords0 = textureCoords + texOffset0;
textureCoords1 = textureCoords + texOffset1;
blend = texCoordInfo.y;
textureCoords /= numberOfRows;
textureCoords0 = textureCoords + texOffsets.xy;
textureCoords1 = textureCoords + texOffsets.zw;
blend = blendFactor;

vec4 worldPosition = transformationMatrix * vec4(position, 0.0, 1.0);
vec4 positionRelativeToCam = viewMatrix * worldPosition;
gl_Position = projectionMatrix * positionRelativeToCam;
pass_Position = worldPosition.xyz;
vec4 worldPosition = modelViewMatrix * vec4(position, 0.0, 1.0);
gl_Position = projectionMatrix * worldPosition;
}
Expand Up @@ -90,8 +90,10 @@ public GameState getState() {
}

public void setState(GameState state) {
this.oldState = this.state;
this.state = state;
if (!state.equals(this.state)) {
this.oldState = this.state;
this.state = state;
}
}

public GameState getOldState() {
Expand Down
Expand Up @@ -46,7 +46,7 @@ public class VoxelVariables {
public static final String apiVersion = "0.0.6";
public static final int apiVersionNum = 000006;
public static final String state = "ALPHA";
public static final int build = 142;
public static final int build = 143;
public static int FOV = 90;
public static int WIDTH = 1280;
public static int HEIGHT = 720;
Expand Down
Expand Up @@ -103,11 +103,11 @@ public void render(Voxel voxel, GlobalStates states, float delta) {
glReadPixels(Display.getWidth() / 2, Display.getHeight() / 2, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, p);
gm.getCamera().depth = p.get(0);
gm.getRenderer().renderEntity(gm.getEngine().getEntities(), gm);
ParticleMaster.getInstance().render(gm.getCamera());
gm.getDeferredShadingRenderer().getPost_fbo().end();

gm.getRenderer().prepare();
gm.getDeferredShadingRenderer().render(gm);
ParticleMaster.getInstance().render(gm.getCamera());

}

Expand Down
Expand Up @@ -103,11 +103,11 @@ public void render(Voxel voxel, GlobalStates states, float delta) {
glReadPixels(Display.getWidth() / 2, Display.getHeight() / 2, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, p);
gm.getCamera().depth = p.get(0);
gm.getRenderer().renderEntity(gm.getEngine().getEntities(), gm);
ParticleMaster.getInstance().render(gm.getCamera());
gm.getDeferredShadingRenderer().getPost_fbo().end();

gm.getRenderer().prepare();
gm.getDeferredShadingRenderer().render(gm);
ParticleMaster.getInstance().render(gm.getCamera());

Display.beingNVGFrame();
gm.getMenuSystem().pauseMenu.render();
Expand Down
Expand Up @@ -102,11 +102,11 @@ public void render(Voxel voxel, GlobalStates states, float delta) {
glReadPixels(Display.getWidth() / 2, Display.getHeight() / 2, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, p);
gm.getCamera().depth = p.get(0);
gm.getRenderer().renderEntity(gm.getEngine().getEntities(), gm);
ParticleMaster.getInstance().render(gm.getCamera());
gm.getDeferredShadingRenderer().getPost_fbo().end();

gm.getRenderer().prepare();
gm.getDeferredShadingRenderer().render(gm);
ParticleMaster.getInstance().render(gm.getCamera());
} else {
gm.getRenderer().prepare();
}
Expand Down
Expand Up @@ -24,6 +24,8 @@

package net.guerra24.voxel.client.graphics;

import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_NEAREST;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL11.GL_TRIANGLE_STRIP;
import static org.lwjgl.opengl.GL11.glBindTexture;
Expand All @@ -42,7 +44,12 @@
import static org.lwjgl.opengl.GL13.glActiveTexture;
import static org.lwjgl.opengl.GL20.glDisableVertexAttribArray;
import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray;
import static org.lwjgl.opengl.GL30.GL_DRAW_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.GL_READ_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
import static org.lwjgl.opengl.GL30.glBindVertexArray;
import static org.lwjgl.opengl.GL30.glBlitFramebuffer;

import net.guerra24.voxel.client.core.VoxelVariables;
import net.guerra24.voxel.client.graphics.opengl.Display;
Expand Down Expand Up @@ -397,6 +404,11 @@ public void render(GameResources gm) {
glDisableVertexAttribArray(0);
glBindVertexArray(0);
shaderFinal0.stop();
glBindFramebuffer(GL_READ_FRAMEBUFFER, postProcessingFBO.getFbo());
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, Display.getWidth(), Display.getHeight(), 0, 0, Display.getWidth(), Display.getHeight(),
GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

/**
Expand Down
Expand Up @@ -30,10 +30,14 @@
import static org.lwjgl.opengl.GL20.glDisableVertexAttribArray;
import static org.lwjgl.opengl.GL20.glEnableVertexAttribArray;
import static org.lwjgl.opengl.GL30.glBindVertexArray;
import static org.lwjgl.opengl.GL31.*;

import java.nio.FloatBuffer;
import java.util.List;
import java.util.Map;

import org.lwjgl.BufferUtils;

import net.guerra24.voxel.client.graphics.shaders.ParticleShader;
import net.guerra24.voxel.client.particle.Particle;
import net.guerra24.voxel.client.particle.ParticleTexture;
Expand All @@ -47,12 +51,28 @@
public class ParticleRenderer {

private static final float[] VERTICES = { -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f };
private static final int MAX_INSTANCES = 10000;
private static final int INSTANCE_DATA_LENGHT = 21;
private static final FloatBuffer buffer = BufferUtils.createFloatBuffer(MAX_INSTANCES * INSTANCE_DATA_LENGHT);

private RawModel quad;
private ParticleShader shader;

private Loader loader;
private int vbo;
private int pointer = 0;

public ParticleRenderer(Loader loader, Matrix4f projectionMatrix) {
this.loader = loader;
this.vbo = loader.createEmptyVBO(INSTANCE_DATA_LENGHT * MAX_INSTANCES);
quad = loader.loadToVAO(VERTICES, 2);
loader.addInstacedAttribute(quad.getVaoID(), vbo, 1, 4, INSTANCE_DATA_LENGHT, 0);
loader.addInstacedAttribute(quad.getVaoID(), vbo, 2, 4, INSTANCE_DATA_LENGHT, 4);
loader.addInstacedAttribute(quad.getVaoID(), vbo, 3, 4, INSTANCE_DATA_LENGHT, 8);
loader.addInstacedAttribute(quad.getVaoID(), vbo, 4, 4, INSTANCE_DATA_LENGHT, 12);
loader.addInstacedAttribute(quad.getVaoID(), vbo, 5, 4, INSTANCE_DATA_LENGHT, 16);
loader.addInstacedAttribute(quad.getVaoID(), vbo, 6, 1, INSTANCE_DATA_LENGHT, 20);

shader = new ParticleShader();
shader.start();
shader.loadProjectionMatrix(projectionMatrix);
Expand All @@ -63,19 +83,38 @@ public void render(Map<ParticleTexture, List<Particle>> particles, Camera camera
Matrix4f viewMatrix = Maths.createViewMatrix(camera);
prepare();
for (ParticleTexture texture : particles.keySet()) {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
bindTexture(texture);
List<Particle> particleList = particles.get(texture);
pointer = 0;
float[] vboData = new float[particleList.size() * INSTANCE_DATA_LENGHT];

for (Particle particle : particles.get(texture)) {
updateModelViewMatrix(particle.getPosition(), particle.getRotation(), particle.getScale(), viewMatrix);
shader.loadTextureCoordInfo(particle.getTexOffset0(), particle.getTexOffset1(),
texture.getNumbreOfRows(), particle.getBlend());
glDrawArrays(GL_TRIANGLE_STRIP, 0, quad.getVertexCount());
updateModelViewMatrix(particle.getPosition(), particle.getRotation(), particle.getScale(), viewMatrix,
vboData);
updateTexCoordInfo(particle, vboData);
}
loader.updateVBO(vbo, vboData, buffer);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, quad.getVertexCount(), particleList.size());
}
finishRendering();
}

private void updateModelViewMatrix(Vector3f position, float rotation, float scale, Matrix4f viewMatrix) {
private void bindTexture(ParticleTexture texture) {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
shader.loadNumberOfRows(texture.getNumbreOfRows());
}

private void updateTexCoordInfo(Particle particle, float[] vboData) {
vboData[pointer++] = particle.getTexOffset0().x;
vboData[pointer++] = particle.getTexOffset0().y;
vboData[pointer++] = particle.getTexOffset1().x;
vboData[pointer++] = particle.getTexOffset1().y;
vboData[pointer++] = particle.getBlend();
}

private void updateModelViewMatrix(Vector3f position, float rotation, float scale, Matrix4f viewMatrix,
float[] vboData) {
Matrix4f modelMatrix = new Matrix4f();
Matrix4f.translate(position, modelMatrix, modelMatrix);
modelMatrix.m00 = viewMatrix.m00;
Expand All @@ -87,16 +126,41 @@ private void updateModelViewMatrix(Vector3f position, float rotation, float scal
modelMatrix.m20 = viewMatrix.m02;
modelMatrix.m21 = viewMatrix.m12;
modelMatrix.m22 = viewMatrix.m22;
Matrix4f modelViewMatrix = Matrix4f.mul(viewMatrix, modelMatrix, null);
Matrix4f.rotate((float) Math.toRadians(rotation), new Vector3f(0, 0, 1), modelMatrix, modelMatrix);
Matrix4f.scale(new Vector3f(scale, scale, scale), modelMatrix, modelMatrix);
shader.loadViewMatrix(viewMatrix);
shader.loadTransformationMatrix(modelMatrix);
storeMatrixData(modelViewMatrix, vboData);
}

private void storeMatrixData(Matrix4f matrix, float[] vboData) {
vboData[pointer++] = matrix.m00;
vboData[pointer++] = matrix.m01;
vboData[pointer++] = matrix.m02;
vboData[pointer++] = matrix.m03;
vboData[pointer++] = matrix.m10;
vboData[pointer++] = matrix.m11;
vboData[pointer++] = matrix.m12;
vboData[pointer++] = matrix.m13;
vboData[pointer++] = matrix.m20;
vboData[pointer++] = matrix.m21;
vboData[pointer++] = matrix.m22;
vboData[pointer++] = matrix.m23;
vboData[pointer++] = matrix.m30;
vboData[pointer++] = matrix.m31;
vboData[pointer++] = matrix.m32;
vboData[pointer++] = matrix.m33;
}

private void prepare() {
shader.start();
glBindVertexArray(quad.getVaoID());
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
glEnableVertexAttribArray(5);
glEnableVertexAttribArray(6);
glDepthMask(false);
glEnable(GL_BLEND);
}
Expand All @@ -105,6 +169,12 @@ private void finishRendering() {
glDisable(GL_BLEND);
glDepthMask(true);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
glDisableVertexAttribArray(4);
glDisableVertexAttribArray(5);
glDisableVertexAttribArray(6);
glBindVertexArray(0);
shader.stop();
}
Expand Down
Expand Up @@ -26,53 +26,36 @@

import net.guerra24.voxel.client.core.VoxelVariables;
import net.guerra24.voxel.universal.util.vector.Matrix4f;
import net.guerra24.voxel.universal.util.vector.Vector2f;

public class ParticleShader extends ShaderProgram {

private int loc_viewMatrix;
private int loc_transformationMatrix;
private int loc_projectionMatrix;

private int loc_texOffset0;
private int loc_texOffset1;
private int loc_texCoordInfo;
private int loc_numberOfRows;

public ParticleShader() {
super(VoxelVariables.VERTEX_FILE_PARTICLE, VoxelVariables.FRAGMENT_FILE_PARTICLE);
}

@Override
protected void getAllUniformLocations() {
loc_viewMatrix = super.getUniformLocation("viewMatrix");
loc_transformationMatrix = super.getUniformLocation("transformationMatrix");
loc_projectionMatrix = super.getUniformLocation("projectionMatrix");
loc_texOffset0 = super.getUniformLocation("texOffset0");
loc_texOffset1 = super.getUniformLocation("texOffset1");
loc_texCoordInfo = super.getUniformLocation("texCoordInfo");
loc_numberOfRows = super.getUniformLocation("numberOfRows");
}

@Override
protected void bindAttributes() {
super.bindAttribute(0, "position");
super.bindAttribute(1, "modelViewMatrix");
super.bindAttribute(5, "texOffsets");
super.bindAttribute(6, "blendFactor");
}

public void loadTextureCoordInfo(Vector2f offset0, Vector2f offset1, float numRows, float blend) {
super.load2DVector(loc_texOffset0, offset0);
super.load2DVector(loc_texOffset1, offset1);
super.load2DVector(loc_texCoordInfo, new Vector2f(numRows, blend));
}

public void loadViewMatrix(Matrix4f modelView) {
super.loadMatrix(loc_viewMatrix, modelView);
public void loadNumberOfRows(float rows) {
super.loadFloat(loc_numberOfRows, rows);
}

public void loadProjectionMatrix(Matrix4f projectionMatrix) {
super.loadMatrix(loc_projectionMatrix, projectionMatrix);
}

public void loadTransformationMatrix(Matrix4f transformationMatrix) {
super.loadMatrix(loc_transformationMatrix, transformationMatrix);
}

}

0 comments on commit 8a8dc2e

Please sign in to comment.