hanykom
Založen: 07. 12. 2009 Příspěvky: 4
|
Zaslal: 24. leden 2010, 14:50:58 Předmět: POMOZTE : Naplnění proměnné typu texture v HLSL DirectX9 |
|
|
Ahoj všem,
prosím mohl by mi někdo poradit, jak ve Visual C++ nastavit v pixel shaderu proměnnou typu texture, kterou ten PS pak dál používá? Ale zajímá mně práce jen se samotnýma shaderama - bez rozhraní ID3DXEffect. S Effectem už jsem to vyextrahoval z msdn tutoriálů.
Tady je kód toho shaderu, se kterým si lámu hlavu - je to na vrhání stínů. Na všechny ostatní datové typy existuje nastaovvací metoda, ale jen na tu texturu ne.
kód: |
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#define SHADOW_EPSILON 0.00005f
float4x4 g_mWorldView;
float4x4 g_mProj;
float4x4 g_mViewToLightProj; // Transform from view space to light projection space
float4 g_vMaterial;
texture g_txScene;
texture g_txShadow;
float3 g_vLightPos; // Light position in view space
float3 g_vLightDir; // Light direction in view space
float4 g_vLightDiffuse = float4( 1.0f, 1.0f, 1.0f, 1.0f ); // Light diffuse color
float4 g_vLightAmbient = float4( 0.3f, 0.3f, 0.3f, 1.0f ); // Use an ambient light of 0.3
float g_fCosTheta; // Cosine of theta of the spot light
uint SMAP_SIZE = 512;
sampler2D g_samScene =
sampler_state
{
Texture = <g_txScene>;
MinFilter = Point;
MagFilter = Linear;
MipFilter = Linear;
};
sampler2D g_samShadow =
sampler_state
{
Texture = <g_txShadow>;
MinFilter = Point;
MagFilter = Point;
MipFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};
//-----------------------------------------------------------------------------
// Pixel Shader: PixScene
// Desc: Process pixel (do per-pixel lighting) for enabled scene
//-----------------------------------------------------------------------------
float4 PixScene( float2 Tex : TEXCOORD0,
float4 vPos : TEXCOORD1,
float3 vNormal : TEXCOORD2,
float4 vPosLight : TEXCOORD3 ) : COLOR
{
float4 Diffuse;
// vLight is the unit vector from the light to this pixel
float3 vLight = normalize( float3( vPos - g_vLightPos ) );
// Compute diffuse from the light
if( dot( vLight, g_vLightDir ) > g_fCosTheta ) // Light must face the pixel (within Theta)
{
// Pixel is in lit area. Find out if it's
// in shadow using 2x2 percentage closest filtering
//transform from RT space to texture space.
float2 ShadowTexC = 0.5 * vPosLight.xy / vPosLight.w + float2( 0.5, 0.5 );
ShadowTexC.y = 1.0f - ShadowTexC.y;
// transform to texel space
float2 texelpos = SMAP_SIZE * ShadowTexC;
// Determine the lerp amounts
float2 lerps = frac( texelpos );
//read in bilerp stamp, doing the shadow checks
float sourcevals[4];
sourcevals[0] = (tex2D( g_samShadow, ShadowTexC ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
sourcevals[1] = (tex2D( g_samShadow, ShadowTexC + float2(1.0/SMAP_SIZE, 0) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
sourcevals[2] = (tex2D( g_samShadow, ShadowTexC + float2(0, 1.0/SMAP_SIZE) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
sourcevals[3] = (tex2D( g_samShadow, ShadowTexC + float2(1.0/SMAP_SIZE, 1.0/SMAP_SIZE) ) + SHADOW_EPSILON < vPosLight.z / vPosLight.w)? 0.0f: 1.0f;
// lerp between the shadow values to calculate our light amount
float LightAmount = lerp( lerp( sourcevals[0], sourcevals[1], lerps.x ),
lerp( sourcevals[2], sourcevals[3], lerps.x ),
lerps.y );
// Light it
Diffuse = ( saturate( dot( -vLight, normalize( vNormal ) ) ) * LightAmount * ( 1 - g_vLightAmbient ) + g_vLightAmbient )
* g_vMaterial;
} else
{
Diffuse = g_vLightAmbient * g_vMaterial;
}
return tex2D( g_samScene, Tex ) * Diffuse;
}
|
Prosím pomozte _________________ Nefunguje to |
|