Hallo liebe Leute,
nach sehr guten Erfahrungen beim letzen Besuch hier nun eine nuee Frage. Um Post-Processing Effekte zu realisieren würde ich gerne die Inhalte meiner Szenerie in eine Textur speichern um diese dann z.B. mit einem Radialblur zu überziehen.
Ein FBO Example habe ich bereits soweit angepasst, leider ohne das eine Textur dauerhaft gezeichnet wird. Die Textur wird geladen und einmalig kurz zu Beginn gerendert, aber sehr kurze Zeit später (ich nehme an im 2. Frame) wird sie nicht mehr (nur die Clearcolor) dargestellt.
Hier mein kleines Beispiel:
Wenn gewünscht könnte ich auch noch die Klassen für Textur und TexturLoader nachschicken um das Beispiel zu einem KSKB zu machen ^^
Beste Grüße und Dank im Voraus!
nach sehr guten Erfahrungen beim letzen Besuch hier nun eine nuee Frage. Um Post-Processing Effekte zu realisieren würde ich gerne die Inhalte meiner Szenerie in eine Textur speichern um diese dann z.B. mit einem Radialblur zu überziehen.
Ein FBO Example habe ich bereits soweit angepasst, leider ohne das eine Textur dauerhaft gezeichnet wird. Die Textur wird geladen und einmalig kurz zu Beginn gerendert, aber sehr kurze Zeit später (ich nehme an im 2. Frame) wird sie nicht mehr (nur die Clearcolor) dargestellt.
Hier mein kleines Beispiel:
Java:
import java.io.IOException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL14;
import org.lwjgl.util.glu.GLU;
import com.trivial.graphics.Texture;
import com.trivial.graphics.TextureLoader;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.EXTFramebufferObject.*;
public class FBOExample {
int colorTextureID;
int framebufferID;
int depthRenderBufferID;
private Texture hand;
public void start() {
init();
initGL(); // init OpenGL
while (!Display.isCloseRequested()) {
renderGL();
Display.update();
Display.sync(60); // cap fps to 60fps
}
Display.destroy();
}
public void initGL() {
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
GL11.glClearDepth(1.0f); // Depth Buffer Setup
GL11.glBlendFunc( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA );
GL11.glEnable( GL11.GL_BLEND );
GL11.glEnable(GL11.GL_TEXTURE_2D); // Enable Texture Mapping
GL11.glMatrixMode(GL11.GL_PROJECTION); // Select The Projection Matrix
GL11.glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
GLU.gluPerspective(45.0f, width / height, 0.1f, 100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The Modelview Matrix
try {
hand =new TextureLoader().getTexture("Target.png");
} catch (IOException e) {
e.printStackTrace();
}
framebufferID = glGenFramebuffersEXT(); // create a new framebuffer
colorTextureID = glGenTextures(); // and a new texture used as a color buffer
depthRenderBufferID = glGenRenderbuffersEXT(); // And finally a new depthbuffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID); // switch to the new framebuffer
// initialize color texture
glBindTexture(GL_TEXTURE_2D, colorTextureID); // Bind the colorbuffer texture
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // make it linear filterd
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null); // Create the texture data
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, colorTextureID, 0); // attach it to the framebuffer
// initialize depth renderbuffer
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthRenderBufferID); // bind the depth renderbuffer
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL14.GL_DEPTH_COMPONENT24, width, height); // get the data space for it
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, depthRenderBufferID); // bind it to the renderbuffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // Swithch back to normal framebuffer rendering
}
public void renderGL() {
glBindTexture(GL_TEXTURE_2D, 0); // unlink textures because if we dont it all is gonna fail
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID); // switch to rendering on our FBO
glClearColor (1.0f, 0.0f, 0.0f, 0.5f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer on the fbo to red
glLoadIdentity (); // Reset The Modelview Matrix
glTranslatef (0.0f, 0.0f, -4.0f); // Translate 6 Units Into The Screen and then rotate
// set color to yellow
hand.bind();
drawBox(); // draw the box
glEnable(GL_TEXTURE_2D); // enable texturing
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // switch to rendering on the framebuffer
glClearColor (0.0f, 1.0f, 0.0f, 0.5f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer on the framebuffer to black
glBindTexture(GL_TEXTURE_2D, colorTextureID); // bind our FBO texture
glLoadIdentity (); // Reset The Modelview Matrix
glTranslatef (0.0f, 0.0f, -4.0f); // set the color to white
drawBox(); // draw the box
glDisable(GL_TEXTURE_2D);
glFlush ();
}
public void drawBox() {
glBegin(GL_QUADS);
// Front Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad
glEnd();
}
public static int width = 800;
public static int height = 600;
static boolean fullscreen = false;
public static void init(){
try {
Display.setFullscreen(fullscreen);
// get modes
DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(
width, height, -1, -1, -1, -1, 60, 60);
org.lwjgl.util.Display.setDisplayMode(dm, new String[] {
"width=" + width,
"height=" + height,
"freq=" + 60,
"bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() });
Display.create();
DisplayMode[] modes = Display.getAvailableDisplayModes();
for (int i=0;i<modes.length;i++) {
DisplayMode current = modes[i];
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Unable to enter fullscreen, continuing in windowed mode");
}
}
public static void main(String[] argv) {
FBOExample fboExample = new FBOExample();
fboExample.start();
}
}
Wenn gewünscht könnte ich auch noch die Klassen für Textur und TexturLoader nachschicken um das Beispiel zu einem KSKB zu machen ^^
Beste Grüße und Dank im Voraus!