lightShow1
This commit is contained in:
parent
1c0ea25fb5
commit
4cf3a0e2d4
15
assets/Shaders/anime/renderNormals.fs
Normal file
15
assets/Shaders/anime/renderNormals.fs
Normal file
@ -0,0 +1,15 @@
|
||||
#version 330 core
|
||||
|
||||
out vec4 FragColor;
|
||||
|
||||
|
||||
in vec3 FragPos;
|
||||
in vec3 Normal;
|
||||
|
||||
|
||||
void main(){
|
||||
vec3 norm = normalize(Normal);
|
||||
|
||||
|
||||
FragColor = vec4(norm,1.0);
|
||||
}
|
||||
63
assets/Shaders/anime/renderNormals.vs
Normal file
63
assets/Shaders/anime/renderNormals.vs
Normal file
@ -0,0 +1,63 @@
|
||||
//Vertex Shader
|
||||
#version 330 core
|
||||
|
||||
|
||||
|
||||
//input buffers
|
||||
layout (location = 0) in vec3 aPos;
|
||||
layout (location = 1) in vec3 aNormal;
|
||||
layout (location = 2) in vec4 aWeights;
|
||||
layout (location = 3) in vec4 aIndex;
|
||||
|
||||
|
||||
//coordinate space transformation matrices
|
||||
uniform mat4 transform;
|
||||
uniform mat4 model;
|
||||
uniform mat4 view;
|
||||
uniform mat4 projection;
|
||||
|
||||
//bone related variables
|
||||
const int MAX_WEIGHTS = 4;
|
||||
const int MAX_BONES = 100;
|
||||
uniform mat4 bones[MAX_BONES];
|
||||
uniform int hasBones;
|
||||
uniform int numBones;
|
||||
|
||||
|
||||
|
||||
//output buffers
|
||||
out vec3 Normal;
|
||||
out vec3 FragPos;
|
||||
|
||||
|
||||
|
||||
|
||||
void main() {
|
||||
|
||||
|
||||
|
||||
//calculate bone transform
|
||||
mat4 BoneTransform = (bones[int(aIndex[0])] * aWeights[0]);
|
||||
BoneTransform = BoneTransform + (bones[int(aIndex[1])] * aWeights[1]);
|
||||
BoneTransform = BoneTransform + (bones[int(aIndex[2])] * aWeights[2]);
|
||||
BoneTransform = BoneTransform + (bones[int(aIndex[3])] * aWeights[3]);
|
||||
|
||||
|
||||
//apply bone transform to position vectors
|
||||
vec4 FinalVertex = BoneTransform * vec4(aPos, 1.0);
|
||||
vec4 FinalNormal = BoneTransform * vec4(aNormal, 1.0);
|
||||
|
||||
|
||||
//make sure the W component is 1.0
|
||||
FinalVertex = vec4(FinalVertex.xyz, 1.0);
|
||||
FinalNormal = vec4(FinalNormal.xyz, 1.0);
|
||||
|
||||
|
||||
//push frag, normal, and texture positions to fragment shader
|
||||
FragPos = vec3(model * FinalVertex);
|
||||
Normal = mat3(transpose(inverse(model))) * FinalNormal.xyz;
|
||||
|
||||
|
||||
//set final position with opengl space
|
||||
gl_Position = projection * view * model * FinalVertex;
|
||||
}
|
||||
@ -148,6 +148,13 @@ public class RenderingEngine {
|
||||
static Framebuffer transparencyBuffer;
|
||||
static ShaderProgram oitCompositeProgram;
|
||||
|
||||
/*
|
||||
render normals
|
||||
*/
|
||||
static Texture gameImageNormalsTexture;
|
||||
static Framebuffer gameImageNormalsFramebuffer;
|
||||
static ShaderProgram renderNormalsShader;
|
||||
|
||||
/*
|
||||
Perspective volumetrics
|
||||
*/
|
||||
@ -296,6 +303,18 @@ public class RenderingEngine {
|
||||
volumeDepthFrontfaceTexture = FramebufferUtils.generateDepthBufferTexture(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
volumeDepthFrontfaceFramebuffer = FramebufferUtils.generateDepthBuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, volumeDepthFrontfaceTexture);
|
||||
|
||||
//
|
||||
//Game normals
|
||||
//
|
||||
/*
|
||||
gameImageNormalsTexture;
|
||||
static Framebuffer gameImageNormalsFramebuffer;
|
||||
static ShaderProgram renderNormalsShader;
|
||||
*/
|
||||
gameImageNormalsTexture = FramebufferUtils.generateScreenTextureColor(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
gameImageNormalsFramebuffer = FramebufferUtils.generateScreenTextureFramebuffer(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, gameImageNormalsTexture);
|
||||
renderNormalsShader = ShaderProgram.loadSpecificShader("Shaders/anime/renderNormals.vs", "Shaders/anime/renderNormals.fs");
|
||||
|
||||
//
|
||||
//Transparency framebuffers
|
||||
//
|
||||
@ -413,6 +432,8 @@ public class RenderingEngine {
|
||||
if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){
|
||||
renderGameContent();
|
||||
renderDebugContent();
|
||||
renderNormals();
|
||||
compositeGameImage();
|
||||
}
|
||||
|
||||
|
||||
@ -589,7 +610,7 @@ public class RenderingEngine {
|
||||
modelTransformMatrix.scale(EntityUtils.getScale(currentEntity));
|
||||
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||
//draw
|
||||
currentActor.draw();
|
||||
currentActor.draw(true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -629,44 +650,31 @@ public class RenderingEngine {
|
||||
modelTransformMatrix.scale(EntityUtils.getScale(currentEntity));
|
||||
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||
//draw
|
||||
currentActor.draw();
|
||||
currentActor.draw(true);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Pass Three: Composite transparency on top of solids
|
||||
//
|
||||
glDepthFunc(GL_ALWAYS);
|
||||
// glDepthMask(false);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
screenFramebuffer.bind();
|
||||
Globals.renderingEngine.setActiveShader(oitCompositeProgram);
|
||||
|
||||
glBindVertexArray(screenTextureVAO);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE3);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyAccumulatorTexture.getTexturePointer());
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyRevealageTexture.getTexturePointer());
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
glBindVertexArray(0);
|
||||
|
||||
// glBindVertexArray(0);
|
||||
}
|
||||
|
||||
static void renderDebugContent(){
|
||||
|
||||
//bind screen fbo
|
||||
screenFramebuffer.bind();
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LESS);
|
||||
glDepthMask(true);
|
||||
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
|
||||
///
|
||||
/// R E N D E R I N G S T U F F
|
||||
///
|
||||
//Sets the background color.
|
||||
|
||||
Matrix4f modelTransformMatrix = new Matrix4f();
|
||||
|
||||
if(Globals.userSettings.graphicsDebugDrawCollisionSpheres()){
|
||||
for(Entity currentHitbox : Globals.hitboxManager.getAllHitboxes()){
|
||||
if((boolean)currentHitbox.getData(EntityDataStrings.DATA_STRING_DRAW)){
|
||||
@ -813,6 +821,89 @@ public class RenderingEngine {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void renderNormals(){
|
||||
|
||||
/*
|
||||
gameImageNormalsTexture;
|
||||
static Framebuffer gameImageNormalsFramebuffer;
|
||||
static ShaderProgram renderNormalsShader;
|
||||
*/
|
||||
|
||||
//bind screen fbo
|
||||
gameImageNormalsFramebuffer.bind();
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LESS);
|
||||
glDepthMask(true);
|
||||
glViewport(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
|
||||
///
|
||||
/// R E N D E R I N G S T U F F
|
||||
///
|
||||
//Sets the background color.
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
Matrix4f modelTransformMatrix = new Matrix4f();
|
||||
|
||||
Globals.renderingEngine.setActiveShader(renderNormalsShader);
|
||||
|
||||
Vector3f cameraPos = CameraEntityUtils.getCameraCenter(Globals.playerCamera);
|
||||
modelTransformMatrix = new Matrix4f();
|
||||
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||
Vector3d position = EntityUtils.getPosition(currentEntity);
|
||||
if(
|
||||
(boolean)currentEntity.getData(EntityDataStrings.DATA_STRING_DRAW) &&
|
||||
currentEntity.getData(EntityDataStrings.DRAW_SOLID_PASS) != null &&
|
||||
drawPoint(cameraPos,new Vector3f((float)position.x,(float)position.y,(float)position.z))
|
||||
){
|
||||
//fetch actor
|
||||
Actor currentActor = EntityUtils.getActor(currentEntity);
|
||||
currentActor.incrementAnimationTime(0.001);
|
||||
//calculate camera-modified vector3f
|
||||
Vector3f cameraModifiedPosition = new Vector3f((float)position.x,(float)position.y,(float)position.z).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera));
|
||||
//calculate and apply model transform
|
||||
modelTransformMatrix.identity();
|
||||
modelTransformMatrix.translate(cameraModifiedPosition);
|
||||
modelTransformMatrix.rotate(EntityUtils.getRotation(currentEntity));
|
||||
modelTransformMatrix.scale(EntityUtils.getScale(currentEntity));
|
||||
currentActor.applyModelMatrix(modelTransformMatrix);
|
||||
//draw
|
||||
currentActor.draw(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void compositeGameImage(){
|
||||
//
|
||||
// Pass Three: Composite transparency on top of solids
|
||||
//
|
||||
glDepthFunc(GL_ALWAYS);
|
||||
// glDepthMask(false);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
screenFramebuffer.bind();
|
||||
Globals.renderingEngine.setActiveShader(oitCompositeProgram);
|
||||
|
||||
glBindVertexArray(screenTextureVAO);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE3);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyAccumulatorTexture.getTexturePointer());
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyRevealageTexture.getTexturePointer());
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
static void renderScreenFramebuffer(){
|
||||
//
|
||||
@ -855,7 +946,7 @@ public class RenderingEngine {
|
||||
} else if(outputFramebuffer == 4){
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyAccumulatorTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 5){
|
||||
glBindTexture(GL_TEXTURE_2D, transparencyRevealageTexture.getTexturePointer());
|
||||
glBindTexture(GL_TEXTURE_2D, gameImageNormalsTexture.getTexturePointer());
|
||||
} else if(outputFramebuffer == 6){
|
||||
Globals.renderingEngine.setActiveShader(drawChannel);
|
||||
glUniform1f(glGetUniformLocation(Globals.renderingEngine.getActiveShader().shaderProgram, "channel"),0);
|
||||
|
||||
@ -180,7 +180,7 @@ public class Actor {
|
||||
}
|
||||
}
|
||||
|
||||
public void draw(){
|
||||
public void draw(boolean setShader){
|
||||
Model model = Globals.assetManager.fetchModel(modelPath);
|
||||
boolean hasDrawn = false;
|
||||
if(model != null){
|
||||
@ -208,11 +208,11 @@ public class Actor {
|
||||
if(overrideTextureObject != null){
|
||||
overrideTextureObject.bind();
|
||||
hasDrawn = true;
|
||||
model.draw(true, true, false, false, true, true, true);
|
||||
model.draw(setShader, true, false, false, true, true, true);
|
||||
}
|
||||
}
|
||||
if(!hasDrawn){
|
||||
model.draw(true, true, false, true, true, true, true);
|
||||
model.draw(setShader, true, false, true, true, true, true);
|
||||
}
|
||||
model.getShaderMask().clear();
|
||||
model.setTextureMask(null);
|
||||
|
||||
@ -114,6 +114,30 @@ public class FramebufferUtils {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public static Framebuffer generateScreenTextureFramebuffer(int width, int height, Texture colorTexture){
|
||||
Framebuffer buffer = new Framebuffer();
|
||||
buffer.bind();
|
||||
//texture
|
||||
// int texture = glGenTextures();
|
||||
// glBindTexture(GL_TEXTURE_2D,texture);
|
||||
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
// //these make sure the texture actually clamps to the borders of the quad
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
buffer.setTexturePointer(colorTexture.getTexturePointer());
|
||||
//bind texture to fbo
|
||||
int mipMapLevel = 0;
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture.getTexturePointer(), mipMapLevel);
|
||||
//check make sure compiled
|
||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
|
||||
System.out.println("Framebuffer is not complete!");
|
||||
}
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public static Framebuffer generateScreensizeTextureFramebuffer(){
|
||||
Framebuffer buffer = new Framebuffer();
|
||||
buffer.bind();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user