VBA-M Forums
Image Processing Algorithms - Printable Version

+- VBA-M Forums (http://vba-m.com/forum)
+-- Forum: General Discussion (/forum-20.html)
+--- Forum: Offtopic/SpamChat (/forum-46.html)
+--- Thread: Image Processing Algorithms (/thread-378.html)

Image Processing Algorithms - mudlord - 08-15-2009 08:52 PM

I am currently investigating certain image processing/scaling algorithms.

For example: http://board.byuu.org/viewtopic.php?f=10&t=203
The effect could very easily be done with a vertex and pixel shader (using a vertex shader, calculate the velocity of a pixel, and then blur accordingly), but thats not the point.

I am interested in using scaling/image processing algorithms, that are written in software, for rendering hardware rendered 3D images, for processing with the CPU. No shaders, no nothing, except raw CPU processing. Attached is a example that uses such a approach. The scene is captured into a buffer, not a texture, and post processed, and drawn back purely in software. Speed is a issue and I ask for assistance in accelerating glReadPixel operations.

I am also asking for sources such as HQXX/2xsai as well as references for Lanczos/Mitchell scaling/resampling algorithms

Added a plasma background, should be more useful for detecting artifacts.
I added a basic software bloom filter. Still, same performance issues with glReadPixels remains....

Considering turning this app into a OGL benchmark for filters. Would be nice to add Kega filters.

RE: Image Processing Algorithms - mudlord - 08-17-2009 01:10 PM

Heheheh, ran into a interesting optimization problem.....

void post_process_cpu()
    //RGB-888, 32 bits
        GLuint scratchtex;
    int bufsize = window_width * window_height * 4;
    int pitch = window_width*4;
    unsigned char* ImageBuffer = (unsigned char*)malloc(bufsize);

    glReadPixels ( 0, 0, window_width, window_height, GL_RGBA,     GL_UNSIGNED_BYTE, (unsigned char*)ImageBuffer);

    //do 2xSai/HQ2X/bloom/whatever on ImageBuffer

    glGenTextures(1, &scratchtex);
    glBindTexture(GL_TEXTURE_2D, scratchtex);
    glTexImage2D( GL_TEXTURE_2D, 0, 3, window_width, window_height, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, ImageBuffer);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f,  1.0f);
    glTexCoord2f(1.0f, 0.0f);
    glVertex3f( 1.0f, -1.0f,  1.0f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex3f( 1.0f,  1.0f,  1.0f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex3f(-1.0f,  1.0f,  1.0f);

    glBindTexture(GL_TEXTURE_2D, 0);
    glDeleteTextures(1, &scratchtex);


I know, unoptimized.

As I said, I worked out a way.
Render the scene into a 512*512 viewport, then copy the texture. However, for some odd reason, I do not know, the texture in the rendered scene is off centre, by exactly half (only half the image is displayed). Any help with the usage of glViewport and the tex coords would be great. Unfortunately, I lost the code in the past thats perfect for scaling textures according to aspect ratio, viewport size and texture size.