Сообщения на форуме пользователя Andrey (27 стр.)
Cg или GLSL | 21 ноя. 2011 | 10:10 | #27 |
---|
>на 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 или GLSL | 20 ноя. 2011 | 23:15 | #24 |
---|
> и что наисследовал ? :)
> tex2DGrad
Компилит, профиль glslf, только там вместо этого tex2D но с 4 параметрами. Взял пример из DirectXSDK ParallaxOcclusionMapping кусок шейдера, правда пришлось немного поправить HLSL код в строках 253,254( ошибка с l-value).
GLSL 4.10 не держит.
Cg или GLSL | 19 ноя. 2011 | 20:38 | #22 |
---|
> и что наисследовал ? :)
Будет время возьму шейдер на HLSL использующий последние возможности или самые новые, попробую его скомпилить в glsv/glslf.
если хочешь ускорить исследование, напиши пару строк. Я поэкспериментирую.
Executor
>А не бессмысленно писать 3 рендера? :)
для себя это прежде всего незаменимый опыт. А для коммерческого проекта под Windows только Direct3D без Cg.
Cg или GLSL | 19 ноя. 2011 | 16:34 | #17 |
---|
А как мне заморачиватся если 3 рендера,писать отдельно GLSL шейдера бессмыслено.Заморочки с получением параметров малы,ведь к именам добавляютмя одинаковые префиксы(может и в следующих версиях не изменятся).Это не стандартное и не обычное решение,но оно работает.
Executor
Я исследую это.Cg в профили дает возможность задавать версию выхлопа.
Cg или GLSL | 19 ноя. 2011 | 14:23 | #14 |
---|
innuendo
Параметры очевидно как и в GLSL,или ты не про то?я не использую Cg Run Time, поэтому парсю код и выцепляю все юниформы(выхлоп имена меняет зачем-то), проблем нету, все работает, скоро воткну UBO.
Executor
Моэешь последние модные фичи сказать? Попробую скомпилить, получится ли.Вот выяснилось что тесселяция не работает или не поддерживается.
Cg или GLSL | 19 ноя. 2011 | 0:39 | #6 |
---|
>и ходят слухи, что 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
Свой плагин Maya | 13 ноя. 2011 | 23:31 | #13 |
---|
Для Maya'я советую советую написать плагин для общего развития. Но вообще лучше использую Collada'у
Иерархия сцены. Как её обычно делают? | 9 ноя. 2011 | 23:58 | #46 |
---|
>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 окт. 2011 | 15:10 | #3 |
---|
> Если хочешь чтобы второй вариант работал, то тебе надо транспонировать wvp.
Не обязательно, есть флаги D3DXSHADER_PACKMATRIX_ROWMAJOR, D3DXSHADER_PACKMATRIX_COLUMNMAJOR
Поздравляем [b] wat [/b] с Днем Рождения! | 25 окт. 2011 | 15:41 | #33 |
---|
Умер Деннис Ритчи | 13 окт. 2011 | 15:16 | #14 |
---|
Rage | 10 окт. 2011 | 19:47 | #445 |
---|
uniform matrices_ubo { vec4 matrices[768]; };
И да, используют UBO - это круто.
VBO vs другие для анимации "Матрица" | 9 окт. 2011 | 7:43 | #2 |
---|
> 1. Использовать VBO, каждый раз генерировать массив позиций(данных), создавать
> буфера, их биндить и рисовать
Использовать VBO, каждый раз заливать в уже созданный буфер массив позиций(данных)
Куда делась статья про FBO??? | 9 окт. 2011 | 7:18 | #8 |
---|
>"FrameBuffer Objects или скажем нет оконным контекстам"
>И ее не нашел! Нет ее на сайте!!
>грусть*
>Поделитесь похожей статьей, плиз.
Есть у меня эта статья могу скинуть, только сейчас нету компа где она лежит сохраненная, к следующим выходным могу. Напомни мне.