Building a world space normal map using texture shader

Started by
0 comments, last by sipickles 18 years ago
Hello, As the subject suggests, I am trying to use a texture shader to generate a world space normal map from a heightmap at initialisation. My question is, can I use the textureshader to sample another texture (ie the heightmap) This is the sort of thing I want in the shader:

// normalGen.fx  - uses a texture Shader to procedurally generate a normal map from the supplied heightmap

// Texture
texture heightMap;

sampler heightSampler = sampler_state
{
    Texture   = (heightMap);
    AddressU  = CLAMP;        
    AddressV  = CLAMP;
    AddressW  = CLAMP;
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
};


float4 TX( float2 Tex : POSITION ) : COLOR
{
        float stepsize = 0.001;

	// Get height from heightmap
	float4 Height1 = tex2D( heightSampler, Tex );
	float4 Height2 = tex2D( heightSampler, float2(Tex.x - stepsize, Tex.y );
	float4 Height2 = tex2D( heightSampler, float2(Tex.x, Tex.y + stepsize );
// etc ....to work out average normal at point

        // pack vector info into 0-1 range
	Normal *= 0.5;
	Normal += 0.5;
	return float4( Normal, 1.0 ); // return as a colour

}



This is how I am setting up:
HRESULT cTerrainManager::CreateNormalMap( void )
{
	HRESULT hr;

    LPD3DXBUFFER pShader = NULL;

	// Create the procedural texture
    hr = D3DXCompileShaderFromFile(
        L"data\\shaders\\normalGen.fx",
        NULL, // A NULL terminated array of D3DXMACROs
        NULL, // A #include handler
        "TX",  
        "tx_1_0", 
        D3DXSHADER_DEBUG,
        &pShader, 
        NULL,    // error messages 
        NULL );  // constant table pointer

    if( FAILED( hr ) )
    {
          SAFE_RELEASE( pShader );
        return hr;
    }

    // Procedurally fill texture
    hr = D3DXFillTextureTX( m_normalMap, (LPD3DXTEXTURESHADER)pShader->GetBufferPointer()  );
    if( FAILED( hr ) )
    {
        SAFE_RELEASE( m_normalMap );
        SAFE_RELEASE( pShader );
        return hr;
    }

	return S_OK;
}

Is this possible? how do I set the heightmap texture? Through a constant table perhaps? If this isnt possible, can I just do it with D3DXFillTexture and a software function? Its not a runtime thing so speed isnt so important. Thanks for your advice Simon
Advertisement
Maybe I'll just do it with D3DXFillTexture, since I have tha heightmap values in a huge array already.....

This topic is closed to new replies.

Advertisement