Сообщения на форуме пользователя Andrey (19 стр.)
Требование к Shader Model 3 GPU | 9 июня 2012 | 11:30 | #9 |
---|
Executor
>Вот. Потому что VTF был опционален для SM3. Вот где об этом написано?
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509677(v=vs.85).aspx
далее по ссылкам
http://msdn.microsoft.com/en-us/library/windows/desktop/bb206339(v=vs.85).aspx
т.е. нужно проверить возможность созданной текстуры использоваться в вершинном шейдере.
ReeV
> убогое апи?
ну почему же. придется и в OpenGL проверять поддержку вроде через glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,
>Вот. Потому что VTF был опционален для SM3. Вот где об этом написано?
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509677(v=vs.85).aspx
далее по ссылкам
http://msdn.microsoft.com/en-us/library/windows/desktop/bb206339(v=vs.85).aspx
т.е. нужно проверить возможность созданной текстуры использоваться в вершинном шейдере.
ReeV
> убогое апи?
ну почему же. придется и в OpenGL проверять поддержку вроде через glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,
Производительность на sgx540 | 7 июня 2012 | 18:01 | #5 |
---|
StiX
> для чего достаточно диапазона [0..255]?
для его задач я думаю достаточно. Разве для вершинного цвета всегда делают float ? я думаю это специфическая задача и не его случай.
> для чего достаточно диапазона [0..255]?
для его задач я думаю достаточно. Разве для вершинного цвета всегда делают float ? я думаю это специфическая задача и не его случай.
Производительность на sgx540 | 7 июня 2012 | 16:12 | #3 |
---|
InsaneMalkavian
>формат вершин pos - float3, color - float4
а зачем float4 ? uchar4 достаточно. Памяти меньше.
>Это вообще более-менее адекватные цифры?
непонятно что за геометрия, есть ли перекрывающиеся полигоны, какой процент занимает на экране. может там по Fill Rate просадка.
> Отдельно погонял практические пустые draw calls
а что значит пустые?
>формат вершин pos - float3, color - float4
а зачем float4 ? uchar4 достаточно. Памяти меньше.
>Это вообще более-менее адекватные цифры?
непонятно что за геометрия, есть ли перекрывающиеся полигоны, какой процент занимает на экране. может там по Fill Rate просадка.
> Отдельно погонял практические пустые draw calls
а что значит пустые?
вершин: 36
100 14.124
...
вершин: 120
100 2.265
Судя по результатам перегружен вершинный конвейер либо сложная геометрия(возможно и пиксельный). В 2 раза увеличиваем число вершин FPS падает в 7 раз.
Покажи скрины с геометрией и wireframe режим.
Производительность на sgx540 | 6 июня 2012 | 17:09 | #1 |
---|
InsaneMalkavian
OpenGL ES 1.1 или OpenGL ES 2.0 ?
Если OpenGL 1.1 то ориентируйся на GL_MAX_ELEMENTS_INDICES, GL_MAX_ELEMENTS_VERTICES
http://www.khronos.org/opengles/documentation/opengles1_0/html/gl… tInteger.html
про OpenGL ES 2.0 ничего не указана, нужно подбирать опытным путем, т.е. брать высокополигональную сцену и изменяя число вершин и число DIP смотреть FPS подбирая оптимальные значения.
На мой взгляд число вершин не должно быть больше 65535. Число DIP лучше минимизировать не больше 100-200.
OpenGL ES 1.1 или OpenGL ES 2.0 ?
Если OpenGL 1.1 то ориентируйся на GL_MAX_ELEMENTS_INDICES, GL_MAX_ELEMENTS_VERTICES
http://www.khronos.org/opengles/documentation/opengles1_0/html/gl… tInteger.html
про OpenGL ES 2.0 ничего не указана, нужно подбирать опытным путем, т.е. брать высокополигональную сцену и изменяя число вершин и число DIP смотреть FPS подбирая оптимальные значения.
На мой взгляд число вершин не должно быть больше 65535. Число DIP лучше минимизировать не больше 100-200.
Помогите с идеями оптимизации в "сложных условиях" | 3 июня 2012 | 13:26 | #50 |
---|
BorisV
> 25 мс рендеринг в цвет, 8 мс в тень, 20 мс на всю подготовку объектов
> (изначально, было 38, но еще думаю выжать 10-15 удастся)
20 мс на подготовку объектов? это поиск сортировка, расчет анимация, обновление частиц? Ну если так, то на CPU у тебя возможна просадка. 8мс для отрисоки в тень наверное многовато, буфер для отрисоки в тень упрости, для деревьев позиция + texcoord, для остальных объектов хватит только позиции.
1) Еще я у тебя увидел деревья. Я та понял там альфат тест, делаешь discard в шейдере или IDirect3DDevice9::SetRenderState ?. с расстоянием уменьшая Alpha Ref, меньше будет пикселей рисоваться.
2) Отключай прозрачность окон в домах по расстоянию
>уже не помню, давно экспериментировал и пришел к выводу, что в количество дипов и в вершинную производительность упёрся (поровну на тестовом железе)
3) пробовал half floaf делать для вершин? Это естественно на уровне экспортера придется реализовывать. ATI tootle попробуй, overdraw для мешей может сократиться.
> 25 мс рендеринг в цвет, 8 мс в тень, 20 мс на всю подготовку объектов
> (изначально, было 38, но еще думаю выжать 10-15 удастся)
20 мс на подготовку объектов? это поиск сортировка, расчет анимация, обновление частиц? Ну если так, то на CPU у тебя возможна просадка. 8мс для отрисоки в тень наверное многовато, буфер для отрисоки в тень упрости, для деревьев позиция + texcoord, для остальных объектов хватит только позиции.
1) Еще я у тебя увидел деревья. Я та понял там альфат тест, делаешь discard в шейдере или IDirect3DDevice9::SetRenderState ?. с расстоянием уменьшая Alpha Ref, меньше будет пикселей рисоваться.
2) Отключай прозрачность окон в домах по расстоянию
>уже не помню, давно экспериментировал и пришел к выводу, что в количество дипов и в вершинную производительность упёрся (поровну на тестовом железе)
3) пробовал half floaf делать для вершин? Это естественно на уровне экспортера придется реализовывать. ATI tootle попробуй, overdraw для мешей может сократиться.
Помогите с идеями оптимизации в "сложных условиях" | 3 июня 2012 | 11:21 | #45 |
---|
BorisV
Много уже написали, clip distance делали для объектов? Вообще пробовать нужно PerfHUD'ом смотреть. Почитаю подробнее что написали уже в теме и т.д., может еще что посоветую.
Много уже написали, clip distance делали для объектов? Вообще пробовать нужно PerfHUD'ом смотреть. Почитаю подробнее что написали уже в теме и т.д., может еще что посоветую.
Разделение шейдеров | 3 июня 2012 | 11:15 | #22 |
---|
gammaker
> Для моего движка минимальные требования - OpenGL 3.3. Значит шейдеры будут
> использоваться начиная с 330. 420 от них вряд ли чем-то отличается. Зачем мне
> тогда Cg?
Я все еще думал что ты хочешь поддерживать OpenGL 2.1, например карты ATI X1900XT, nVidia 7900 GT вроде еще не совсем дохлые.
> Для моего движка минимальные требования - OpenGL 3.3. Значит шейдеры будут
> использоваться начиная с 330. 420 от них вряд ли чем-то отличается. Зачем мне
> тогда Cg?
Я все еще думал что ты хочешь поддерживать OpenGL 2.1, например карты ATI X1900XT, nVidia 7900 GT вроде еще не совсем дохлые.
Разделение шейдеров | 2 июня 2012 | 22:23 | #20 |
---|
gammaker
> Cg не разделяет шейдеры.
> Так чем же он в моей ситуации лучше GLSL? Еси и там, и там, приходится
> эмулировать разделение?
Тебе Cg даст один код на все версии GLSL.(120-410)
> Cg не разделяет шейдеры.
> Так чем же он в моей ситуации лучше GLSL? Еси и там, и там, приходится
> эмулировать разделение?
Тебе Cg даст один код на все версии GLSL.(120-410)
Разделение шейдеров | 1 июня 2012 | 14:12 | #10 |
---|
gammaker
> А как устроен этот Cg, если он работает через GLSL,но разделяет шейдеры? Через UBO эмулирует?
Cg работает сам по себе. Это в nVidia GLSL компилируется через Cg, у них Cg компилятор прямо в драйвере, судя по nvemulate, т.е. там нету чистого GLSL компилятора, как например в ATI.
Cg не разделяет шейдеры. Что-бы решить твою задачу, тебе нужно скомпилить Cg компилятором код в GLSL с указанием версии GLSL в зависимости от видеокарты. В этом случае Cg выдаст соответствующий GLSL код, либо старый GLSL 120, либо новый GLSL >= 130 с атрибутами и т.д. UBO добавить можно самому - небольшая правка результата GLSL кода(я так и сделал в этом случае Cg код можно компилить HLSL компилятором, что дополнительный плюс для мультиапи), либо сразу писать с UBO прямо в Cg. После компиляции можешь работать как с обычным GLSL кодом. Не вижу более гибкого решения. Писать шейдеры под разные версии OpenGL и 3D апи поддерживая это все на диске это худшая идея. Cg + макросы которые добавляют/урезают возможности наиболее правильный путь.
> А как устроен этот Cg, если он работает через GLSL,но разделяет шейдеры? Через UBO эмулирует?
Cg работает сам по себе. Это в nVidia GLSL компилируется через Cg, у них Cg компилятор прямо в драйвере, судя по nvemulate, т.е. там нету чистого GLSL компилятора, как например в ATI.
Cg не разделяет шейдеры. Что-бы решить твою задачу, тебе нужно скомпилить Cg компилятором код в GLSL с указанием версии GLSL в зависимости от видеокарты. В этом случае Cg выдаст соответствующий GLSL код, либо старый GLSL 120, либо новый GLSL >= 130 с атрибутами и т.д. UBO добавить можно самому - небольшая правка результата GLSL кода(я так и сделал в этом случае Cg код можно компилить HLSL компилятором, что дополнительный плюс для мультиапи), либо сразу писать с UBO прямо в Cg. После компиляции можешь работать как с обычным GLSL кодом. Не вижу более гибкого решения. Писать шейдеры под разные версии OpenGL и 3D апи поддерживая это все на диске это худшая идея. Cg + макросы которые добавляют/урезают возможности наиболее правильный путь.
Разделение шейдеров | 1 июня 2012 | 11:30 | #5 |
---|
gammaker
Используй Cg для компиляции в GLSL, не нужно разделение шейдеров. Там тебе и атрибуты и UBO будут. Прекрасно работает. ATI/nVidia
Используй Cg для компиляции в GLSL, не нужно разделение шейдеров. Там тебе и атрибуты и UBO будут. Прекрасно работает. ATI/nVidia
AMD gDEBugger обновился до версии 6.2 (комментарии) | 31 мая 2012 | 20:23 | #15 |
---|
innuendo
Итак ставлю версию GLSL 130-330:
Если 410,420:
ERROR: 0:9: error(#106) Version number not supported by GL2
ERROR: error(#273) 1 compilation errors. No code generated
Итак ставлю версию GLSL 130-330:
Internal compilation failure. Possibly caused by GSA not supporting a GLSL feature used in shader.
ERROR: 0:7: error(#132) Syntax error: ';' parse error
ERROR: error(#273) 1 compilation errors. No code generated
Если 410,420:
ERROR: 0:9: error(#106) Version number not supported by GL2
ERROR: error(#273) 1 compilation errors. No code generated
Ну если компилить как я уже писал то работает и 410 версия. Нужно на форуме им написать.
berserkovich
> Похоже они его не только не тестируют, но даже никогда у себя не устанавливают
Бред какой-то. У меня все нормально.
AMD gDEBugger обновился до версии 6.2 (комментарии) | 31 мая 2012 | 16:22 | #11 |
---|
innuendo
> Что в логе написано ?
не помню. Вечером напишу. может кто еще потестит.
> Что в логе написано ?
не помню. Вечером напишу. может кто еще потестит.
AMD gDEBugger обновился до версии 6.2 (комментарии) | 31 мая 2012 | 15:35 | #9 |
---|
innuendo
> > И когда их gpu shader analyzer не в состоянии скомпилировать простецкий
> > шейдер
> > GLSL - это тоже "нормально" ???
> примеры ?
Ну вот такое GPU Shader Analyzer отказывается компилить, после некоторых экспериментов я выяснил, что stuct сносит крышу ему. Если его убрать, то компилится.
Да и самое интересное данный шейдер компилится и работает на ATI/nVidia, но если это делать в отдельной программе как обычно glCreateShaderObject/glShaderSource,glCompileShader,glAttachObject,glLinkProgram
> > И когда их gpu shader analyzer не в состоянии скомпилировать простецкий
> > шейдер
> > GLSL - это тоже "нормально" ???
> примеры ?
// glslv output by Cg compiler // cgc version 3.1.0013, build date Apr 18 2012 // command line args: -q -no_uniform_blocks -profile glslv -entry vsMain -fastprecision -fastmath -O3 -d3d -DBLENDWEIGHT=ATTR1 -profileopts version=130 //vendor NVIDIA Corporation //version 3.1.0.13 //profile glslv //program vsMain #version 130 #extension GL_ARB_uniform_buffer_object : enable struct PS { vec4 _position2; vec2 _uv01; vec3 _LightDir1; vec4 _shadowCrd; vec3 _ViewDir; vec3 _Normal; float _AlphaRef1; }; vec4 _position1; float _TMP0; float _a0014; vec4 _r0016; vec4 _r0018; vec4 _r0020; vec3 _r0022; in vec4 TEXCOORD0; in vec4 NORMAL; vec3 _TMP23; vec3 _TMP24; vec3 _TMP25; layout (std140) uniform UBO { vec4 _ModelViewProjection[4]; float _time_0_X; vec3 _objPosition; vec4 _MatTexture[4]; vec4 _WorldMatrix[4]; vec4 _LightDir; vec4 _CameraPosition; float _AlphaRef; }; in vec4 cg_Vertex; out vec4 cg_TexCoord4; out vec4 cg_TexCoord1; out vec4 cg_TexCoord3; out vec4 cg_TexCoord0; out vec4 cg_TexCoord5; out vec4 cg_TexCoord2; // main procedure, the original name was vsMain void main() { PS _vsOut; float _d; float _Sin_; _d = float(((_objPosition.x + _objPosition.y + _objPosition.z)*3.33333343E-001)); _a0014 = float(_d) + _time_0_X + (((_objPosition.x - cg_Vertex.x) + _objPosition.y) - cg_Vertex.y)/8.00000000E+000; _TMP0 = sin(_a0014); _Sin_ = float((_TMP0*cg_Vertex.y)); _position1.x = cg_Vertex.x + float((_Sin_*9.99755859E-002)); _position1.z = cg_Vertex.z + float((_Sin_*9.99755859E-002)); _r0016 = _position1.x*_ModelViewProjection[0]; _r0016 = _r0016 + cg_Vertex.y*_ModelViewProjection[1]; _r0016 = _r0016 + _position1.z*_ModelViewProjection[2]; _r0016 = _r0016 + cg_Vertex.w*_ModelViewProjection[3]; _r0018 = _position1.x*_MatTexture[0]; _r0018 = _r0018 + cg_Vertex.y*_MatTexture[1]; _r0018 = _r0018 + _position1.z*_MatTexture[2]; _r0018 = _r0018 + cg_Vertex.w*_MatTexture[3]; _r0020 = _position1.x*_WorldMatrix[0]; _r0020 = _r0020 + cg_Vertex.y*_WorldMatrix[1]; _r0020 = _r0020 + _position1.z*_WorldMatrix[2]; _r0020 = _r0020 + cg_Vertex.w*_WorldMatrix[3]; _vsOut._ViewDir = _r0020.xyz - _CameraPosition.xyz; _TMP23.x = _WorldMatrix[0].x; _TMP23.y = _WorldMatrix[0].y; _TMP23.z = _WorldMatrix[0].z; _r0022 = NORMAL.x*_TMP23; _TMP24.x = _WorldMatrix[1].x; _TMP24.y = _WorldMatrix[1].y; _TMP24.z = _WorldMatrix[1].z; _r0022 = _r0022 + NORMAL.y*_TMP24; _TMP25.x = _WorldMatrix[2].x; _TMP25.y = _WorldMatrix[2].y; _TMP25.z = _WorldMatrix[2].z; _r0022 = _r0022 + NORMAL.z*_TMP25; cg_TexCoord2 = _r0018; cg_TexCoord5.x = _AlphaRef; cg_TexCoord0.xy = TEXCOORD0.xy; cg_TexCoord3.xyz = _vsOut._ViewDir; cg_TexCoord1.xyz = _LightDir.xyz; cg_TexCoord4.xyz = _r0022; gl_Position = _r0016; return; } // main end |
Да и самое интересное данный шейдер компилится и работает на ATI/nVidia, но если это делать в отдельной программе как обычно glCreateShaderObject/glShaderSource,glCompileShader,glAttachObject,glLinkProgram
Велосипедный вектор | 30 мая 2012 | 17:59 | #55 |
---|
gammaker
> Я же написал, что STL не использую. Хотя std::sort как раз в STL мне нравится
> больше всего. Но раз уж я решил STL не использовать, то и быструю сортировку
> сам напишу.
Надеюсь обгонишь std::sort хотя-бы из реализации от Visual C++, там не классическая реализация, а хитрее. В STLport более продвинуто, последняя быстрее MS реализации на 15-20%.
> Я же написал, что STL не использую. Хотя std::sort как раз в STL мне нравится
> больше всего. Но раз уж я решил STL не использовать, то и быструю сортировку
> сам напишу.
Надеюсь обгонишь std::sort хотя-бы из реализации от Visual C++, там не классическая реализация, а хитрее. В STLport более продвинуто, последняя быстрее MS реализации на 15-20%.
OpenGL передача массива в фрагментный шейдер | 29 мая 2012 | 17:25 | #15 |
---|
ontario83
> заморачивайся на "массив из семи тысяч интов, которые надо передать в uniform
> блоке и получить к ним доступ со стороны шейдера" :)
В цикле получай массив для каждой строки экрана, и в нем выбирай тайл проходясь по строке экрана. Вроде так. Думаю с кодом уже разберешься. По идее будет двойной цикл. Это медленно будет. Поэтому ты сам более быстрое решение в 1 посте написал x = myarray[index/4][index%4], только там одномерный массив в UBO. Я думаю с хранением значений ID тайла в текстуре будет быстрее, текстуру вообще можно с 1 каналом выбрать. Как-то так.
> заморачивайся на "массив из семи тысяч интов, которые надо передать в uniform
> блоке и получить к ним доступ со стороны шейдера" :)
В цикле получай массив для каждой строки экрана, и в нем выбирай тайл проходясь по строке экрана. Вроде так. Думаю с кодом уже разберешься. По идее будет двойной цикл. Это медленно будет. Поэтому ты сам более быстрое решение в 1 посте написал x = myarray[index/4][index%4], только там одномерный массив в UBO. Я думаю с хранением значений ID тайла в текстуре будет быстрее, текстуру вообще можно с 1 каналом выбрать. Как-то так.