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?