Сообщения на форуме пользователя Andrey (115 стр.)
помогите с оптимизаций OGL приложение. (картография) | 2 фев. 2008 | 18:20 | #1 |
---|
progman
glVertex3/glColor3*/glBegin/glEnd
Кашмар!!! так программируют студенты на курсах компьютерной графики в вузах провинциальных городов либо начинающие. Забудь про эти функции они убьют CPU и загрузят его по полной.
1) используй расширение
GL_ARB_vertex_buffer_object.
2)Отсекай ненужные объекты Frustum Cullingom. Далее организуй сцену в виде дерева дабы минимизировать число проверок. ПИхай объекты в список видимых
3)Сортируй по дальности от камере для вывода Front-to-Back.
glBegin( rendermode ); glColor3d( lpPoints[0].r , lpPoints[0].g, lpPoints[0].b ); for(int j=0; j<nCount; j++ ) glVertex3d(lpPoints[j].x, lpPoints[j].y, lpPoints[j].z); glEnd();
Кашмар!!! так программируют студенты на курсах компьютерной графики в вузах провинциальных городов либо начинающие. Забудь про эти функции они убьют CPU и загрузят его по полной.
1) используй расширение
GL_ARB_vertex_buffer_object.
2)Отсекай ненужные объекты Frustum Cullingom. Далее организуй сцену в виде дерева дабы минимизировать число проверок. ПИхай объекты в список видимых
3)Сортируй по дальности от камере для вывода Front-to-Back.
GL под линуксом | 2 фев. 2008 | 16:37 | #32 |
---|
Andru
мдя... очень удивили тесты
мдя... очень удивили тесты
Скиннинг на шейдере. | 1 фев. 2008 | 19:13 | #60 |
---|
Торпор
>За софтвар я возьмусь в ближайшее время, да.
тогда выход один продебаж шейдер и посмотри что приходит туда.
>За софтвар я возьмусь в ближайшее время, да.
тогда выход один продебаж шейдер и посмотри что приходит туда.
Скиннинг на шейдере. | 1 фев. 2008 | 11:49 | #57 |
---|
Торпор
Я тоже вожусь со скелетной анимацией. Правда пока без кватенионов. У меня что-то похожее получается но выглядит хуже вершины извернуты как-то непонятно.
Ты все-таки послушай Kroll попробуй на кубике. Возьми 2 кости.
И почему у тебя 10 вершин если должно быть 24 ???? у вершин кубика то разные нормали и текстурные координаты.
Сделай пока на матрицах потом переходи на кватернионы. Попробуй сделать софтварную скелетную анимацию(Я сделал нашел пару ошибок).
Там в отладке посмотри правильность индексов костей и весов.
т.к. я вижу есть подозрение по поводу этого:
>Видим странное - все вершины кроме 8й и 9й двигаются как положено, а эти две - стоят на месте.
Я тоже вожусь со скелетной анимацией. Правда пока без кватенионов. У меня что-то похожее получается но выглядит хуже вершины извернуты как-то непонятно.
Ты все-таки послушай Kroll попробуй на кубике. Возьми 2 кости.
И почему у тебя 10 вершин если должно быть 24 ???? у вершин кубика то разные нормали и текстурные координаты.
Сделай пока на матрицах потом переходи на кватернионы. Попробуй сделать софтварную скелетную анимацию(Я сделал нашел пару ошибок).
Там в отладке посмотри правильность индексов костей и весов.
т.к. я вижу есть подозрение по поводу этого:
>Видим странное - все вершины кроме 8й и 9й двигаются как положено, а эти две - стоят на месте.
Экспорт:Как узнать состояние Check Box для тестур Material Editor'а в 3DS Max? | 31 янв. 2008 | 17:25 | #4 |
---|
evgen_2904
Вот спасибо! правда я уже сделал через
Вот спасибо! правда я уже сделал через
int Mtl::SubTexmapOn(int i);
твой способ тоже попробую.
Спасибо всем откликнувшимся тема закрыта.
Экспорт:Как узнать состояние Check Box для тестур Material Editor'а в 3DS Max? | 31 янв. 2008 | 13:28 | #2 |
---|
VileDog(ck.UA)
>а зачем тебе это нужно?
это нужно аниматорам а не мне :)
>разве макс при экспорте добавляет в список карт текстуры с неактивными галками?
а почему бы и нет?
Вот это возвращает имя текстуры без учета галок. Ему то на эти галки по ходу дела пофиг.
Хотелось бы это делать только после проверки активности соответствующей галки.
>а зачем тебе это нужно?
это нужно аниматорам а не мне :)
>разве макс при экспорте добавляет в список карт текстуры с неактивными галками?
а почему бы и нет?
Вот это возвращает имя текстуры без учета галок. Ему то на эти галки по ходу дела пофиг.
static_cast<BitmapTex *>(pTextureMap)->GetMapName();
Огонь реактивного двигателя | 31 янв. 2008 | 13:19 | #11 |
---|
Kavis
немного частиц + анимированная текстура.
Assassin
>Могу показать )) Ну насколько я понял фишка в том что видюха обьединяет эти спрайты и это позволяет рендерить их не каждый по отдельности а всей тушкой сразу.
ну вообще-то частиц не на точечных спрайтах тоже нужно рендерить тушкой.
немного частиц + анимированная текстура.
Assassin
>Могу показать )) Ну насколько я понял фишка в том что видюха обьединяет эти спрайты и это позволяет рендерить их не каждый по отдельности а всей тушкой сразу.
ну вообще-то частиц не на точечных спрайтах тоже нужно рендерить тушкой.
Экспорт:Как узнать состояние Check Box для тестур Material Editor'а в 3DS Max? | 31 янв. 2008 | 12:32 | #0 |
---|
Привет всем!
В общем из экпортера нужно узнать нажата ли галка.
Вот скриншот показывающий что имеется ввиду.
Почитав 3DS MAX SDK единственное что подходит как мне показалось это 2 метода:
в первом случае всегда возращается 0 независим от от check Box, во втором TRUE
Кто нибудь сталкивался с этим? Неужели нужно брать HWND окон 3DS MAX и через Win API все проверять?? :)))))
Спасибо всем заранее. С Уважением Андрей.
В общем из экпортера нужно узнать нажата ли галка.
Вот скриншот показывающий что имеется ввиду.

Почитав 3DS MAX SDK единственное что подходит как мне показалось это 2 метода:
int Texmap::TestMtlFlag(int mask); //использовал флаг MTL_IN_SCENE BOOL Texmap::SupportTexDisplay()
Кто нибудь сталкивался с этим? Неужели нужно брать HWND окон 3DS MAX и через Win API все проверять?? :)))))
Спасибо всем заранее. С Уважением Андрей.
OpenGL->D3D Shaders | 30 янв. 2008 | 18:29 | #30 |
---|
[src]
этот код матриц для OpenGL или для Direct3D ?
для Direct3D вот(из DirectX SDK):
Преспективная:
Ортографическая:
этот код матриц для OpenGL или для Direct3D ?
для Direct3D вот(из DirectX SDK):
Преспективная:
xScale 0 0 0 0 yScale 0 0 0 0 zf/(zf-zn) 1 0 0 -zn*zf/(zf-zn) 0 where: yScale = cot(fovY/2) xScale = yScale / aspect ratio
2/(r-l) 0 0 0 0 2/(t-b) 0 0 0 0 1/(zf-zn) 0 (l+r)/(l-r) (t+b)/(b-t) zn/(zn-zf) 1
OpenGL->D3D Shaders | 30 янв. 2008 | 11:06 | #28 |
---|
[src]
нет, но скоро думаю сделать.
нет, но скоро думаю сделать.
OpenGL->D3D Shaders | 29 янв. 2008 | 17:20 | #26 |
---|
[src]
INLINE void Direct3DRender::update(Camera& cam) const { if (!cam.IsChangeCamera()) { // камера не менялась return; } using Math3D::Vector3D; // получить указатель на матрицу float *Matrix = cam.GetViewMatrix().Matrix; // получить направление взгляда Vector3D Direction = cam.GetDirection(); // получитьвектор правого направления Vector3D Right = cam.GetRight(); // получить вектор верхнего направления Vector3D Up = cam.GetUp(); // получить позицию Vector3D Position = cam.GetPosition(); // отображение векторов камеры DrawDebugVectorCamera(); Direction.Normalize(); // посчитать вектор верха Up = Direction * Right; Up.Normalize(); // посчитать вектор права Right = Up * Direction; Right.Normalize(); // установить вектор напрвления cam.SetDirection(Direction); // установить вектор верха cam.SetUp(Up); // установить вектор права cam.SetRight(Right); Matrix[0] = Right.x; Matrix[4] = Right.y; Matrix[8] = Right.z; Matrix[1] = Up.x; Matrix[5] = Up.y; Matrix[9] = Up.z; Matrix[2] = Direction.x; Matrix[6] = Direction.y; Matrix[10] = Direction.z; Matrix[12] = -dotProduct(Right, Position); Matrix[13] = -dotProduct(Up, Position); Matrix[14] = -dotProduct(Direction, Position); // применить преобразование pDevice->SetTransform(D3DTS_VIEW , reinterpret_cast<D3DXMATRIX *>(Matrix)); // построить пирамиду видимости cam.GetFrustum().ExtractFrustum(cam.GetProjectionMatrix().Matrix, cam.GetViewMatrix().Matrix); } // обновление текущей камеры INLINE void OpenGLRender::update(Camera& cam) const { // камера не менялась if (!cam.IsChangeCamera()) { return; } using Math3D::Vector3D; // получить указатель на матрицу float *Matrix = cam.GetViewMatrix().Matrix; // получить направление взгляда Vector3D Direction = cam.GetDirection(); // получитьвектор правого направления Vector3D Right = cam.GetRight(); // получить вектор верхнего направления Vector3D Up = cam.GetUp(); // получить позицию Vector3D Position = cam.GetPosition(); Direction.Normalize(); // отображение векторов камеры DrawDebugVectorCamera(); // посчитать вектор верха Up = Direction * Right; Up.Normalize(); // посчитать вектор права Right = Up * Direction; Right.Normalize(); // установить вектор напрвления cam.SetDirection(Direction); // установить вектор верха cam.SetUp(Up); // установить вектор права cam.SetRight(Right); // установить вектор напрвления cam.SetDirection(Direction); // установить вектор верха cam.SetUp(Up); // установить вектор права cam.SetRight(Right); Matrix[0] = Right.x; Matrix[1] = Up.x; Matrix[2] = -Direction.x; Matrix[4] = Right.y; Matrix[5] = Up.y; Matrix[6] = -Direction.y;; Matrix[8] = Right.z; Matrix[9] = Up.z; Matrix[10] = -Direction.z;; Matrix[12] = -dotProduct(Right, Position); Matrix[13] = -dotProduct(Up, Position); Matrix[14] = dotProduct(Direction, Position); // загрузить видовую матрицу glLoadMatrixf(Matrix); // построить пирамиду видимости cam.GetFrustum().ExtractFrustum(cam.GetProjectionMatrix().Matrix, cam.GetViewMatrix().Matrix); } |
OpenGL->D3D Shaders | 29 янв. 2008 | 15:02 | #20 |
---|
0r@ngE
>еще одно, так как двиг изначально писался под OpenGL, то все матрицы расчитываются под правостороннюю систему координат.
>Как на это отреагирует D3D?
у меня такая-же ситуация
Отриагирует плохо. У меня частицы так колбасило. А камера такое вытворяла.
Матрицы камеры по любому строить нужно по разному. Рабочий код могу дать.
>и как его заставить реагировать правильно?
Либо юзать D3DX, либо попробовать поставить flag для учета системы координат, в классе матрицы, который будет инициализироваться соответcвующим рендером при старте.
Если я не ошибаюсь то еще и порядок хранения матриц различается в OpenGL/Direct3D
>еще одно, так как двиг изначально писался под OpenGL, то все матрицы расчитываются под правостороннюю систему координат.
>Как на это отреагирует D3D?
у меня такая-же ситуация
Отриагирует плохо. У меня частицы так колбасило. А камера такое вытворяла.
Матрицы камеры по любому строить нужно по разному. Рабочий код могу дать.
>и как его заставить реагировать правильно?
Либо юзать D3DX, либо попробовать поставить flag для учета системы координат, в классе матрицы, который будет инициализироваться соответcвующим рендером при старте.
Если я не ошибаюсь то еще и порядок хранения матриц различается в OpenGL/Direct3D
OpenGL->D3D Shaders | 29 янв. 2008 | 13:18 | #15 |
---|
0r@ngE
>однако никак нельзя сказать шейдеру какой самплер
>к какому юниту привязан, не прописывая это напрямую в теле шейдера?
никак, по умолчанию номер регистра увеличивается в порядке объявления самплеров в теле шейдера, и зачем это нужно?. самплер биндится в регистр определенного номера. Так можно сделать используя ID3DXEffect, в нем текстура может передается по имени.
А в GLSL вроде если объявление текстур идет в том-же порядке что их выставление через glBindTexture то вроде должно прокатить коректная установка текстур в шейдере, без вызова glGetUniformLocationARB/glUniform1iARB
Зачем ты в real-time парсишь uniform параметры? это-же работа со строками. Можно сделать некий ShaderParameters и в нем при загрузки сделать все glGetUniformLocationARB сохранив все индексы.
>однако никак нельзя сказать шейдеру какой самплер
>к какому юниту привязан, не прописывая это напрямую в теле шейдера?
никак, по умолчанию номер регистра увеличивается в порядке объявления самплеров в теле шейдера, и зачем это нужно?. самплер биндится в регистр определенного номера. Так можно сделать используя ID3DXEffect, в нем текстура может передается по имени.
А в GLSL вроде если объявление текстур идет в том-же порядке что их выставление через glBindTexture то вроде должно прокатить коректная установка текстур в шейдере, без вызова glGetUniformLocationARB/glUniform1iARB
Зачем ты в real-time парсишь uniform параметры? это-же работа со строками. Можно сделать некий ShaderParameters и в нем при загрузки сделать все glGetUniformLocationARB сохранив все индексы.
OpenGL->D3D Shaders | 29 янв. 2008 | 12:13 | #13 |
---|
[src]
незачто за ссылку.
>А есть статистика по выходному ассемблеру из CG? Хороший код?
Вполне нормальный, говорят не совсем мега крутой компилятор, его постоянно обновляют и улучшают. Но стоит учесть что сильную оптимизацию делает драйвер, далее я ставлю при компиляции шейдеров флажки по по оптимизации. Я разницы в FPS при использовании HLSL или Cg в Direct3D не замечал. Если уж не уверен в компиляторе Cg то можешь прямо Cg шейдер подсовывать D3DXCompileShader. Если бы у Cg были бы проблемы со скоростью его бы не юзали мировые авторитеты как Id, Crytek, Sony, более того реализация GLSL компилятора под карты nVidia реализовано именно через Cg.(тут как раз и есть проблемы преобразования типов int->float если компилить на ATI). Ошромный + в Cg что он выдает стандартизированный код для GLSL и он компилится на ATI.
Ну и стоит учесть что Cg разработывали Microsoft и NVidia вскоре свою реализацию Microsoft назвала HLSL, а nVidia Cg.
единственный и правильный выход для мультирендера это Cg.
0r@ngE
нужно выставить номер текстурного модуля
тогда в шейдере
если втрой модуль и т.д.
в этом случае нужно писать номер регистра для текстуры, если он > 0
незачто за ссылку.
>А есть статистика по выходному ассемблеру из CG? Хороший код?
Вполне нормальный, говорят не совсем мега крутой компилятор, его постоянно обновляют и улучшают. Но стоит учесть что сильную оптимизацию делает драйвер, далее я ставлю при компиляции шейдеров флажки по по оптимизации. Я разницы в FPS при использовании HLSL или Cg в Direct3D не замечал. Если уж не уверен в компиляторе Cg то можешь прямо Cg шейдер подсовывать D3DXCompileShader. Если бы у Cg были бы проблемы со скоростью его бы не юзали мировые авторитеты как Id, Crytek, Sony, более того реализация GLSL компилятора под карты nVidia реализовано именно через Cg.(тут как раз и есть проблемы преобразования типов int->float если компилить на ATI). Ошромный + в Cg что он выдает стандартизированный код для GLSL и он компилится на ATI.
Ну и стоит учесть что Cg разработывали Microsoft и NVidia вскоре свою реализацию Microsoft назвала HLSL, а nVidia Cg.
единственный и правильный выход для мультирендера это Cg.
0r@ngE
нужно выставить номер текстурного модуля
IDirect3DDevice::SetTexture(0, IDirect3DTexture9 *);
uniform sampler2D tex0 : register(s0); // по умолчанию регистр 0, писать не обязательно |
IDirect3DDevice::SetTexture(1, IDirect3DTexture9 *);
uniform sampler2D tex0 : register(s1);
OpenGL->D3D Shaders | 29 янв. 2008 | 11:16 | #8 |
---|
0r@ngE
есть несколько путей:
1) Использовать Cg
http://www.developer.nvidia.com/object/cg_toolkit.html
2) использовать либу HLSL2GLSL http://sourceforge.net/projects/hlsl2glsl
Я бы на твоем месте использовал Cg как самый лучший вариант. писать шейдеры все нужно на Cg далее несколько вариантов.
1) непосредственно юзать Cg Runtime и работать с шейдерами через него.(в конечном счете он вызывает OpenGL/Direct3D API).
2) компилировать его в соответвующие профили и подсовывать результирующий код для D3DXAssembleShader (или прямо напрямую D3DXCompileshader минуя Cg компилятора т.к. Cg == HLSL в большинтве случаев) в случае Direct3D, либо glShaderSourceARB(glProgramStringARB если используешь ARB программы) в случае OpenGL.
сразу скажу что GL State в случае компиляции в GLSL Cg не поддерживает. поэтому gl_ModelViewProjectionMatrix нужно передавать самому(ну ничего страшного тут нет т.к. в Direct3D будешь передавать сам).
если использовать GL_ARB_fragment/GL_ARB_vertex_program то GL State используется на ура.
вот портирование шейдера с минимальным различием с GLSL >не хочу, такой вот я капризный =(
ну капризничай дальше :) аргументы скажешь? я юзаю Cg для мультирендера 2 рендера работают на ура. В том числе Cg работает со свистом под OpenGL на ATI. Все шейдеры написаны на Cg.
есть анимация травы деревьев бамп маппинг, тени(в OpenGL пока не заработали но это не проблема Cg)
>судя по FarCry, это не самое удачное решение проблемы
а что там не так работает? а Quake Wars тоже Cg использует.
есть несколько путей:
1) Использовать Cg
http://www.developer.nvidia.com/object/cg_toolkit.html
2) использовать либу HLSL2GLSL http://sourceforge.net/projects/hlsl2glsl
Я бы на твоем месте использовал Cg как самый лучший вариант. писать шейдеры все нужно на Cg далее несколько вариантов.
1) непосредственно юзать Cg Runtime и работать с шейдерами через него.(в конечном счете он вызывает OpenGL/Direct3D API).
2) компилировать его в соответвующие профили и подсовывать результирующий код для D3DXAssembleShader (или прямо напрямую D3DXCompileshader минуя Cg компилятора т.к. Cg == HLSL в большинтве случаев) в случае Direct3D, либо glShaderSourceARB(glProgramStringARB если используешь ARB программы) в случае OpenGL.
сразу скажу что GL State в случае компиляции в GLSL Cg не поддерживает. поэтому gl_ModelViewProjectionMatrix нужно передавать самому(ну ничего страшного тут нет т.к. в Direct3D будешь передавать сам).
если использовать GL_ARB_fragment/GL_ARB_vertex_program то GL State используется на ура.
вот портирование шейдера с минимальным различием с GLSL >не хочу, такой вот я капризный =(
ну капризничай дальше :) аргументы скажешь? я юзаю Cg для мультирендера 2 рендера работают на ура. В том числе Cg работает со свистом под OpenGL на ATI. Все шейдеры написаны на Cg.
есть анимация травы деревьев бамп маппинг, тени(в OpenGL пока не заработали но это не проблема Cg)
>судя по FarCry, это не самое удачное решение проблемы
а что там не так работает? а Quake Wars тоже Cg использует.