FxEngine is a 3d graphics engine developed by the author of this site using the 3d hardware to its
limits and it's intended to
be a good resource to learn from, therefore I will present to you FxEngine along with sourcecode
which you can learn from and probably doing your own
3d engine (with your own effects hopefully).
There is just one thing to remember: I would really like to hear from you
who uses FxEngine. Tell me what you like, what you doesn't like and give
me some tip on how to improve it or even better: contribute with your own sourcecode.
In that way we all is going to learn from eachother and make even better things!
Currently supported features: (v0.41)
- Dithered bilinear filtered texture mapping
- Enviroment mapping
- Unlimited amount of RGB lightsources
- Landscape rendering
- Loading of heightmaps for landscape rendering (from I8 64x64 3df files)
- Unlimited amount of objects
- Translucent objects
- 3ds loader
- Real 3d clipping
- Multiple Camera support
- Gouraud shading
- Simulated phong shading (trough enviroment mapping)
- Collision detection (Object-Object and Object-Landscape)
- Object loader utility functions
- Particle system
- Lensflare effects
- Can specify different 3d rendering windows.
- Light mapping on landscapes.
- 2d text functions
- Smoke effects
- Nice restoring/loosing of focus for FxEngine applications.
(you know the irretating problem when you accidently hit the ALT-TAB key..)
- Skybox support
- Texture system which only loads required textures and with a texture cache
system that caches textures in system ram that can't fit in texture memory.
How do I contribute?
What you can do is either take a function and reprogram it keeping the inteface the same
or doing your own function, each function in FxEngine has
the prefix fxe and then the rest of the function name is given. The function names
should be selfexplained and heavily commented so users understand whats going on.
Along with your functions or datastructures or whatever send in a little textfile which
describes what your piece of code does so the rest of us doesn't get to frusterated : )
You shall send in the sourcecode to me this way.
How can I download FxEngine?
You can download everything needed to code FxEngine applications and the
sourcecode in a single package
To install FxEngine, unzip it to a root directory
on one of your drives. It is important you unzip it into a root directory.
Don't worry about FxEngine will install itself into the root directory because
it is installed in the \3dfx\fxengine\ directory when unzipping into a root directory.
Important notes for the demonstration programs
To be able to run FxeWinTest with the old engine (v0.31) you need glide2x.dll in your c:\windows\system
directory. Yes, exactly that directory.
Portability - To use FxEngine on different plattforms
FxEngine v0.41 successfully compiles on MSVC++ 5.0. I hope
it will work on the most compilers out there.
If you only want to use FxEngine without using the source you can use Delphi too.
Just you the fxengine.pas unit in the delphi directory.
Doom5 is now finished with the FxEngine port to linux (v0.31). You can download it now!
- Translucent polygons doesn't work.
- Z sorting of particle system and smoke system doesn't work right.
Performance of FxEngine
- Can render 100k triangles/sec on a p266mmx, 64mb ram with v2 using trilinear filtered
gouraud shading and one lightsource. On my machine the highest possibe polygon
throughput have been measured to 115k polys/second using flat shading.
What about documentation?
From version 0.2 and up FxEngine have its own documentation.
I recommends readers of the documentation to use win95 Wordpad and not MS Word as
the documentation is written in Wordpad. Be aware of that the documentation is
far from complete, I will improve it when I have time. Maybe I will convert it to
html so you can read it online if you want.
You can also check out the new FxEngine tutorials I have written, I hope
these tutorials will make it easier to understand and use FxEngine.
The documentation is in the FxEngine package which concists of the FxEngine
headerfiles, libraryfiles, sources and documentation.
And some screenshots!
These screenshots were taken from FxeWinTest with FxEngine version 0.31/0.35/0.37/0.40
on a 3d blaster voodoo2 at 800x600 and with trilinear filtering enabled.
It looks pretty good to me. Click on the pictures to enlarge them.
Currently Plans for FxEngine
bump mapping, BSP rendering, maybe OpenGL support. Explosion(!) routines...
Version 1.0: This version is the FINAL version. When this version is coming is
hard to tell right now as I have so much things I want to implement.
FxEngine 0.41 is uploaded!
I want to begin with saying that FxEngine now is over a half year old. I have worked
on FxEngine in my freetime for a half year although not very hard lately...
Because of this I hope someone of you out there finds the engine useful. A lot
of people have had problems of using it much because of its lack of documentation.
I really hope the tutorials can be written soon... The problem is that the coding
takes up all my time.
So what can I say about the new features of FxEngine 0.41?
Well, here is a list:
- I have coded a new texture cache system which can cache textures in system ram that
there isn't room for on 3dfx card. In FxEngine 0.40 the engine did just lookup
when there wasn't any texture memory left. This wasn't good, I agree. For speed
reasons the best thing of course still is too use as small textures as possible
to save texture memory. But you can load many large textures if you want now.
- When the application using FxEngine lost its focus because the user pressed the
ALT-TAB key the application failed to restore itself when it recieved focus
again. This is fixed now. When your application is inactivated then call the
fxeLooseFocus function and when your application is receiving focus again call the
fxeSetFocus function. Check out the fxewintest2 program for the details.
- Fixed some problems in the Delphi port, I had left some function prototypes out from the
fxengine.pas file but now they should be there.
- Enviroment mapping should work fine now.
- Fixed problem with the lensflare effect causing the lensflare to display although
the lightsource was behind a object or a landscape.
Hello, if you haven't noticed finally version 0.40 is online.
I have put a big effort in this release. New is support for
light mapping on landscapes, it really looks good. New support for dynamic lightsources. Simple lightsources that only
have a r,g,b intensity and a radius around it. Good if you want explosions and the like. Also support for Delphi,
now you can use Delphi too if you want to use FxEngine. Just use the
new fxengine.pas unit in the delphi directory. Better support for v1 and
voodoo rush in this release since FxEngine is not using clip coordinates anymore,
which have been a problem in Glide3 drivers for these cards. Of course
some bugfixes is also included in this release although I think that this
release will introduce some new ones too ;)
I have been gone a while since last time. I have been very busy and I haven't time to code much on
the engine. Now it should work fine on voodoo1 and
voodoo rush since I have a separate version now that not it using clip coordinates,
clip coordinates doesn't seem to work at all on these cards. I have had a report of that
FxEngine crashed on a voodoo rush when calling this glide function:
Can you imagine that? It isn't even POSSIBLE to initialize clip coordinates in on a voodoo rush!
Also I have had a report from a guy that asked 3dfx what to do about it. The answer was really lame:
"Don't use clip coordinates"
That's why my engine haven't worked for you v1 and voodoo rush owners out there...
What's the new features of FxEngine 0.38 then? Well now you can specify a 3d render window anywhere
on your screen, also added function for collision detection Landscape-Object. Also implemented Lens Flares
(Many thanks goes to Daniel M Jones for the Lensflare and Terrain Following).
FxEngine 0.37 is online. I have implemented the particle system I talked about and it looks
very good. It is very much based on the particle system by Daniel M Jones that was written for
the old engine for MSVC (v0.31) using glide2. Also I have extented the collision detection routines to detect collisions between
landscape and object. I have added a function for loading a heightmap from a 3df file that is used
for landscape rendering. It is very easy to design your own landscapes now I think.
(Just make a 64x64 grayscale tga image in Paint Shop Pro then convert it to a 3df file
in the i8 (intensity 8 format) with the texus utility). This way you can design a landscape in
a matter of minutes. I have fixed several bugs also as usual. Especially the clipping bugs
in the landscape renderer. The engine have been tested on voodoo2
with the newest glide3 reference drivers from 3dfx, I recommends all of you too download these
drivers as they finally seems to be stable...
I have also rewritten the documentation for FxEngine including some tutorials I have put up on this site.
I hope that with these tutorials and better documentation FxEngine will be more easy to use.
In this version FxEngine is shipped as a static linked library instead of a dll. It have been
compiled successfully with MSVC++ 5.0.
I have optimized the shading function, the engine now precalculates the normals of all polygons
(much faster than calculating them in real time...)
I have worked on a system to load textures, objects and so on from the exefile instead of loading files from
disk, for the moment it works with 3ds files.
FxEngine is now (again) shipped as a single package with everything you need to use and compile FxEngine.
So what am I currently working on?
I want to rewrite the character set loading functions so that all characters of a characterset
can coexist in the same 3df file instead of a file for every character. Also memory requirement optimizations is to
expect. I know that when large objects is loaded (10000 polys) then
they eats terribly much memory.
FxEngine 0.36 is online. I have fixed slow z sorting with translucent polygons.
Implemented collision detection (Object-Object) and multiple camera support. Also
you can now lock a camera at a object. When the camera is locked it will always look
in the direction towards the object it is locked on. I have written some object loader
utility functions, it will make it easier to make new object loaders for FxEngine than
before. The reason why I did these functions is mainly because a user of FxEngine wanted
to code a md2 (quake2 model) object loader for FxEngine but he was he was very confused
of the object structure of FxEngine (I can't blame him...). The object loader utility functions
is functions to perform default initialization of a object. Add vertices and polygons to
it and so forth. It will be much easier to write object loaders for FxEngine now I think.
My current plans right now is to implement the particle system you could see in FxEngine 0.30
for MSVC++ in the new version of FxEngine. (In the FxEngine glide3 driver). The
main reason for this is that it looks VERY good. Also I want to precalculate the normals
of all polygons to speedup the engine. This will probably be in version 0.37.
Finally FxEngine 0.35 is out. I think it's enough bugfree now to release
Included landscape and fogging support in FxEngine 0.35. Fixed camera bug. Fixed
3ds loader bug + some more I have forgot by now.
FxEngine is now fully compatible with MSVC++ 5.0. I have compiled the engine and the samples
successfully. The 3ds loader is still some buggy, the normals screw up so the
backface removal code is removing wrong polygons and the lightning function
lits object in the wrong direction. I'm working on this.
I have made several bugfixes in the FxEngine 0.35 glide3 beta driver (not in 3dfx own ;-).
Particularly the lightning functions
which crashed if some 3ds objects was loaded. Also flat shading should work properly.
I hope this version now will work with voodoo1. Maybe the reason why it didn't work was
the buggy lightning routines... Download the glide3 beta driver I put up for voodoo1 and try that too and
see if it helps. With this driver FxEngine have never crashed on my computer, yet...
The only things that not is working in this version is landscape rendering and fogging.
Soon I hope I can release the real FxEngine 0.35 Glide3 driver. In this version everything
must work, yes landscapes and fogging too.
I now have done a completely new structure of FxEngine. FxEngine now use drivers in
Dll's instead of statically libraries. This makes it much easier to make bugfixes,
you don't need to recompile your applications, just copy the new dll into the directory
where the exefile of the application is. This also makes it possible to use different
drivers for different hardware. Currently FxEngine only have a glide3 driver but
a OpenGL driver is planned. You can have different drivers installed and when your
FxEngine application is starting up you can choose which driver you want to use.
I also fixed some bugs in the glide3 driver, It now starts up in 60Hz instead of 85 Hz.
Maybe this was why 0.35 didn't work on v1.
I have fixed some bugs in FxEngine 0.35. Transparent objects works now,
the 3d clipping works too. The clipping routines was very hard too write
but I hope 3d clipping will work properly now... The landscape renderer
doesn't work well on glide3 yet, I'm working on it. When finished
I will upload the real FxEngine 0.35, not beta anymore. I don't want
you too use buggy software, that's why.
Do you wonder why FxEngine haven't been updated I say it's for good reasons.
I have been working with glide3 very much and have so much trouble using its
new features I think a article about it is just a must read!
The glide3 programmers reference have many bugs I have discovered. I have
found out some very strange bugs in it. It can of cource be explained with
buggy glide3 drivers.
Don't misunderstand me: The new glide3 seems very good but now as a start
we maybe have to live with some bugs until they have been fixed.
Also I have delved into BSP trees, it was harder than I thought...
A beta of version 0.35 is available for download!
Be aware that this version is very unstable and have a lot of bugs in the code.
The clipping code doesn't work, landscapes don't and a lot of other things.
So what do you get? A lot of bugs???
You get a version of FxEngine that demonstrates a engine running on top of glide3x,
a 1.5x performance increase, support for enviroment mapping and a working 3ds loader
that can load geometry data and materials from 3ds files.
Also added in this version some new functions for 2d bitmap rendering.
Also I have heard of a camera bug, I will fix it as soon as possible. A guy who is
calling himself doom5 is doing a port of FxEngine to linux, it will hopefully be finished
in a couple of days.
Glide3x is really a topic of itself, I downloaded the reference drivers from 3dfx and
they was VERY buggy, I recieved new drivers from 3dfx for a weak ago, and they worked
pretty good, not perfect but pretty good. I think that we have too wait for better
drivers from our card manufacturers before we get stable glide3 drivers.
Especially the voodoo rush drivers for glide3 seems not to work properly. FxeWinTest
(a demonstration program in FxEngine) runs fine on my v2 but crashes on a voodoo rush.
If anyone have a voodoo rush and feel for coding, please take a look at the sources and
tell me what's wrong. As I don't have a voodoo rush I can't test it on such a card. I
really want FxEngine to be a stable peace of software :)
I'm currently working on 3d clipping routines, the clipper is broken right now.
The clipping will be real 3d clipping, this is a MUST in glide3 with clip coordinates,
as glide3 is performing perspective projection the clipping can't be done in 2d.
Version 0.31 of FxEngine is online!
I haven't had much time to code the last days but I have implemented
some 2d text routines. Very simple but very useful. You can zoom in/out
your text and make it translucent. You also can discard a choosen color
completely. Like a bluescreen effect used in the movies.
I have recieved a message from one of my readers that he wants a 3ds
loader for FxEngine and I'm currently working on one. The 3ds format
is probably the best format for a loader since there is many programs
that can convert to this format and of cource it is used by the
3d studio modeller too. When this loader is finished it will be more
easy to use FxEngine, you don't need to hardcode your objects...
Version 0.3 of FxEngine at last...
I have coded like a svine and the sources have grown a bit. I have made
some assembly level optimizations of some math routines. I have implemented
landscape rendering. I had not thought about it until for a weak ago when I started
to implement it. I was just bored of the black background of my objects so I was
forced to do this...
One thing was true, I have implemented transparency in this version. I have rewritten
the manual a bit and rewritten the demonstration programs. Currently
working on enviroment mapping, animation routines and multiple camera support.
Version 0.24 of FxEngine is here. I have implemented flat shading (although I
don't think you will have any use for it unless for speed reasons) and optimized the
ShadeObjects function. This single optimization made unbeliveable results.
FxeWinTest ran 3.8 times faster when the function was optimized! Also I optimized
the Projection/Render function which now is the main bottleneck for speed. These
optimizations made FxEngine render over 30000 polygons/second with voodoo2 at 800x600
with gouraud shading, trilinear filtering and three different RGB lightsources on a
P233 MMX and
I haven't optimized it very much yet. That is a nice 5 times speedup since last version.
I said that FxEngine should render at least
15-20 thousand polygons per second when finished. I have now changed it to at least
around 100k polygons/second. When I saw that a 3dengine could render
150k polygons/second on a voodoo1 with a P200 I saw that my engines speed must be very poor...
But that engine only used flat shading and 640*480 without texture mapping...
Anyway, more optimizations is coming!
I have also corrected the gouraud shading functionality, it should work perfect now. I
have also changed some of the datastructures to be more effective when used with FxEngine.
I have implemented new properties of a lightsource, except the position and r,g,b componponents
of a lightsource it can also affect objects in a given distance differently depending
on the value of a new datamember in the lightsource structure. This means that a lightsource
can give light on objects far away from it or only very close to it depending on this
new datamember. Also I have rewritten the demonstration program to have 10 objects
with various captions and variable lightsources. Use the L key to change lighting mode.
I think FxeWinTest is beginning to be quite cool!
Version 0.23 of FxEngine. Now the 3d clipping should work rock solid! The 3d
clipping was quite a challange when you consider you need to find new
coordinates of the polygon when the polygon intersects with the near clipping
plane. (You have to clip to this plane as you must avoid divide by Zero)
You not only need to clip the polygons, you need to clip the textures
too if any texture is used on a polygon. I have worked with this single problem
for at least a couple of days now but now I think it is solved.
(After some resarch in one of Michael Abrash's great books, specifically
Graphics Programming Black Book - a MUST READ for performance graphics programmers
I have optimized
a bit at the fundamental level too. I have also implemented a very simple form
of fogging. If you want your objects can now fade away with fog in any color.
Also I have began coding on some 2d text functions. It is very easy to implement
cool text effects with Glide. You only draws a rectangle polygon and maps a
texture on it that looks like a character. You can easily use transparent text
and zoom it in and out as you want. I must say that Glide is really a very good
API. It's only a pity that Glide is only supported by 3dfx cards. Now with the
new Banchee chip coming strong we at least have one more card that will support
Glide! You can of cource expect me to finish the text functions and now I will
work most on implementing Enviroment Mapping. I have actually done some code for
it already but it isn't really finished yet.
Version 0.22 of FxEngine. I have added a cylinder creation function, it
doesn't really extend FxEngine but make it possible to test FxEngines
speed because cylinders have a LOT of polygons. When I tested out
FxEngine with the cylinders I directly noticed that currently FxEngines
speed is quite poor because on a P233 MMX with voodoo2 at 800x600 it can take no more
than around 6000 textured, gouraud shaded, z buffered polygons with three lightsources
at once without
starting to slow down and my goal
is at least around 15-20 thousand polygons per second on that machine.
I have also made a new polygon clipper and have made some performance tuning
(not very much). The backface culling works perfect now and the object clipper
works better than before. A great deal of work have been the clipping functions
as you see and now when the 3d cards is selling more and more and the cards take
over the rendering the clipping is going to be one of the the most important parts to
do well to make a good 3dengine. The polygon clipper is going to be improved,
it shall clip polygons that are only partly visible which will eliminate the
slow clipping on the 3dfx cards.
The improvements in FxEngine is now
most concentrated around clipping and enviromental mapping. Now you
can notice a speed decrease when a object is moved away from the
screen as the 3dfx card tries to clip the polygons. The 3dfx card is
INCREDIBLY slow at clipping and that's why it all slows down.
The lightning function must be totally rewritten as it's very slow.
And I don't even have mentioned all math functions that will be converted
to assembly language.
Version 0.21 of FxEngine is out. A nice guy called Hugues Landry have
contributed with some matrix math. The matrix math functions is now
used in FxEngines object rotation and world to camera transformation
functions. Thanks you Hugues for this. I have also implemented some
new functions but most of them are transparent for the application
programmer. Mostly it is optimizations in the fxeRenderWorld function.
New is support for ambient light (I know - it was VERY EASY to implement
this) through the fxeAmbientlightLight function. The documentation have
been altered so you better read it! Some minor changes in the
datastructures, they should be some nicer now I hope. Currently
I'm working on a object loader function so you don't need to hardcode
every single object... You can expect the object loader to be finished
in version 0.3 of FxEngine.
Version 0.2 of FxEngine is here, FxEngine now supports real world to
camera transformations making it possible to move around in your
universes! I have also been working on the ClipObject function but
it isn't finished yet. For the moment I'm concentrating on making
FxEngine bugfree and fast. A reader will perhaps contribute with some
matrix math which will make the overall performance better when
many polygons is involved. I have also made a new demo program showing
of the camera transformation functionality in FxEngine. The new demo
program is a win32 windowed executable, not console anymore. Don't
worry because no changes have to be made to FxEngine because of this,
the API is the same as before. Just remember to link the demo program
as a win32 windowed application or else it will not work. As mentioned above
FxEngine now have documentation making it easier to use it than before.
There is pretty much info in there! Since version 0.1 some bugfixes have
The Second release of FxEngine is here, now FxEngine supports texture
mapping with trilinear filtering on a voodoo2 and bilinear filtering on
voodoo cards. Some bugfixes too. Also updated the demonstration program
to support FxEngine's new texture capabilities and now the demo should
work fine on voodoo cards too.
The first release of FxEngine is online, this version supports a
unlimited amount of RBG lightsources, backface removal, object rotation
and translation along with gouraud shading. It isn't very advanced yet
but I think it's a good
way to learn 3d engine programming on the 3dfx. You can run FxEngine
in different modes depending on your hardware. You can run it on
voodoo using the lowest setting and on a voodoo2 using a higher setting.
The code is a mess right now but I will improve this, the main reason I have
put up FxEngine now is because I wanted to release something for you to
see, I think the RGB lightning is quite cool! That's all for now, MORE stuff