Rasterization:Render into fragment centers

Started by
7 comments, last by pieslice 16 years, 9 months ago
Hi, I have a question regarding rasterization of pixels. I have a FBO with lets say 512*512 pixels. now my aim is to render exactly into these pixels, so I set up a orthographic projection and a vertex array with lots of tiny quads sized 1x1. The questions is, in order to render into the lower-left fragment, do I use (0,0)-(1,1) as the coordinates for the quad or something like (0.25,0.25)-(0.75,0.75), just offsetting the coordinates a little to the center? glDrawPixels is not an option here, since I use the quads as input data for complex shader operations to do sorting on the GPU or update particle system data, where each fragment corresponds to a particle Here an excerpt from the redbook about the framebuffer. Chapter 10 The Framebuffer thx in advance
http://www.8ung.at/basiror/theironcross.html
Advertisement
"now my aim is to render exactly into these pixels, so I set up a orthographic projection and a vertex array with lots of tiny quads sized 1x1."

Seems to be overkill.

Look at the the orthographic projection definitions to see how to write to individual pixels.

hint, use gluortho2d to create the matrix (or write your own version of gluortho2d)...

"glDrawPixels is not an option here, since I use the quads as input data for complex shader operations to do sorting on the GPU or update particle system data, where each fragment corresponds to a particle"

Why not just do a texel lookup from the computed texture of the FBO? Are you using geometry shaders?
Quote:Original post by WilyCoder
"now my aim is to render exactly into these pixels, so I set up a orthographic projection and a vertex array with lots of tiny quads sized 1x1."

Seems to be overkill.

Look at the the orthographic projection definitions to see how to write to individual pixels.

hint, use gluortho2d to create the matrix (or write your own version of gluortho2d)...

I have a camera system that takes care of this.
Quote:gluOrtho2D sets up a two-dimensional orthographic viewing region. This is equivalent to calling glOrtho with near=-1 and far=1.



Quote:Original post by WilyCoder

"glDrawPixels is not an option here, since I use the quads as input data for complex shader operations to do sorting on the GPU or update particle system data, where each fragment corresponds to a particle"

Why not just do a texel lookup from the computed texture of the FBO? Are you using geometry shaders?


No I am not using geometry shaders, it must be compatible with GF6800 cards.
I don t do a lookup since I have to initialize it at first and I need to perform some initializations with fragment shaders to do all the computations required on the GPU.

We work on a parallel processed particle system on the GPU.

[Edited by - Basiror on July 10, 2007 3:04:23 AM]
http://www.8ung.at/basiror/theironcross.html
I probably need more details of the implementation.

"The questions is, in order to render into the lower-left fragment, do I use
(0,0)-(1,1) as the coordinates for the quad"

If you are in orthographic mode, you can render to the bottom left pixel by

glBegin(GL_POINTS);
glVertex2i(0,0);
glEnd();

I know that is a very simple solution, and you probably want something else. That's why more details of your implementation are needed.
Here's a trick for pixel perfect 2d-rasterization.

Let width and height be the proportions in pixels.

    glMatrixMode( GL_PROJECTION );    glLoadIdentity();    gluOrtho2D( 0, width, 0, height );    glMatrixMode( GL_MODELVIEW );    glLoadIdentity();    glTranslatef( 0.375, 0.375, 0.0 );


Then just draw stuff with glVertex or equivalent.
Quote:Original post by WilyCoder
I probably need more details of the implementation.

"The questions is, in order to render into the lower-left fragment, do I use
(0,0)-(1,1) as the coordinates for the quad"

If you are in orthographic mode, you can render to the bottom left pixel by

glBegin(GL_POINTS);
glVertex2i(0,0);
glEnd();

I know that is a very simple solution, and you probably want something else. That's why more details of your implementation are needed.


Thats exactly the point I wonder about, assuming the scanline rasterizer does a nearest neightbour to find the best fragment center to render to

in your example what would happen to glVertex2i(width,height)



@pieslice:

thats what I thought about as well, does anyone have experience with ATI boards?
I can only test it on gf6 boards at the moment.

thx
http://www.8ung.at/basiror/theironcross.html
Quote:Original post by Basiror
@pieslice:

thats what I thought about as well, does anyone have experience with ATI boards?
I can only test it on gf6 boards at the moment.

thx


The trick I introduced in this thread is considered as general OpenGL trick. It works regardless of hardware used.
thats good to know thx
http://www.8ung.at/basiror/theironcross.html
Just keep in mind that zero coordinate is the bottom of the draw area, because OpenGL maps the matrices 'upside-down'.

This topic is closed to new replies.

Advertisement