Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

1

28.02.2014, 13:21

[OpenGL] Lesen von Textur-Daten liefert seltsame Werte

Hallo zusammen,

ich rendere zur Zeit mit OpenGL einige einzelne voneinander unabhängige Punkte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
glBindFramebuffer( GL_FRAMEBUFFER, framebuffer); 
glClear (GL_COLOR_BUFFER_BIT);
glViewport( 0, 0, xResolution*RES_MULT, yResolution*RES_MULT);
glDisable(GL_DEPTH_TEST);
glEnable( GL_BLEND );
glBlendFunc( GL_ONE, GL_ONE );
glUseProgram( shader->programId );
glBindVertexArray( pc_vao_id );
glDrawArrays(GL_POINTS, 0, point_count );
glDisable( GL_BLEND );

Die Idee ist, dass die Punkte, wenn sie im gleichen Pixel liegen additiv geblendet werden. Der Shader macht eigentlich nichts weiter als:

HLSL-Quelltext

1
2
3
4
5
layout(location = 0) out vec4 out_color;
in vec3 color;
void main(void) {
    out_color = vec4(color, 1.0);
}

Die Idee ist jetzt, dass durch das additive Blending in der Framebuffer-Textur im Alpha-Kanal die Anzahl der Punkte steht, die auf den gleichen Pixel fallen.
Jetzt brauche ich nach dem Render-Vorgang Zugriff auf die Textur-Daten auf der CPU:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D, add_color );
glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, camera->film->reprojection_texture );

for(int i = 3; i < camera->film->xResolution*camera->film->yResolution*4; i+=4 )
{
    float value = camera->film->reprojection_texture[i];
}

Ich möchte also wissen, welche Zahl im Alpha-Kanal der Textur für jeden Pixel steht. Wenn ich nun jedoch diese Werte (value) ausgeben lasse, dann erhalte ich in etwa:
0.25
0.5
0.75
1.25
2.0

Es scheint als wären die Textur-Werte durch 4 dividiert, da beim additiven Rendering, wie ich es durchführe ja eigentlich keine Bruchzahlen im Alpha-Kanal vorkommen sollten. Gibt es für diese Division durch 4 eine logische Erklärung? Ich habe eben auch in einem anderen Shader mit der Textur gearbeitet und dort scheinen auch Zahlen kleiner 1 gespeichert zu sein. Ich verstehe nicht so ganz, wieso das so ist. Aber irgendwie erscheint es so unzufällig, dass es doch irgendeinen Sinn geben muss?