Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > DirectX 9.0 и объемный туман


Автор: kurlyak 31.12.2009, 02:13
Кто - то может скинуть сюда исходники простенькие объемного тумана, а то у меня ничего не выходит.

Автор: BorisVorontsov 31.12.2009, 22:18
Пример SoftParticles из DX SDK считается "простеньким"?

Автор: kurlyak 1.1.2010, 16:16
Чего то я этот пример в СДК не вижу. за какой год СДК нужен?

Автор: BorisVorontsov 1.1.2010, 16:36
Пример относится к DX10. Ты же, наверно, смотришь примеры DX9...

Добавлено через 2 минуты и 4 секунды
Как альтернативу, можешь почитать эту статью: http://steps3d.narod.ru/tutorials/soft-particles-tutorial.html

Автор: kurlyak 2.1.2010, 19:24
Я немного разобрался что- к чему. Почитал статью http://timai-ru.blogspot.com/. Дело в том что я заношу начало тумана в одну текстуру, а конец тумана в другую потом в вершинном шейдере пытаюсь найти разницу. Но вроде я неправильно что то написал. Вот код: 
Первый вершинный шейдер m_pFogShaderDepth:
Код

float4x4 g_wvp;

void vs_depth( inout float4 pos   : POSITION  ,
                 out float  depth : TEXCOORD0 )
{
    pos = mul( pos, g_wvp );
    depth = pos.z;
}

Второй идет за ним пиксельный m_pPixShaderDepth:
Код

float4 ps_depth( in float depth : TEXCOORD0 ) : COLOR
{
    return float4( depth, 0.f, 0.f, 0.f );
}

И последний шейдер пиксельный m_pPixShader:
Код

sampler2D s_fog_back;
  sampler2D s_fog_front;
  sampler2D s_scene_depth;

float4 Main( in float2 tex : TEXCOORD0 ) : COLOR
{
    float fog_back    = tex2D( s_fog_back    , tex ).r;
    float fog_front   = tex2D( s_fog_front   , tex ).r;
    float scene_depth = tex2D( s_scene_depth , tex ).r;
    
    float k = fog_back - fog_front;
    k -= fog_back - clamp( scene_depth, 0, fog_back );
    
    return (float4( g_fog_color, k * g_fog_density ));

    return float4(0.5f,0.5f,0.5f, k*0.5f );
}

Код на С++:
Код

p_d3d_Device->Clear(NULL, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 0.0, 0);
p_d3d_Device->BeginScene ();

D3DXMATRIX V;
TheCamera.getViewMatrix(&V);

D3DXMATRIX matRes;

matRes=mxWorld*V*mxProj;

VertShaderConstTable->SetMatrix(p_d3d_Device, MatrixHandle, &matRes);

p_d3d_Device->SetPixelShader( NULL );


p_d3d_Device->SetRenderState( D3DRS_ZFUNC , D3DCMP_GREATER  );

p_d3d_Device->Clear(NULL, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER , D3DCOLOR_ARGB(0, 0, 0, 0), 0.0, 0);

p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

p_d3d_Device->SetTexture(0,m_pEndFogTexture);

p_d3d_Device->SetVertexShader( m_pFogShaderDepth );
p_d3d_Device->SetPixelShader( m_pPixShaderDepth );

    for( DWORD i=0; i<g_dwNumMaterials; i++ )
     {
     m_pMeshFloor->DrawSubset( i );
     }

p_d3d_Device->Clear(NULL, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER , D3DCOLOR_ARGB(0, 0, 0, 0), 0.0, 0);

p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

p_d3d_Device->SetTexture(0,m_pStartFogTexture);
    
p_d3d_Device->SetVertexShader( m_pFogShaderDepth );
p_d3d_Device->SetPixelShader( m_pPixShaderDepth );

for( DWORD i=0; i<g_dwNumMaterials; i++ )
     {
     m_pMeshFloor->DrawSubset( i );
     }

p_d3d_Device->SetRenderState( D3DRS_CULLMODE,         D3DCULL_NONE );

p_d3d_Device->SetPixelShader( m_pPixShader );

for( DWORD i=0; i<g_dwNumMaterials; i++ )
     {
     m_pMeshFloor->DrawSubset( i );
     }

p_d3d_Device->EndScene ();
p_d3d_Device->Present (NULL, NULL, NULL, NULL);

В итоге у меня рисуеться сплошной красный куб. Я перемещаюсь камерой - со всех сторон ярко красный куб. Что тут может быть? Подскажите кто знает пожалуйста.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)