Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 15 Dec 2005
Offline Last Active Aug 30 2012 04:05 AM

Topics I've Started

GLSL-PingPong-Rendering - strange performance issue

29 August 2012 - 11:42 AM

Hi there,

I do some calculations on the GPU by rendering a quad into a FBO. The result is subsequently submitted back to GPU for further processing.
The result looks fine but due to some strange mistake I seem to make, it runs very slow (below 1 fps). But when I include a "glReadPixels" call after rendering the quad, the performance goes up to 20 fps (the result of the calculation stays absolutely the same!). But since I don't want to access the data on CPU between the two shader calls, I don't need to acces the pixels and therefore there should be no need for a glReadPixels call. The result of the glReadPixels call is not even read by the program and I only need to read a one-pixel-region to get this effect (see comments below). I have no Idea how this strange behaviour could be explained.

The relevant code is posted below. I used an FBO without an attached depth buffer, only a rgba-texture. The functions "renderToFBO" and "submitToGPU" are called subsequently. If you are interested in initialzation code or something, please let me know. I figured out, that the performance issue is not related to the glsl-shader code.

Thanks for your answers.
[source lang="cpp"]// RenderTarget - Type:typedef struct { bool isAllocated; bool hasDepthBuffer; GLuint color_tex; GLuint fb; // FBO GLuint depthBuffer; GLsizei width; GLsizei height; TextureType textureType;} RenderTarget;// ------------------ render to FBO ---------------------void RenderTargetContainer :: renderToFBO(RenderTarget *rt) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, rt->fb); glViewport(0,0, rt->width, rt->height); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, rt->width, 0.0, rt->height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glBegin(GL_QUADS); glVertex2f(0.0, 0.0); glVertex2f(static_cast <float> (rt->width), 0.0); glVertex2f(static_cast <float> (rt->width),static_cast <float> (rt->height)); glVertex2f(0.0, static_cast <float> (rt->height)); glEnd(); // -- these two lines make it run fast // -- although the visible result statys the same. // -- "foo" will never be read. // -- region needs to be at least 1 to get the speed up effect. static float foo[4]; glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, foo);}// ------------------ submit result to GPU ---------------------void RenderTargetContainer :: submitToGPU(GLint shaderVarLocation, int textureUnit, RenderTarget *rt) { glActiveTexture(GL_TEXTURE0 + textureUnit); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, rt->color_tex); glUniform1i(shaderVarLocation, textureUnit);}[/source]

Photon Mapping : multiple Lights / one global map

15 December 2005 - 10:51 PM

Hi, I'm trying to add some photon-mapping to my simple Ray-Tracer that I have to develop for school. I took the photon-map data-structure of Henrik Wann Jensens "Ralistic Image Synthesis Using Photon Mapping" book, although I don't understand every part of that example code, but I'm working on that. Of course, I also considered the errata-list on his homepage as well as the topics in this forum that focus on special parts of his example code. My first experiences with only one light sources seemed to work quite well, but now, using two light sources, I'm not sure if the resulting fault in the picture is because of an error in my sourcecode or because I don't use the photon-map in the right way. Thats what I'm trying to do: I've defined a simple scene (like cornell-box) with two light sources. I'm using only one photon-map for the whole global illumination. (Later I'll include a separated caustic and shadow-map, but at the moment I'm testing the photon-tracing and -storing with only one map.) In this photon-map, I'm storing the photons every time they hit a diffuse surface (by russian roulette) and scale the photon power by the diffuse object-color of the object they hit, until a photons power is under a threshold-value. So sending out 10.000 photons results in ca. 30.000 stored photons in the map. The failure in the picture: That all worked fine until I used more than one light-sources. Using two light sources results in a picture, displaying only one light-source. The surprising thing: When I set the threshold value up to a value, that a photon is ONLY stored when it hits a diffuse the FIRST time (->no indirect illumination), all lights are displayed! And if I'm storing only the photons that bounced MORE than once (store only indirect illumination), the picture also displayes the indirect illumination of all light-sources. So the failure only occures, if I store EVERY hit of a photon, and it doesn't occure, if I store only the first hits or all hits excluding the first. The question: Is the discribed problem a normal result? I've read in a topic of this forum, that it's normal to seperate the indirect illumination from the direct, and what I'm trying to do, is doing both in one... is that my fault? If yes, I don't understand the photon-locating-algorithm in the kd-tree, because it should find the photons of my second light-source anyway, does't it? I'd be glad, if someone understands the problem and has an idea where it's comeing from. Thanks a lot for reading!