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

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

Cg или GLSL21 ноя. 201110:10#27
innuendo
>на glsl нету tex2D, весь код покажи
ну вообще я взял код на HLSL где используется tex2DGrad и скомпилил его в GLSL. Вообще и предполагалось проверить поддержку в Cg tex2DGrad при компиляции в GLSL, или я что-то не так понял?
вот код:
//
struct PS_INPUT
{
   float2 texCoord          : TEXCOORD0;
   float3 vLightTS          : TEXCOORD1;   // light vector in tangent space, denormalized
   float3 vViewTS           : TEXCOORD2;   // view vector in tangent space, denormalized
   float2 vParallaxOffsetTS : TEXCOORD3;   // Parallax offset vector in tangent space
   float3 vNormalWS         : TEXCOORD4;   // Normal vector in world space
   float3 vViewWS           : TEXCOORD5;   // View vector in world space
};

#define tex2Dgrad tex2D

uniform sampler2D tNormalHeightMap;
uniform sampler2D tBase;

float  g_fSpecularExponent;         // Material's specular exponent
bool   g_bAddSpecular;              // Toggles rendering with specular or without
bool     g_bVisualizeMipLevel;      // Toggles visualization of mip level

bool     bDisplayShadows;         // Toggles display of self-occlusion based shadows
bool     bVisualizeLOD;
uniform float2   vTextureDims;
uniform int      nLODThreshold;
uniform int      nMinSamples;
uniform int      nMaxSamples;
float    fHeightMapScale;
float    fShadowSoftening; 

float4 g_materialAmbientColor;
float4 g_materialDiffuseColor;
float4 g_materialSpecularColor;

float4 ComputeIllumination( float2 texCoord, float3 vLightTS, float3 vViewTS, float fOcclusionShadow )
{
   float3 vNormalTS = normalize( tex2D( tNormalHeightMap, texCoord ) * 2 - 1 ).xyz;
   
   float4 cBaseColor = tex2D( tBase, texCoord );
   
   float3 vLightTSAdj = float3( vLightTS.x, -vLightTS.y, vLightTS.z );
   
   float4 cDiffuse = saturate( dot( vNormalTS, vLightTSAdj )) * g_materialDiffuseColor;
   
   float4 cSpecular = 0;
   if ( g_bAddSpecular )
   {
      float3 vReflectionTS = normalize( 2 * dot( vViewTS, vNormalTS ) * vNormalTS - vViewTS );
           
      float fRdotL = saturate( dot( vReflectionTS, vLightTSAdj ));
      cSpecular = saturate( pow( fRdotL, g_fSpecularExponent )) * g_materialSpecularColor;
   }
   
   float4 cFinalColor = (( g_materialAmbientColor + cDiffuse ) * cBaseColor + cSpecular ) * fOcclusionShadow; 
   
   return cFinalColor;  
} 

float4 psMain( PS_INPUT i ) : COLOR0
{ 

   float3 vViewTS   = normalize( i.vViewTS  );
   float3 vViewWS   = normalize( i.vViewWS  );
   float3 vLightTS  = normalize( i.vLightTS );
   float3 vNormalWS = normalize( i.vNormalWS );
     
   float4 cResultColor = float4( 0, 0, 0, 1 );
 
   float2 fTexCoordsPerSize = i.texCoord * vTextureDims;

   float2 dxSize, dySize;
   float2 dx, dy;

   //float4( dxSize, dx ) = ddx( float4( fTexCoordsPerSize, i.texCoord ) );
   //float4( dySize, dy ) = ddy( float4( fTexCoordsPerSize, i.texCoord ) );
  float4 Dx = ddx( float4( fTexCoordsPerSize, i.texCoord ) );
  float4 Dy = ddy( float4( fTexCoordsPerSize, i.texCoord ) );
  dxSize = Dx.xy;  
  dx = Dx.xw;  
  dySize = Dy.xy;  
  dy = Dy.xw;  

                  
   float  fMipLevel;      
   float  fMipLevelInt;    // mip level integer portion
   float  fMipLevelFrac;   // mip level fractional amount for blending in between levels

   float  fMinTexCoordDelta;
   float2 dTexCoords;

   dTexCoords = dxSize * dxSize + dySize * dySize;

   fMinTexCoordDelta = max( dTexCoords.x, dTexCoords.y );

   fMipLevel = max( 0.5 * log2( fMinTexCoordDelta ), 0 );
    
   float2 texSample = i.texCoord;
   
   float4 cLODColoring = float4( 1, 1, 3, 1 );

   float fOcclusionShadow = 1.0;

   if ( fMipLevel <= (float) nLODThreshold )
   {
      int nNumSteps = (int) lerp( nMaxSamples, nMinSamples, dot( vViewWS, vNormalWS ) );

      float fCurrHeight = 0.0;
      float fStepSize   = 1.0 / (float) nNumSteps;
      float fPrevHeight = 1.0;
      float fNextHeight = 0.0;

      int    nStepIndex = 0;
      bool   bCondition = true;

      float2 vTexOffsetPerStep = fStepSize * i.vParallaxOffsetTS;
      float2 vTexCurrentOffset = i.texCoord;
      float  fCurrentBound     = 1.0;
      float  fParallaxAmount   = 0.0;

      float2 pt1 = 0;
      float2 pt2 = 0;
       
      float2 texOffset2 = 0;

      while ( nStepIndex < nNumSteps ) 
      {
         vTexCurrentOffset -= vTexOffsetPerStep;

         fCurrHeight = tex2Dgrad( tNormalHeightMap, vTexCurrentOffset, dx, dy ).a;

         fCurrentBound -= fStepSize;

         if ( fCurrHeight > fCurrentBound ) 
         {   
            pt1 = float2( fCurrentBound, fCurrHeight );
            pt2 = float2( fCurrentBound + fStepSize, fPrevHeight );

            texOffset2 = vTexCurrentOffset - vTexOffsetPerStep;

            nStepIndex = nNumSteps + 1;
            fPrevHeight = fCurrHeight;
         }
         else
         {
            nStepIndex++;
            fPrevHeight = fCurrHeight;
         }
      }   

      float fDelta2 = pt2.x - pt2.y;
      float fDelta1 = pt1.x - pt1.y;
      
      float fDenominator = fDelta2 - fDelta1;
      
      if ( fDenominator == 0.0f )
      {
         fParallaxAmount = 0.0f;
      }
      else
      {
         fParallaxAmount = (pt1.x * fDelta2 - pt2.x * fDelta1 ) / fDenominator;
      }
      
      float2 vParallaxOffset = i.vParallaxOffsetTS * (1 - fParallaxAmount );

      float2 texSampleBase = i.texCoord - vParallaxOffset;
      texSample = texSampleBase;
       
      cLODColoring = float4( 1, 1, 1, 1 ); 

      if ( fMipLevel > (float)(nLODThreshold - 1) )
      {
         fMipLevelFrac = modf( fMipLevel, fMipLevelInt );

         if ( bVisualizeLOD )
         {
            cLODColoring = float4( 1, 1, max( 1, 2 * fMipLevelFrac ), 1 ); 
         }

         texSample = lerp( texSampleBase, i.texCoord, fMipLevelFrac );

     }  
      
     if ( bDisplayShadows == true )
     {
        float2 vLightRayTS = vLightTS.xy * fHeightMapScale;
     
 
        float sh0 =  tex2Dgrad( tNormalHeightMap, texSampleBase, dx, dy ).a;
        float shA = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.88, dx, dy ).a - sh0 - 0.88 ) *  1 * fShadowSoftening;
        float sh9 = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.77, dx, dy ).a - sh0 - 0.77 ) *  2 * fShadowSoftening;
        float sh8 = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.66, dx, dy ).a - sh0 - 0.66 ) *  4 * fShadowSoftening;
        float sh7 = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.55, dx, dy ).a - sh0 - 0.55 ) *  6 * fShadowSoftening;
        float sh6 = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.44, dx, dy ).a - sh0 - 0.44 ) *  8 * fShadowSoftening;
        float sh5 = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.33, dx, dy ).a - sh0 - 0.33 ) * 10 * fShadowSoftening;
        float sh4 = (tex2Dgrad( tNormalHeightMap, texSampleBase + vLightRayTS * 0.22, dx, dy ).a - sh0 - 0.22 ) * 12 * fShadowSoftening;
   
        fOcclusionShadow = 1 - max( max( max( max( max( max( shA, sh9 ), sh8 ), sh7 ), sh6 ), sh5 ), sh4 );
      
        fOcclusionShadow = fOcclusionShadow * 0.6 + 0.4;         
     }       
   }   
              
   if ( bVisualizeLOD )
   {
      cResultColor *= cLODColoring;
   }   
   if ( g_bVisualizeMipLevel )
   {
      cResultColor = fMipLevel.xxxx;      
   }   
   return cResultColor;
}
Cg или GLSL20 ноя. 201123:15#24
innuendo
> и что наисследовал ? :)
> tex2DGrad
Компилит, профиль glslf, только там вместо этого tex2D но с 4 параметрами. Взял пример из DirectXSDK ParallaxOcclusionMapping кусок шейдера, правда пришлось немного поправить HLSL код в строках 253,254( ошибка с l-value).
GLSL 4.10 не держит.

Cg или GLSL19 ноя. 201120:38#22
innuendo
> и что наисследовал ? :)
Будет время возьму шейдер на HLSL использующий последние возможности или самые новые, попробую его скомпилить в glsv/glslf.
если хочешь ускорить исследование, напиши пару строк. Я поэкспериментирую.
Executor
>А не бессмысленно писать 3 рендера? :)
для себя это прежде всего незаменимый опыт. А для коммерческого проекта под Windows только Direct3D без Cg.

Cg или GLSL19 ноя. 201116:34#17
innuendo
А как мне заморачиватся если 3 рендера,писать отдельно  GLSL шейдера бессмыслено.Заморочки с получением параметров малы,ведь к именам добавляютмя одинаковые префиксы(может и в следующих версиях не изменятся).Это не стандартное и не обычное решение,но оно работает.
Executor
Я исследую это.Cg в профили дает возможность задавать версию выхлопа.

Cg или GLSL19 ноя. 201114:23#14

innuendo
Параметры очевидно как и в GLSL,или ты не про то?я не использую Cg Run Time, поэтому парсю код и выцепляю все юниформы(выхлоп имена меняет зачем-то), проблем нету, все работает, скоро воткну UBO.

Executor
Моэешь последние модные фичи сказать? Попробую скомпилить, получится ли.Вот выяснилось что тесселяция не работает или не поддерживается.

Cg или GLSL19 ноя. 20110:39#6
PlayerDark
>и ходят слухи, что Nvidia его скоро поддерживать перестанет
Где такие слухи?
Ты если кроме OpenGL ничего писать не будешь то Cg тебе не нужен. Хотя если будет PS3 ?? а там GL_NV_fragment_program2 и GL_NV_vertex_program3.
PlayerDark
> Вопрос только в том - насколько он хорошо компилирует.
Отлично. Причем компилится GLSL выхлоп везде. Кстати Quake Wars использует Cg.
Ну и еще интересное пишут тут:
http://blog.gamedeff.com/forum/view.html?id=10
Свой плагин Maya13 ноя. 201123:31#13
Int64
Для Maya'я советую советую написать плагин для общего развития. Но вообще лучше использую Collada'у
Иерархия сцены. Как её обычно делают?9 ноя. 201123:58#46
nes
>29 пост
Очень похоже на кусок кода движка Arwen, Начитался Борескова?
EvilSpirit
>т.е. как бы все объекты реально могут лежать в цельном массиве(дабы удовлетворить всех здесь собравшихся).
>каждый объект содержит список children и указатель на parent.
>когда удаляем объект, отцепляемся от парента, отцепляем чилдов на парента, если он есть, или просто на рут.
Отличное решение...
>UPD: вспомнил, что если мы находимся в цельном массиве, может начаться коллапс указателей, так что осторожно!
Что такое коллапс указателей?
Sergio
>template <typename T>
> class Hierarchy
> {
> public:
> typedef std::list<T*> List;
Это для каких сцен такое ? и еще с boost::shared_ptr ??? или типа сейчас CPU быстрые и кешь памяти мегабайты? для 1000 объектов можно и без графа. А если что-то более сложное, то сочувствую памяти и процессору. Я думаю это ты не будешь на мобильные платформы вставлять?? Как ты будешь обход сцены делать для десятков тысяч объектов ? А CPU еще видюху гонять нужно, скрипты выполнять, стримить контент, физику считать,частицы, хотя сейчас уже OpenCL и т.д. есть.
>Порядок важен. Но вопрос больше в том, как правильно сделать автоматическое управление памятью в данном случае?
Для чего важен порядок?, опиши задачу может и не нужен порядок.
>чтобы не чистить всю иерархию объектов вручную
Когда нужно чистить? В конце работы приложения?
В любом случае объекты это отдельно и  список узлов дерева отдельно тоже.
Чистить их нужно тоже отдельно. При удалении объекта удалять его из узла. Если удаляется узел, удалить ссылку на объект(но не сам объект)

У меня все объекты лежать в одной области памяти, причем они могут быть нескольких типов. Число узлов дерева - статичный массив. Зачем глубокая иерархия???
Узлы графа содержат статичный массив указателей на объекты(всегда можно иметь ограниченное число объектов в узле), Удаление объекта из узла или перемещение динамического объекта по узлам - простая операция: последний на место удаляемого и уменьшение размера массива. Сцен граф у меня выполняет простую задачу и наверное основную - поиск и хранение объектов сцены, динамическое изменение графа при движении объектов. Пока больше и ничего не нужно.

VertexShader: mul( pos, mat_wvp ) и mul( mat_wvp, pos)27 окт. 201115:10#3
Executor
> Если хочешь чтобы второй вариант работал, то тебе надо транспонировать wvp.
Не обязательно, есть флаги D3DXSHADER_PACKMATRIX_ROWMAJOR, D3DXSHADER_PACKMATRIX_COLUMNMAJOR
Поздравляем [b] wat [/b] с Днем Рождения!25 окт. 201115:41#33
Присоединяюсь!
Умер Деннис Ритчи13 окт. 201115:16#14
Эх блин!!таких точно не будет... На языке C весь мир держится...
Rage10 окт. 201119:47#445
Посмотрел шейдера. Интересная скелетнай анимация у них. Джоинты хранят в цвете вершины. Я так понимаю судя по
uniform matrices_ubo { vec4 matrices[768]; };
192 кости на модель.
И да, используют UBO - это круто.
Rage9 окт. 20117:50#363
люди а на чем там звук сделан? XAudio ? OpenAL ?  или DirectSound ?
VBO vs другие для анимации "Матрица"9 окт. 20117:43#2
SIF
> 1. Использовать VBO, каждый раз генерировать массив позиций(данных), создавать
> буфера, их биндить и рисовать
Использовать VBO, каждый раз заливать в уже созданный буфер массив позиций(данных)
Куда делась статья про FBO???9 окт. 20117:18#8
@!!ex
>"FrameBuffer Objects или скажем нет оконным контекстам"
>И ее не нашел! Нет ее на сайте!!
>грусть*
>Поделитесь похожей статьей, плиз.
Есть у меня эта статья могу скинуть, только сейчас нету компа где она лежит сохраненная, к следующим выходным могу. Напомни мне.

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

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