New shader API in Residual Decay
Posted 2009-10-22
Soon shader API in Residual Decay will be updated once again - this time codebase will be common to all rendering devices (OpenGL, Direct3D 9 and Direct3D 10). The main advantage of this solution is that all function calls will be made in base rendering device code, so implementation in OGL/D3D will require calling only one function (and render specific code to compile a shader of course). Below code snippet:
#ifndef __NMSHADERAPI__
#define __NMSHADERAPI__
#define TEX_SCREEN1 0
#define TEX_SCREEN2 1
#define TEX_DIFF 2
//shader state
enum eShaderState
{
SHADER_Activated,
SHADER_Deactivated
};
//shader type
enum eShaderForm
{
SHADER_Fragment,
SHADER_Vertex
};
class NEMESISCORE_API UNMShaderProgram
{
public:
UBOOL bRequestedDestroy;
//empty constructor
UNMShaderProgram(){}
//main contructor
UNMShaderProgram( FString TargetClass, UViewport* nViewport, UNMSceneShader* nSceneShader )
{
bRequestedDestroy=0;
SceneShader=nSceneShader;
ApplyShaderClass(TargetClass);
ImportShader();
Viewport=nViewport;
CompileShader();
SetColor();
}
//true if shader is compiled
virtual UBOOL IsValid()
{
return bCompiled;
}
//applies shader name
void ApplyShaderClass(FString TargetClass)
{
if( ShaderClass != FString(TEXT("")) )
ReleaseShaderProgram();
ShaderClass=TargetClass;
}
//imports shader from nsh file
void ImportShader()
{
Shader = LoadObject( NULL, *ShaderClass, NULL, LOAD_NoWarn, NULL );
}
//set current color
void SetColor(FColor nColor=FColor(1,1,1,1))
{
Color=nColor;
}
//extended in subclasses
//generates empty texture
virtual void GenerateEmptyTexture(int Texture){}
//captures depth component
virtual void CaptureDepthTexture(int Texture){}
//render to texture
virtual void CaptureScreen(int Texture){}
//destroys texture
virtual void DestroyTexture(int Texture){}
//compiles shader
virtual void CompileShader(){ bCompiled=1; }
//release shader program
virtual void ReleaseShaderProgram(){}
//draw shader
virtual void DrawShader(ANMPlayerPawn* POwner){}
//To acces Render Device use:
// POwner->XLevel->Engine->GameRenderDeviceClass
protected:
UViewport* Viewport;
//current shader class
FString ShaderClass;
//shader pointer (use Shader->Data)
UNMShaderObject* Shader;
//Scene shader definition
UNMSceneShader* SceneShader;
//shader state
eShaderState CurrentState;
//shader type
eShaderForm CurrentType;
//color
FColor Color;
};
#endif