Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectX&C++&Объемный туман, не заполняються текстуры 
:(
    Опции темы
kurlyak
Дата 14.4.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 7.11.2007

Репутация: 1
Всего: 3



Нашел статью по объемному туману http://timai-ru.blogspot.com/search/label/demo%20fog. Пробывал делать, но в результате у меня выводиться черный куб. Ландшафт рисуеться нормально.
Сначала я рисую ландшафт, потом снимаю в текстуру глубину сцены рисуя этот же ландшафт, потом снимаю в текстуру заднюю стенку тумана, потом снимаю в текстуру переднюю стенку тумана. У меня есть теперь три текстуры. Но куб - основа моего тумана мешь куба - выводиться черным цветом и четкими границами - то есть вобще никакого подобия тумана. То есть у меня не правильно заносяться в текстуры значения глубин. Кто подскажет почему? Вот код:
Код

p_d3d_Device->BeginScene ();

D3DXMATRIX m_matRes;
m_matRes = m_matWorld * m_matView * m_matProj;
D3DXMatrixTranspose(&m_matRes,&m_matRes);

LPDIRECT3DSURFACE9 pSurface;
p_d3d_Device->SetRenderTarget( 0, m_pOldRenderTarget );
//рисуем нормально сцену без фога
p_d3d_Device->SetPixelShader(0);

p_d3d_Device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);


p_d3d_Device->Clear(0, NULL, D3DCLEAR_TARGET  ,
                                  D3DCOLOR_ARGB( 0x00, 0x00, 0x00, 0x00), 1.0,0);

    
p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

p_d3d_Device->SetStreamSource( 0, m_pLandVB, 0, sizeof(D3DVERTEX) );
p_d3d_Device->SetIndices( m_pLandIB );

p_d3d_Device->SetMaterial(g_pMeshMaterialsLand);
p_d3d_Device->SetTexture(0,g_pMeshTexturesLand);

p_d3d_Device->SetVertexShaderConstantF(4, (float*)&m_matRes,4);

p_d3d_Device->SetVertexDeclaration( m_pLandVertexDeclaration );
p_d3d_Device->SetVertexShader( m_pLandVertexShader );
        

p_d3d_Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumLandVertices,
                                            0, m_dwNumLandFaces );
        
p_d3d_Device->SetRenderTarget( 0, m_pOldRenderTarget );

D3DXMATRIX m_ResMat = m_matWorld*m_matView*m_matProj;
Depth_VS_ConstTable->SetMatrix(p_d3d_Device, WorldViewProjMatrixHandle, &m_ResMat);
//снимаем дистанцию сцены

p_d3d_Device->SetTexture(0,NULL);
p_d3d_Device->SetTexture(1,NULL);
p_d3d_Device->SetTexture(2,NULL);
p_d3d_Device->SetTexture(3,NULL);

p_d3d_Device->SetPixelShader(0);
    
p_d3d_Device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
p_d3d_Device->SetRenderState(D3DRS_ZENABLE, TRUE);
p_d3d_Device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); 

m_pSceneDist->GetSurfaceLevel(0,&pSurface);
p_d3d_Device->SetRenderTarget( 0, pSurface );
      
p_d3d_Device->Clear(0, NULL, D3DCLEAR_TARGET  ,
                                 D3DCOLOR_ARGB( 0x00, 0x00, 0x00, 0x00), 1.0,0);

p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

p_d3d_Device->SetVertexShaderConstantF(4, (float*)&m_matRes,4);

p_d3d_Device->SetStreamSource( 0, m_pLandVB, 0, sizeof(D3DVERTEX) );
p_d3d_Device->SetIndices( m_pLandIB );

p_d3d_Device->SetVertexShader( Depth_VS_Shader );
p_d3d_Device->SetPixelShader( Depth_PS_Shader );


p_d3d_Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumLandVertices,
                                            0, m_dwNumLandFaces );

//снимаем заднюю стенку фога
p_d3d_Device->SetRenderTarget( 0, m_pOldRenderTarget );
        
m_pBackFogDist->GetSurfaceLevel(0,&pSurface);
p_d3d_Device->SetRenderTarget( 0, pSurface );

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

p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

p_d3d_Device->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER);

p_d3d_Device->SetStreamSource( 0, m_pFogVB, 0, sizeof(D3DVERTEX) );
p_d3d_Device->SetIndices( m_pFogIB );

p_d3d_Device->SetVertexShader( Depth_VS_Shader );
p_d3d_Device->SetPixelShader( Depth_PS_Shader );

p_d3d_Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumMeshFogVertices,
                                            0, m_dwNumMeshFogFaces );
//снимаем переднюю стенку фога

m_pFrontFogDist->GetSurfaceLevel(0, &pSurface);
p_d3d_Device->SetRenderTarget( 0, pSurface );

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

p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

p_d3d_Device->SetStreamSource( 0, m_pFogVB, 0, sizeof(D3DVERTEX) );
p_d3d_Device->SetIndices( m_pFogIB );

p_d3d_Device->SetVertexShader( Depth_VS_Shader );
p_d3d_Device->SetPixelShader( Depth_PS_Shader );

p_d3d_Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumMeshFogVertices,
                                            0, m_dwNumMeshFogFaces );

//рисуем фог
        
p_d3d_Device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);

p_d3d_Device->SetRenderTarget( 0, m_pOldRenderTarget );

p_d3d_Device->Clear(0, NULL, NULL  ,
                                 D3DCOLOR_ARGB( 0x00, 0x00, 0x00, 0x00), 1.0,0);

p_d3d_Device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
p_d3d_Device->SetRenderState(D3DRS_ZENABLE, TRUE);
p_d3d_Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); 
  

    //p_d3d_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
    //p_d3d_Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    //p_d3d_Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    
p_d3d_Device->SetTexture(FogBackDesc.RegisterIndex,m_pBackFogDist);
p_d3d_Device->SetTexture(FogFrontDesc.RegisterIndex,m_pFrontFogDist);
p_d3d_Device->SetTexture(SDepthDesc.RegisterIndex,m_pSceneDist);

p_d3d_Device->SetSamplerState(FogBackDesc.RegisterIndex,
                                  D3DSAMP_MAGFILTER, D3DTEXF_POINT);
p_d3d_Device->SetSamplerState(FogBackDesc.RegisterIndex,
                                  D3DSAMP_MINFILTER, D3DTEXF_POINT);
p_d3d_Device->SetSamplerState(FogBackDesc.RegisterIndex,
                                  D3DSAMP_MIPFILTER, D3DTEXF_NONE);


p_d3d_Device->SetSamplerState(FogFrontDesc.RegisterIndex,
                                  D3DSAMP_MAGFILTER, D3DTEXF_POINT);
p_d3d_Device->SetSamplerState(FogFrontDesc.RegisterIndex,
                                  D3DSAMP_MINFILTER, D3DTEXF_POINT);
p_d3d_Device->SetSamplerState(FogFrontDesc.RegisterIndex,
                                  D3DSAMP_MIPFILTER, D3DTEXF_NONE);

p_d3d_Device->SetSamplerState(SDepthDesc.RegisterIndex,
                                  D3DSAMP_MAGFILTER, D3DTEXF_POINT);
p_d3d_Device->SetSamplerState(SDepthDesc.RegisterIndex,
                                  D3DSAMP_MINFILTER, D3DTEXF_POINT);
p_d3d_Device->SetSamplerState(SDepthDesc.RegisterIndex,
                                  D3DSAMP_MIPFILTER, D3DTEXF_NONE);

p_d3d_Device->SetStreamSource( 0, m_pFogVB, 0, sizeof(D3DVERTEX) );
p_d3d_Device->SetIndices( m_pFogIB );
    
p_d3d_Device->SetPixelShader( Fog_PS_Shader );
    
p_d3d_Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumMeshFogVertices,
                                            0, m_dwNumMeshFogFaces );


p_d3d_Device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);  

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


Вот вершинный и пиксельный шейдеры снятия глубины:
Код

float4x4 g_wvp;

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

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

А вот шейдер отрисовки тумана:
Код

    sampler2D s_fog_back;
    sampler2D s_fog_front;
    sampler2D s_scene_depth;

float3 fog_color={0.8,0.8,0.8};

struct PS_INPUT
{
     float2 s_fog_back      : TEXCOORD0;
     float2 s_fog_front        : TEXCOORD1;
     float2 s_scene_depth      : TEXCOORD2;
};


float4 ps_draw_fog( PS_INPUT input ) : COLOR
{
    float fog_back    = tex2D( s_fog_back    , input.s_fog_back ).r;
    float fog_front   = tex2D( s_fog_front   , input.s_fog_front ).r;
    float scene_depth = tex2D( s_scene_depth , input.s_scene_depth ).r;
    
    float k = fog_back - fog_front;
    k -= fog_back - clamp( scene_depth, 0, fog_back );
    
    return float4( fog_color*k, 1.0  );
}

Все вроде как в статье но ничего не выходит. В чем может быть проблема?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.