2017-02-19 12 views
1

In OpenGL Ich versuche, eine nicht skalierte Float von meinem Fragment-Shader zu einem FBO-Farbanhang für Maus über Wert Kommissionierung ausgeben. Allerdings kann ich meinen Fragment-Shader-Code nicht korrekt schreiben, um den Wert zu schreiben.GL_32F und glReadPixels

fügt man einen Farb Befestigung zum Speichern der Kommissionier- Werte an die Bildpuffer I zeichnen sich wie folgt:

// ... Bind FBO .etc. 
glTexImage2D(
    GL_TEXTURE_2D, 
    0, 
    GL_R32F, 
    DrawTextureDims.width(), 
    DrawTextureDims.height(), 
    0, 
    GL_RED, 
    GL_FLOAT, 
    0); 
glFramebufferTexture2D(
    GL_FRAMEBUFFER, 
    GL_COLOR_ATTACHMENT2, 
    GL_TEXTURE_2D, 
    pointsMeshData->magnitudeTexture, 
    0); 

und Einrichtung die Streckpuffer vor dem Ziehen, wie folgt:

// ... 
    GLenum drawBufs[2] { 
     GL_COLOR_ATTACHMENT0, 
     GL_COLOR_ATTACHMENT2 
    }; 
    glDrawBuffers(2,drawBufs); 

    GLfloat clearMagnitude[4] { 0,0,0,0 }; 
    glClearBufferfv(GL_COLOR,1,clearMagnitude); 

    // Bind VAO and shader. Setup uniforms and call glDrawElements() 

Und schließlich wie folgt zurückgelesen:

... 
glBindFramebuffer(GL_READ_FRAMEBUFFER,drawData->renderFBO.handle()); 
glReadBuffer(GL_COLOR_ATTACHMENT2); 
glBindBuffer(GL_PIXEL_PACK_BUFFER,0); 

*magnitude = 0.f; 
glReadPixels(x,y,1,1,GL_RED,GL_FLOAT,magnitude); 
... 

Allerdings wenn ich auf die 2. Farbe attachme ausgib Bei Verwendung des folgenden Fragment-Shaders wird nichts gezeichnet. Ich erhalte die Farbe zurück I mit (clearMagnitude) gelöscht von glReadPixels()

#version 330 

in float scale; 
uniform sampler1D uPalette; 
layout(location=0) out vec4 color; 
layout(location=1) out float oScale; 

void main(void) 
{ 
    color = texture(uPalette,scale); 
    oScale = scale; 
} 

Auf der anderen Seite, wenn ich Ausgabe der folgenden (klar falsch) Fragment-Shader ich mit einem skalierten (0-1) Wert erhalten zurück in glReadPixels():

#version 330 

in float scale; 
uniform sampler1D uPalette; 
layout(location=0) out vec4 color; 
layout(location=1) out vec4 oScale; 

void main(void) 
{ 
    color = texture(uPalette,scale); 
    oScale = vec4(scale,scale,scale,1); 
} 

Was mache ich falsch? Wie kann ich einen einzelnen unskalierten Float in GLSL ausgeben und zurücklesen?

+0

oScale = vec4 (Maßstab, Maßstab, Maßstab,/1 /); "Ja wirklich?" –

Antwort

2

I-Ausgang des folgenden (eindeutig falsch) Fragment-Shader

Es ist nichts falsch mit diesen Fragment-Shader verwenden. Genau wie Vertex-Attribute müssen die Anzahl der Fragment-Shader-Ausgabekomponenten nicht mit den tatsächlichen Komponenten des tatsächlichen Zielbilds übereinstimmen. Wenn Ihr Ausgabebild weniger Komponenten als die entsprechende Fragment-Shader-Variable aufweist, werden einfach die Komponenten übernommen, die dem Bild entsprechen, und der Rest wird ignoriert.

Allerdings haben Sie nicht haben, um eine vec4 auszugeben, nur um auf ein einzelnes Kanalbild zu schreiben. Ihr float Beispiel sollte gut funktionieren, also ist wahrscheinlich ein Treiberfehler im Spiel.

Was das Skalierungsproblem angeht, ist das eine andere Sache: read color clamping. Sie müssen glClampColor verwenden, um OpenGL anzuweisen, Gleitkomma-Lesevorgänge nicht zu klemmen. Beispiel:

glClampColor(GL_CLAMP_READ_COLOR, GL_FIXED_ONLY); 

Dies verhindert das Festklemmen beim Lesen von FBO-Bildern mit Festkommaformaten.

Dies ist nicht Teil des FBO-Status; es ist nur ein Kontextwert. Sie können es also einfach einmal einstellen und vergessen.

Verwandte Themen