Basic DirectX 9 shader tutorial

Started by
16 comments, last by AntonioR 12 years, 12 months ago
Hi,

does anyone know where I can find some tutorial about implementing DirectX pixel shaders ?

Or maybe some example code or project I could see?

I don't know nothing about it, just that it uses some .fx files.

I would like to use it in a 2D game (that uses LPD3DXSPRITE to draw textures).

Thanks!
Advertisement
Some hints or tips just to get me started ?

I basically just want to do something simple, like increasing or reducing brightness of the whole scene, like you can see in the link below.

facewound shader examples
My usual response:

Get Programming with DX9: A Shader Approach, by Frank Luna. It's very well done, and takes you from the verys basics to some pretty interesting effects.

If you can't get the book, I don't have any web resources handy. I've never searched extensively, but I'm sure you could find something.

Yeah i would point to frank d. luna too.
If you didnt find source code or whatsoever here is a link to his source code in shader approach book.
link .Still you will need the book to understand most of the things.
You can check out the samples and tutorials that come with the DirectX SDK.

MSDN also contain quite a lot of information, here for example.
Thanks guys for your response.

I was actually looking for something way simpler, written in "common english" since english is not my native tongue.

I found it last night here: http://www.two-kings...graphics18.html

So I used their method, and those "facewound" shaders, and it worked.

I was even able to figure out how "render to texture" works so I can apply a shader on the whole backbuffer / texture.

I will post some images later.
Today I figured out how to render to a texture, so I can now apply a shader on the whole scene. I also learned how to use ID3DXEffect Interface.
Also I managed to write my own two simple shaders: "simplify colors" and "flash light".

Credits go to Garry Newman : http://www.facewound...orials/shader1/
and Two-Kings: http://www.two-kings...als/dxgraphics/

Here are some pics:

NEGATIVE
projectstudenttoni20110.jpg

EMBOSSED
projectstudenttoni20110.jpg

BLACK AND WHITE
projectstudenttoni20110.jpg

SIMPLIFY COLORS (mine)
projectstudenttoni20110.jpg

FLASHLIGHT (mine)
projectstudenttoni20110.jpg
Nicely done!

You mentioned in your first post that you wanted to use the D3DXSprite interface with shaders... Is that the approach you used in your screenshots? If so, I'm curious about any hoops you needed to jump through to render your sprites with shaders. In the book I mentioned, the author introduces the interface but does not give any specifics about using the interface with shaders (...yet, I have not completed the book). I have not had the time to write tests myself, so I thought I'd take the easy way out... :unsure:

So, is it as simple setting the shader and rendering the sprites?

@DrunkMonkey25:

Yes, I use D3DXSprite to draw everything.
It ended up being really straight forward. This is the sprite draw method that I updated to use shaders. Sprite has a string "shader" which is used to set shader technique, if ShaderOn==true.
This way I can apply a different shader on every sprite I draw.

All sprites are drawn on the texture using this method, then that texture is drawn on the backbuffer (using the sprite handler (D3DXSprite) with a shader applied or not ) , and then I call Present.


void Sprite::draw()
{
//sprite transformation stuff

int fx = (this->curframe % this->animcolumns) * this->width;
int fy = (this->curframe / this->animcolumns) * this->height;
RECT srcRect = {fx,fy, fx+this->width, fy+this->height};

this->transform();
//

if (this->ShaderOn)
{
g_engine->p_effect->SetTechnique(this->shader.c_str());
UINT passes = 0;
g_engine->p_effect->Begin(&passes, 0);

g_engine->p_sprite_handler->Begin(D3DXSPRITE_ALPHABLEND);

if (passes>0)
{
g_engine->p_effect->BeginPass(i);
g_engine->getSpriteHandler()->Draw(this->image->GetTexture(),&srcRect,NULL,NULL,color);
}

g_engine->p_sprite_handler->End();

g_engine->p_effect->EndPass();
g_engine->p_effect->End();

}
else
{
g_engine->p_sprite_handler->Begin(D3DXSPRITE_ALPHABLEND);
g_engine->getSpriteHandler()->Draw(this->image->GetTexture(),&srcRect,NULL,NULL,color);
g_engine->p_sprite_handler->End();
}

}
I made a short video of some pixel shader examples and my vector mode (not a shader) which draws sprite's bounding box instead of the texture.

[media]
[/media]

This topic is closed to new replies.

Advertisement