GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (145 стр.)

Сообщения на форуме пользователя Andrey (145 стр.)

рендеринг ландшафта. подскажите пути оптимизации.19 мар. 200712:54#162
Zemedelec
>Зачем так много вертексов? Нет LOD-a?
>Лучше толковъй LOD написать...
ну фиг знает я просто говорю размеры что-бы подчеркнуть бесконечность ландшафта.
При разбитии ID3DXEffect на IDirect3DPixelShader9/IDirect3DVertexShader9 неправльно работает :(19 мар. 200712:50#7
Coridas
>Потому что в обезьяне в шейдер передаются транспонированные матрицы.
ну а как быть с ID3DXEffect ? там тоже транспонированные?
NULL_PTR
Спасибо буду знать.
При разбитии ID3DXEffect на IDirect3DPixelShader9/IDirect3DVertexShader9 неправльно работает :(18 мар. 200723:53#3
Shockwave
>Выложи куда-нибудь проект из РэндерМанкей, а то так читать и разбираться в лом :)
http://www.gamedev.ru/download/?id=5196
Zeux
>SetPixelShaderConstantF(0, lightfalloff, 1)
спасибо большое!!!! как всегда подводит моя невнимательность уже какой раз :(
Вопрос в догонку почему в эффекте(так-же и в Render Monkey хотя там голые шейдеры) нужно писать перемножение  вектор = матрица * вектор :
OUT.Pos = mul(WorldViewProjection, IN.Pos);
а в шейдере наоборот(иначе рваные полигоны на экране)
OUT.Pos = mul(IN.Pos, WorldViewProjection);

При разбитии ID3DXEffect на IDirect3DPixelShader9/IDirect3DVertexShader9 неправльно работает :(18 мар. 200721:20#0
Привет всем!!!
Решил попробывать сделать попиксельное освещение ипользуя готовый пример с ID3DXEffect;

вот код эффекта:

uniform float4   LightPosition;          // World space light position
uniform float4   LightColor;             // Light color
uniform float4   MatColor;               // Color of the material
uniform float4x4 World;                  // World
uniform float4x4 WorldViewProjection;    // World * View * Projection matrix
uniform texture  RoomTexture;            // Texture
uniform float    LightFalloff;

sampler textureSampler = sampler_state
{
    Texture = <RoomTexture>;
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;
};

//////////////////////////////////////////////////////////////
//Structures
//////////////////////////////////////////////////////////////

//Application to vertex shader
struct A2V
{ 
    float4 Pos : POSITION;
    float3 Normal : NORMAL;
    float2 Tex0 : TEXCOORD0;
};

//Vertex shader to pixel shader
struct V2P
{
    float4 Pos : POSITION;
    float2 TexCoord0 : TEXCOORD0;
    float3 WorldNormal : TEXCOORD1;
    float4 WorldPos : TEXCOORD2;
    float4 Diffuse : TEXCOORD3;
    float3 LightDir : TEXCOORD4;
};

//////////////////////////////////////////////////////////////
//Vertex Shader
//////////////////////////////////////////////////////////////
void VS(in A2V IN, out V2P OUT)
{
    //Transform the position from view space to homogeneous projection space
    OUT.Pos = mul( IN.Pos, WorldViewProjection );

    //Compute world space position
    OUT.WorldPos = mul( IN.Pos, World );
    
    //Compute light direction
    OUT.LightDir = LightPosition - OUT.WorldPos;
    //OUT.LightDir = normalize( OUT.LightDir );  

    // Compute world space normal
    OUT.WorldNormal = normalize( mul( IN.Normal, (float3x3)World) );

    //Modulate material with light to obtain diffuse
    OUT.Diffuse = MatColor * LightColor;

    //Copy the texture coordinate as is
    OUT.TexCoord0 = IN.Tex0;
}

//////////////////////////////////////////////////////////////
//Pixel Shader
//////////////////////////////////////////////////////////////
float4 PS( in V2P IN) : COLOR0
{
    //Pixel to light vector
    float LenSq = dot( IN.LightDir, IN.LightDir );
    IN.LightDir = normalize( IN.LightDir );
    
    //Find the attenuation
    float Attn = min(( LightFalloff * LightFalloff ) / LenSq, 1.0f);

    //Compute lighting amount
    float4 I = saturate( dot( normalize( IN.WorldNormal ), IN.LightDir ) ) * IN.Diffuse * Attn;
               
    //Lookup texture color
    float4 TexColor = float4( tex2D( textureSampler, IN.TexCoord0 ).xyz, 1.0f );

    //Modulate texture color with lighting amount
    return  TexColor * I;
}

//////////////////////////////////////////////////////////////
//Technique
//////////////////////////////////////////////////////////////
technique PointLight
{
    pass P0
    {
        VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
    }
}

так вот используется эффект:

  //Set dynamic shader variables
  PointLightEffect->SetTechnique( "PointLight" );
  PointLightEffect->SetVector( "LightPosition", &pos);
  PointLightEffect->SetVector( "LightColor", &(D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f)));
  PointLightEffect->SetVector( "MatColor", &(D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f)));
  PointLightEffect->SetMatrix( "World", &(World) );
  PointLightEffect->SetMatrix( "WorldViewProjection", &(World * ActiveCamera->View * Proj) );
  PointLightEffect->SetTexture( "RoomTexture", RoomTexture );
  PointLightEffect->SetFloat( "LightFalloff", 15.0f );

  //Begin the shader pass
  UINT Pass, Passes;
  PointLightEffect->Begin(&Passes, 0);
  for (Pass = 0; Pass < Passes; Pass++)
  {
    PointLightEffect->BeginPass(Pass);
    //Render the Room
    RoomMesh->DrawSubset(0);

    PointLightEffect->EndPass();
  }
  PointLightEffect->End();

вот так я перделал эффект на 2 шейдера:

uniform sampler2D  textureSampler : register(s0);            // Texture
uniform float    LightFalloff : register(c0);

uniform float4   LightPosition : register(c0);          // World space light position
uniform float4   LightColor : register(c1);             // Light color
uniform float4   MatColor : register(c2);               // Color of the material
uniform float4x4 World : register(c3);                  // World
uniform float4x4 WorldViewProjection : register(c7);    // World * View * Projection matrix


//////////////////////////////////////////////////////////////
//Structures
//////////////////////////////////////////////////////////////

//Application to vertex shader

struct A2V
{ 
    float4 Pos : POSITION;
    float3 Normal : NORMAL;
    float2 TexCoord0 : TEXCOORD0;
};

//Vertex shader to pixel shader
struct V2P
{
  float4 Pos : POSITION;
    float2 TexCoord0 : TEXCOORD0;
    float3 WorldNormal : TEXCOORD1;
  float4 WorldPos : TEXCOORD2;
    float4 Diffuse : TEXCOORD3;
    float3 LightDir : TEXCOORD4;
};



//////////////////////////////////////////////////////////////
//Vertex Shader
//////////////////////////////////////////////////////////////

V2P VS(in A2V IN)
{
    V2P OUT;
  //Transform the position from view space to homogeneous projection space
    OUT.Pos = mul(WorldViewProjection, IN.Pos);
    //Compute world space position
    OUT.WorldPos = mul(World, IN.Pos);
    //Compute light direction
    OUT.LightDir = LightPosition - OUT.WorldPos;
    // Compute world space normal
OUT.WorldNormal = normalize(mul((float3x3)World, IN.Normal));
    //Modulate material with light to obtain diffuse
    OUT.Diffuse = MatColor * LightColor;

    //Copy the texture coordinate as is 
  OUT.TexCoord0 = IN.TexCoord0;
  return OUT;
}

//////////////////////////////////////////////////////////////
//Pixel Shader
//////////////////////////////////////////////////////////////

float4 PS(in V2P IN) : COLOR0
{
  //Pixel to light vector
      float LenSq = dot( IN.LightDir, IN.LightDir );
  IN.LightDir = normalize(IN.LightDir );  
  //Find the attenuation
  float Attn = min(( LightFalloff * LightFalloff ) / LenSq, 1.0f);
  //Compute lighting amount
  float4 I = saturate( dot( normalize( IN.WorldNormal ), IN.LightDir ) ) * IN.Diffuse * Attn;             
  //Lookup texture color
  float4 TexColor = float4(tex2D(textureSampler, IN.TexCoord0).xyz, 1.0f);
  //Modulate texture color with lighting amount
  return  TexColor; // так все работает но без освещения
  //return TexColor * I; // так черный экран
}
Вот так использую шейдеры:
  hr = D3DDevice->SetVertexShader(vertexLight);
  hr = D3DDevice->SetPixelShader(pixelLight);
  hr = D3DDevice->SetTexture(0, RoomTexture);
  // Set LightPosition
  hr = D3DDevice->SetVertexShaderConstantF(0, &pos.x, 1);
  // Set LightColor
  hr = D3DDevice->SetVertexShaderConstantF(1, &(D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f).x), 1);
  // Set MatColor
  hr = D3DDevice->SetVertexShaderConstantF(2, &(D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f).x), 1);
  // Set World Matrix
  hr = D3DDevice->SetVertexShaderConstantF(3,  &World._11, 4);
  // Set WorldViewProjectionMatrix
  hr = D3DDevice->SetVertexShaderConstantF(7, &((World * ActiveCamera->View * Proj)._11), 4);
  float LightFalloff = 25.0f;
  // Set LightFallOf
  hr = D3DDevice->SetPixelShaderConstantF(1, &LightFalloff, 1);
  //Render the Room
  hr = RoomMesh->DrawSubset(0);
Если пиксельный шейдер домнажаеит цыет текстуры на I то в результате черный экран, если просто возвращать цвет
текстуры то все ок, но не работает освещение. Этот шейдеры я попробовал сделать в RenderMonkey  ситуация такая-же.
Что я делаю не так?
спасибо всем заранее.

рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200719:53#144
doc.
угу Ghost2 прав... для кусков ландшафта это не используется...
рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200718:18#141
Ghost2
>Можно делать отдельные IB на спецфрагменты ландшафта пользуясь одним и тем-же VB.
ну вот это будет быстрей даже не в 1.5 раза но всетаки... И статический индексный вершинный буфер в видеокарте хранится получше. Да и просессорв не загружен - там еще физика, AI, игровая логика, сеть.
Zemedelec
>Если ландшафт не влизает в видеопамять, а видимая часть влезает - я с трудом представляю как вообще такое количество >геометрии будет рисоватся с ненулевъм fps.
я имел ввиду немножко другое как реализовать бесконечные ландшафты(ну не прямом смысле слова)
к примеру ландшафт 16384 * 16384 (4 * 4096 x 4 * 4096)
допустим в видекарту с запасом влезает 1024x1024.
Бьем этот ландшафт на 16 кусков по 1024x1024 проверяем нахождение камеры и перезагружаем с диска все данные... Ну конечно каждый кусок иемеет уже лоды + SceneGraph(или QuadTree) и не отменяются алгоритмы рендеринга отсечения и т.д.
такое возможно? большие задержки будут при подгрузке? Или есть иной подход? просто в современных играх можно долго идти по карте и конца и края не видать, а в Far Cry там есть ограничение...
рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200717:14#138
Ghost2
кстати как я понял демка написана на OpenGL так что 1 вызов все ок :) но для Direct3D такой подход скорей всего не потянет...
не у всех еще карты X1600, 6600 и выше... у которых D3DCAPS9. MaxPrimitiveCount уже позволяет это сделать
рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200717:12#137
Ghost2
>В демке ето может и катит. Но все равно ето неефективное использование железа, которое можно загрузить чем то другим, >нежели ландшафт туда заливать каждъй кадр.
согласен с Zemedelec
Но всетаки если размер большой ландшафта(т.е. не влезает в видеопамять) то в этом случае нужно динамически подгружать его, но я так понимаю это будет некая другая структура данных описывающая бесконечные ландшафты ?

рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200714:13#132
Ghost2
т.е. весь ландшафт рендерится за 1 вызов с разными индексами?
если да то в случае с Direct3D 9 если да то в случае с Direct3D не на всех картах такой ландшафт отрендерится, уже на Radeon 9600 GeForce 5700 будут проблемы... OpenGL как то это разруливает и этому API по барабану суольуо полигонов рендерится за 1 вызов.
рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200712:51#130
Ghost2
ого-го, ну я вот не пойму почему для каждого лода не хранить свой индексный буфер заранее построенный при загрузке карты высот, далее проверяем в самом просто случае квадрат расстояние до центра узла и находим соответствующий индексный буфер, ставим его рендерим за  вызов весь узел. Ну а вершинный буфер тоже статический и построенный 1 раз.При правильном выборе размера листа производительность будет высокой. Самое главное что процессор будет не загружен.
рендеринг ландшафта. подскажите пути оптимизации.16 мар. 200710:53#126
Ghost2
>Кста, видел такую демку? 4096x4096 :)
Круто. При правильной организации дерева ландшафта + лоды размер ландшафта особо на производительность может не повлиять. Большую часть геометрии отсечется деревом посредством куллинга, далее лоды уменьшат число полигнов в несколько раз. Ну естественно желательно делать это без динамических IB. Без лодов было у меня около 100 FPS когда я подключил самый низкий уровень(просто остальные пока не доделал) то производительность выросла местами в 4 раза.
Вопросы по Boostу15 мар. 200720:06#1
Executor
смотря что хочешь использовать там большая часть используется без компиляции
к примеру:
boost::shader_ptr
boost::scoped_ptr
boost::any
boost::lexical_cast
boost::bind
boost::function
boost::format
компилить вроде надо к примеру примеру если потоки  используются... (boost::thread)
а какчать последнюю версию
http://downloads.sourceforge.net/boost/boost_1_33_1.tar.bz2?modti… &big_mirror=0

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр