Pedro Leite

words – an empty shell, a lack of meaning

Something is wrong…

My OpenStereo CUDA plugin did not directly benefit from a huge performance improve. Worst, with a 512×512 texture, his best fps rate was around 20, when compiled in release mode, running over a GeForce 8800 GTX. Even the one that uses shaders and Render-To-Texture have outperformed the CUDA plugin (around 300fps in a GeForce 7900 GTX!!!).

Perhaps that implementation isn’t the best one… I think that memory access could be improved, by using shared memory, but this is something to analyze.


October 31, 2007 Posted by | cuda, development, master degree, nvidia, opengl, openstereo | Leave a comment

fglrx and AIGLX

There’s been a great progress on the fglrx ATI driver. However, it needs more development. Not only 3D OpenGL accelerated applications but also video playback (which, I guess, uses OpenGL) needs to be rendered correctly. Video playback, for example, doesn’t play in window mode. While in fullscreen, it flicks a lot =/ It was under Ubuntu 7.10.

October 30, 2007 Posted by | aiglx, ati, fglrx, linux, opengl, screenshot, ubuntu | Leave a comment

OpenStereo Plugin using CUDA

Of course I wouldn’t let OpenStereo apart from my CUDA studies. I’ve implemented an OpenStereo plugin that uses CUDA to do the fusion process. Below is the preliminary kernel code:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define BLOCK_SIZE 16

__global__ void fuse_images(float* left_tex, float* right_tex, float* stereo_tex,
float* matrix_left, float* matrix_right, int width, int height) {
int ix = __mul24(blockIdx.x, BLOCK_SIZE) + threadIdx.x;
int iy = __mul24(blockIdx.y, BLOCK_SIZE) + threadIdx.y;
int i = 0, j = 0, k = 0;
float c = 0.0f;

if (ix >= width || iy >= height)

// rows
for (; i < 3; i++) {
// columns
k = (ix + __mul24(iy, width)) * 3;
for (j = 0; j < 3; j++) {
c += matrix_left[j + __mul24(3, i)] * left_tex[k + j];
c += matrix_right[j + __mul24(3, i)] * right_tex[k + j];
stereo_tex[k + i] = c;
c = 0.0f;

That function runs on the device (GPU) while the host side does the OpenGL stuff, besides calling the kernel code. A call to that function is done this way:

// executes the kernel
fuse_images<<< grid, threads >>>(cuda_left_tex, cuda_right_tex, cuda_stereo_tex,
getCudaMatrixFromMethod(method, isLeft), getCudaMatrixFromMethod(method, !isLeft), width, height);

I need to test this plugin in a CUDA device, since its emulation is working almost perfectly.
P.S.: Yeah, posting source code in wordpress sucks =/

October 30, 2007 Posted by | cuda, development, open source, opengl, openstereo, stereoscopy | 1 Comment

GLUCo 0.1.1

This release fixes a compilation problem under Windows. You can grab the code at the project site.

July 29, 2007 Posted by | gluco, linux, open source, opengl, portable, release, windows | Leave a comment

GLUCo 0.1

The GLUCo 0.1 is released! By now, the GLUCo project provides basic window management in C and a ported demo of the NeHe‘s Lesson 5. I haven’t tested it on windows, but it may compile. If not, I’ll test later and release a new version.

In the following screencast, you can see what’s GLUCo is capable of:

And also with this release, an issue remains open.

July 29, 2007 Posted by | gluco, linux, nehe, open source, opengl, release, screencast | Leave a comment

GLUCo Window Manager

By this time I am committing an initial working on linux (I didn’t try to compile it on Windows yet) code of the window manager. It contains some bugs that I’ll try to fix later. But at least you can have the feeling of multiple windows!

You can grab the source code at the GLUCo repository here.

July 28, 2007 Posted by | development, gluco, linux, open source, opengl | Leave a comment

GLUCo Progress

So, I already started to work on GLUCo and I’m getting things pretty well defined. I’m using old ideas of mine to make a window manager over glut, where the developer can create as many windows he/she needs. To write such manager, I’ll use the Glib library for data types an algorithms. Of course I won’t use the full support that Glib can give, so I am thinking whether use Glib is or is not a good idea. The immediate impact could be: C++ applications don’t need Glib for algorithms, since they have STL. Anyway, I’ll use Glib and later decide its fate.

July 27, 2007 Posted by | development, gluco, linux, opengl, portable, windows | Leave a comment

GLUCo Project

I know that NeHe provides a interface to picture loading or even a GLaux replacement. Also a simple base code or a more complete one (currently in beta). But they’re not so portable, so you need to adjust the code to fit your platform. With this problems in mind, I just realized that I could write a simple base code, unifying the development for Windows and Linux (I currently don’t have an MacOS). I pretend to use multi-platform libraries such as DevIL (a.k.a. OpenIL) to image loading, freeglut for windowing and keyboard/mouse input, and OpenGL for graphics, of course. This means another open source project of my own is emerging on the road: GLUCo (OpenGL Unified Code).

Consequently, the porting marathon will be “interrupted” (well, I’ll use GLUCo to continue the marathon in a more cleaner and portable way) to favor this simple-yet-powerful base code. Oh and I almost forgot, GLUCo will be written in C, so C and C++ applications can easily integrate it.

July 26, 2007 Posted by | development, gluco, linux, nehe, open source, opengl, windows | Leave a comment

NeHe’s Lessons

Suddenly this will of port every single lesson at NeHe’s site to OpenStereo (compiling under Linux and Windows) took me. Comparing the results obtained against the original ones can lead me to fix some undiscovered bugs in OpenStereo. So, let the porting marathon begin!

P.S.: Obviously, I’ll contact the team to release the ported source code.

July 26, 2007 Posted by | development, linux, nehe, open source, opengl, openstereo, stereoscopy, windows | Leave a comment

OpenStereo 0.1.0

Today, I decided to release the first version of OpenStereo under the LGPL v2 license (maybe I’ll consider the LGPL v3 after reading it ;). OpenStereo was my graduation thesis, or graduation conclusion work, if this suits you well and now is my open source project. It was presented on October 2006, but only now I decided to release it, even it meant to be an open source project.

Starting from 0.1.0, the OpenStereo library provides multi-platform support for development of real time stereoscopic applications. It’s based on a plugin subsystem, which abstracts the underlying graphics system. At the current time, only OpenGL applications are supported, but one plugin subsystem’s advantage is that a DirectX plugin can be written, enabling DirectX applications to be developed with and/or ported to OpenStereo. Of course, this is a future work. What I have on 0.1.0 is, though, a fragile not so well defined architecture, once it appears more like a plugin subsystem, than a stereoscopic library. Indeed, the libSL only does a good plugin management, but as time goes by, such architecture will evolve into a more robust one. Fortunately, it works! Applications can be more immersible than ever, all of this without requiring the user to buy expensive graphics cards or equipment like HMD glasses (indeed it’s necessary that the user have, at least, a red-blue anaglyph glass).

For a quick preview of what OpenStereo can do, let’s take the NeHe’s Lesson 26. This lesson teaches how to create “EXTREMELLY realistic reflections”, as the text states. The following screenshot shows the application running in 3D mode, the way it was meant to be:

NeHe's Lesson 26

First of all, some modifications were made on the code, so the application code can be compiled on both Windows and Linux environments. OpenStereo was embedded on the code to gather the function that draws the scene, thus allowing left and right pairs image generation (OpenStereo uses the anaglyph method to generate stereoscopic output). Camera values were correctly configured, including support to update eye separation and anaglyph method values with keyboard. After all these modifications (simple ones), the final result can be seen on the following screenshot:

NeHe's Lesson 26 ported to OpenStereo

Any application that uses OpenStereo will suffer from a performance penalty, mainly because OpenStereo needs to 1) render the scene twice, generating the left and right images and 2) fuse and present them to the screen. The fusion part generally depends on the selected plugin (this might be OpenStereo’s job and not plugin’s one).

The OpenStereo source code comes along with three plugins: one that fuses the images at the CPU level, gathering left and right images through glReadPixels; one that fuses images using the Cg Toolkit library (this dependency will be soon removed, using only OpenGL 2.0 and the ARB extensions to apply a pixel shader) at the GPU level, where the left and right images are gathered through glTexCopySubImage2D; and finally one that uses the same fusion process defined by the previous plugin, only that the scene is rendered directly into a framebuffer object, through the framebuffer object extension.

Some work must be done to ensure that the architecture will generate the stereoscopic output at the library level, not at the plugin level. Also, new plugins to DirectX (or this could be done on the architecture?) must be developed, providing support for a wide range of applications and platforms (hardware and software).

The OpenStereo source code will soon (this week) be available at OpenStereo’s Google Code project site.

July 26, 2007 Posted by | directx, linux, nehe, open source, opengl, openstereo, portable, release, screenshot, stereoscopy, windows | Leave a comment