Сообщения на форуме пользователя Andrey (145 стр.)
GLSL и скелетка где бы раздыбыть примерчик | 19 мар. 2007 | 13:02 | #1 |
---|
рендеринг ландшафта. подскажите пути оптимизации. | 19 мар. 2007 | 12:54 | #162 |
---|
Zemedelec
>Зачем так много вертексов? Нет LOD-a?
>Лучше толковъй LOD написать...
ну фиг знает я просто говорю размеры что-бы подчеркнуть бесконечность ландшафта.
>Зачем так много вертексов? Нет LOD-a?
>Лучше толковъй LOD написать...
ну фиг знает я просто говорю размеры что-бы подчеркнуть бесконечность ландшафта.
При разбитии ID3DXEffect на IDirect3DPixelShader9/IDirect3DVertexShader9 неправльно работает :( | 19 мар. 2007 | 12:50 | #7 |
---|
Coridas
>Потому что в обезьяне в шейдер передаются транспонированные матрицы.
ну а как быть с ID3DXEffect ? там тоже транспонированные?
NULL_PTR
Спасибо буду знать.
>Потому что в обезьяне в шейдер передаются транспонированные матрицы.
ну а как быть с ID3DXEffect ? там тоже транспонированные?
NULL_PTR
Спасибо буду знать.
менеджер сцен / параметры шейдера | 18 мар. 2007 | 23:54 | #1 |
---|
+
При разбитии ID3DXEffect на IDirect3DPixelShader9/IDirect3DVertexShader9 неправльно работает :( | 18 мар. 2007 | 23:53 | #3 |
---|
Shockwave
>Выложи куда-нибудь проект из РэндерМанкей, а то так читать и разбираться в лом :)
http://www.gamedev.ru/download/?id=5196
Zeux
>SetPixelShaderConstantF(0, lightfalloff, 1)
спасибо большое!!!! как всегда подводит моя невнимательность уже какой раз :(
Вопрос в догонку почему в эффекте(так-же и в Render Monkey хотя там голые шейдеры) нужно писать перемножение вектор = матрица * вектор :
а в шейдере наоборот(иначе рваные полигоны на экране)
>Выложи куда-нибудь проект из РэндерМанкей, а то так читать и разбираться в лом :)
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 мар. 2007 | 21:20 | #0 |
---|
Привет всем!!!
Решил попробывать сделать попиксельное освещение ипользуя готовый пример с ID3DXEffect;
Вот так использую шейдеры:
Если пиксельный шейдер домнажаеит цыет текстуры на I то в результате черный экран, если просто возвращать цвет
текстуры то все ок, но не работает освещение. Этот шейдеры я попробовал сделать в RenderMonkey ситуация такая-же.
Что я делаю не так?
спасибо всем заранее.
Решил попробывать сделать попиксельное освещение ипользуя готовый пример с 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); |
текстуры то все ок, но не работает освещение. Этот шейдеры я попробовал сделать в RenderMonkey ситуация такая-же.
Что я делаю не так?
спасибо всем заранее.
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 19:53 | #144 |
---|
doc.
угу Ghost2 прав... для кусков ландшафта это не используется...
угу Ghost2 прав... для кусков ландшафта это не используется...
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 18:18 | #141 |
---|
Ghost2
>Можно делать отдельные IB на спецфрагменты ландшафта пользуясь одним и тем-же VB.
ну вот это будет быстрей даже не в 1.5 раза но всетаки... И статический индексный вершинный буфер в видеокарте хранится получше. Да и просессорв не загружен - там еще физика, AI, игровая логика, сеть.
Zemedelec
>Если ландшафт не влизает в видеопамять, а видимая часть влезает - я с трудом представляю как вообще такое количество >геометрии будет рисоватся с ненулевъм fps.
я имел ввиду немножко другое как реализовать бесконечные ландшафты(ну не прямом смысле слова)
к примеру ландшафт 16384 * 16384 (4 * 4096 x 4 * 4096)
допустим в видекарту с запасом влезает 1024x1024.
Бьем этот ландшафт на 16 кусков по 1024x1024 проверяем нахождение камеры и перезагружаем с диска все данные... Ну конечно каждый кусок иемеет уже лоды + SceneGraph(или QuadTree) и не отменяются алгоритмы рендеринга отсечения и т.д.
такое возможно? большие задержки будут при подгрузке? Или есть иной подход? просто в современных играх можно долго идти по карте и конца и края не видать, а в Far Cry там есть ограничение...
>Можно делать отдельные IB на спецфрагменты ландшафта пользуясь одним и тем-же VB.
ну вот это будет быстрей даже не в 1.5 раза но всетаки... И статический индексный вершинный буфер в видеокарте хранится получше. Да и просессорв не загружен - там еще физика, AI, игровая логика, сеть.
Zemedelec
>Если ландшафт не влизает в видеопамять, а видимая часть влезает - я с трудом представляю как вообще такое количество >геометрии будет рисоватся с ненулевъм fps.
я имел ввиду немножко другое как реализовать бесконечные ландшафты(ну не прямом смысле слова)
к примеру ландшафт 16384 * 16384 (4 * 4096 x 4 * 4096)
допустим в видекарту с запасом влезает 1024x1024.
Бьем этот ландшафт на 16 кусков по 1024x1024 проверяем нахождение камеры и перезагружаем с диска все данные... Ну конечно каждый кусок иемеет уже лоды + SceneGraph(или QuadTree) и не отменяются алгоритмы рендеринга отсечения и т.д.
такое возможно? большие задержки будут при подгрузке? Или есть иной подход? просто в современных играх можно долго идти по карте и конца и края не видать, а в Far Cry там есть ограничение...
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 17:14 | #138 |
---|
Ghost2
кстати как я понял демка написана на OpenGL так что 1 вызов все ок :) но для Direct3D такой подход скорей всего не потянет...
не у всех еще карты X1600, 6600 и выше... у которых D3DCAPS9. MaxPrimitiveCount уже позволяет это сделать
кстати как я понял демка написана на OpenGL так что 1 вызов все ок :) но для Direct3D такой подход скорей всего не потянет...
не у всех еще карты X1600, 6600 и выше... у которых D3DCAPS9. MaxPrimitiveCount уже позволяет это сделать
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 17:12 | #137 |
---|
Ghost2
>В демке ето может и катит. Но все равно ето неефективное использование железа, которое можно загрузить чем то другим, >нежели ландшафт туда заливать каждъй кадр.
согласен с Zemedelec
Но всетаки если размер большой ландшафта(т.е. не влезает в видеопамять) то в этом случае нужно динамически подгружать его, но я так понимаю это будет некая другая структура данных описывающая бесконечные ландшафты ?
>В демке ето может и катит. Но все равно ето неефективное использование железа, которое можно загрузить чем то другим, >нежели ландшафт туда заливать каждъй кадр.
согласен с Zemedelec
Но всетаки если размер большой ландшафта(т.е. не влезает в видеопамять) то в этом случае нужно динамически подгружать его, но я так понимаю это будет некая другая структура данных описывающая бесконечные ландшафты ?
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 14:13 | #132 |
---|
Ghost2
т.е. весь ландшафт рендерится за 1 вызов с разными индексами?
если да то в случае с Direct3D 9 если да то в случае с Direct3D не на всех картах такой ландшафт отрендерится, уже на Radeon 9600 GeForce 5700 будут проблемы... OpenGL как то это разруливает и этому API по барабану суольуо полигонов рендерится за 1 вызов.
т.е. весь ландшафт рендерится за 1 вызов с разными индексами?
если да то в случае с Direct3D 9 если да то в случае с Direct3D не на всех картах такой ландшафт отрендерится, уже на Radeon 9600 GeForce 5700 будут проблемы... OpenGL как то это разруливает и этому API по барабану суольуо полигонов рендерится за 1 вызов.
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 12:51 | #130 |
---|
Ghost2
ого-го, ну я вот не пойму почему для каждого лода не хранить свой индексный буфер заранее построенный при загрузке карты высот, далее проверяем в самом просто случае квадрат расстояние до центра узла и находим соответствующий индексный буфер, ставим его рендерим за вызов весь узел. Ну а вершинный буфер тоже статический и построенный 1 раз.При правильном выборе размера листа производительность будет высокой. Самое главное что процессор будет не загружен.
ого-го, ну я вот не пойму почему для каждого лода не хранить свой индексный буфер заранее построенный при загрузке карты высот, далее проверяем в самом просто случае квадрат расстояние до центра узла и находим соответствующий индексный буфер, ставим его рендерим за вызов весь узел. Ну а вершинный буфер тоже статический и построенный 1 раз.При правильном выборе размера листа производительность будет высокой. Самое главное что процессор будет не загружен.
рендеринг ландшафта. подскажите пути оптимизации. | 16 мар. 2007 | 10:53 | #126 |
---|
Ghost2
>Кста, видел такую демку? 4096x4096 :)
Круто. При правильной организации дерева ландшафта + лоды размер ландшафта особо на производительность может не повлиять. Большую часть геометрии отсечется деревом посредством куллинга, далее лоды уменьшат число полигнов в несколько раз. Ну естественно желательно делать это без динамических IB. Без лодов было у меня около 100 FPS когда я подключил самый низкий уровень(просто остальные пока не доделал) то производительность выросла местами в 4 раза.
>Кста, видел такую демку? 4096x4096 :)
Круто. При правильной организации дерева ландшафта + лоды размер ландшафта особо на производительность может не повлиять. Большую часть геометрии отсечется деревом посредством куллинга, далее лоды уменьшат число полигнов в несколько раз. Ну естественно желательно делать это без динамических IB. Без лодов было у меня около 100 FPS когда я подключил самый низкий уровень(просто остальные пока не доделал) то производительность выросла местами в 4 раза.
Вопросы по Boostу | 15 мар. 2007 | 20: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
смотря что хочешь использовать там большая часть используется без компиляции
к примеру:
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