2017-06-28 6 views
1

Ich habe versucht, Shadow-Mapping für eine lange Zeit zu implementieren, und ich verwende Lance Williams 'Technik (die die Szene zweimal rendert, einmal im Lichtraum und einmal im Ansichtsraum). Jedoch, wenn ich glCheckFramebufferStatus auf GL_FRAMEBUFFER rufe, bekomme ich GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, nach Ich habe glFramebufferTexture2D darauf genannt. Ich bin verwirrt, weil dieser Fehler ausgelöst wird, wenn keine Textur oder renderbuffer an den Framebuffer angeschlossen ist, aber ich denke, dass ich do eine Textur anhängen.Get GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT mit Tiefentexturierung

Hier ist mein Code in init laufen:

gl.glEnable(GL2.GL_TEXTURE_2D); 

    // generate stuff 
    IntBuffer ib = IntBuffer.allocate(1); 
    gl.glGenFramebuffers(1, ib); 
    frameBuffer = ib.get(0); 
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBuffer); 

    ib = IntBuffer.allocate(1); 
    gl.glGenTextures(1, ib); 
    depthTexture = ib.get(0); 
    gl.glBindTexture(GL2.GL_TEXTURE, depthTexture); 

    // prevents 'shadow acne' 
    gl.glPolygonOffset(2.5f, 0); 
    // prevents multiple shadows 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_EDGE); 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_EDGE); 
    // prevents (or expects!!!) pixel-y textures 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST); 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST); 
    // store one value in all four components of pixel 
    gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY); 

    gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_TEXTURE_2D, depthTexture, 0); 
    gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_DEPTH_COMPONENT16, 1024, 1024, 0, GL2.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, null); 
    gl.glDrawBuffer(GL2.GL_NONE); 
    gl.glReadBuffer(GL2.GL_NONE); 
    int FBOStatus = gl.glCheckFramebufferStatus(GL2.GL_FRAMEBUFFER); 
    // FBOStatus == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 

EDIT: Ich auch diese Methode in einem praktisch leeren Projekt lief (den Fehler zu werfen)

+0

Was bedeutet '(GL2.GL_TEXTURE_2D, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY) '? Wie verwenden Sie "INTENSITÄT" als Modus? –

+0

Es sollte alle vier Komponenten des Ausgabevektors auf einen Wert setzen. – clabe45

Antwort

1

aber ich denke, ich habe eine Textur, die daran befestigt ist.

Nein, haben Sie nicht.

Seit

gl.glBindTexture(GL2.GL_TEXTURE, depthTexture); 

nur einen GL_INVALID_ENUM Fehler erzeugen, weil Sie GL_TEXTURE_2D hier gemeint, Sie nur einen Namen einer Textur Objekt haben, und nie, dass die Textur Speicher erstellt. Ihr glTexImage2D Aufruf wirkt sich nur auf ein anderes Texturobjekt aus, das gerade gebunden ist (oder sogar Texturobjekt 0 in Legacy GL).

+0

Das hat so viel seelischen Schmerz gespart – clabe45