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?
oScale = vec4 (Maßstab, Maßstab, Maßstab,/1 /); "Ja wirklich?" –