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

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

Требование к Shader Model 3 GPU9 июня 201211: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,
Производительность на sgx5407 июня 201218:01#5
StiX
> для чего достаточно диапазона [0..255]?
для его задач я думаю достаточно. Разве для вершинного цвета всегда делают float ? я думаю это специфическая задача и не его случай.
Производительность на sgx5407 июня 201216:12#3
InsaneMalkavian
>формат вершин pos - float3, color - float4
а зачем float4 ? uchar4 достаточно. Памяти меньше.
>Это вообще более-менее адекватные цифры?
непонятно что за геометрия, есть ли перекрывающиеся полигоны, какой процент занимает на экране. может там по Fill Rate просадка.
> Отдельно погонял практические пустые draw calls
а что значит пустые?

вершин: 36
100  14.124
...
вершин: 120
100  2.265

Судя по результатам перегружен вершинный конвейер либо сложная геометрия(возможно и пиксельный). В 2 раза увеличиваем число вершин FPS падает в 7 раз.
Покажи скрины с геометрией и wireframe режим.

Производительность на sgx5406 июня 201217: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.
Помогите с идеями оптимизации в "сложных условиях"3 июня 201213: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 для мешей может сократиться.
Помогите с идеями оптимизации в "сложных условиях"3 июня 201211:21#45
BorisV
Много уже написали, clip distance делали для объектов? Вообще пробовать нужно PerfHUD'ом смотреть. Почитаю подробнее что написали уже в теме и т.д., может еще что посоветую.
Разделение шейдеров3 июня 201211:15#22
gammaker
> Для моего движка минимальные требования - OpenGL 3.3. Значит шейдеры будут
> использоваться начиная с 330. 420 от них вряд ли чем-то отличается. Зачем мне
> тогда Cg?
Я все еще думал что ты хочешь поддерживать OpenGL 2.1, например карты ATI X1900XT, nVidia 7900 GT вроде еще не совсем дохлые.
Разделение шейдеров2 июня 201222:23#20
gammaker
> Cg не разделяет шейдеры.
> Так чем же он в моей ситуации лучше GLSL? Еси и там, и там, приходится
> эмулировать разделение?
Тебе Cg даст один код на все версии GLSL.(120-410)
Разделение шейдеров1 июня 201214: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 + макросы которые добавляют/урезают возможности наиболее правильный путь.
Разделение шейдеров1 июня 201211:30#5
gammaker
Используй Cg для компиляции в GLSL, не нужно разделение шейдеров. Там тебе и атрибуты и UBO будут. Прекрасно работает. ATI/nVidia
AMD gDEBugger обновился до версии 6.2 (комментарии)31 мая 201220:23#15
innuendo
Итак ставлю версию 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 мая 201216:22#11
innuendo
> Что в логе написано ?
не помню. Вечером напишу. может кто еще потестит.
AMD gDEBugger обновился до версии 6.2 (комментарии)31 мая 201215:35#9
innuendo
> > И когда их 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
Ну вот такое GPU Shader Analyzer отказывается компилить, после некоторых экспериментов я выяснил, что stuct сносит крышу ему. Если его убрать, то компилится.
Да и самое интересное данный шейдер компилится и работает на ATI/nVidia, но если это делать в отдельной программе как обычно glCreateShaderObject/glShaderSource,glCompileShader,glAttachObject,glLinkProgram
Велосипедный вектор30 мая 201217:59#55
gammaker
> Я же написал, что STL не использую. Хотя std::sort как раз в STL мне нравится
> больше всего. Но раз уж я решил STL не использовать, то и быструю сортировку
> сам напишу.
Надеюсь обгонишь std::sort хотя-бы из реализации от Visual C++, там не классическая реализация, а хитрее. В STLport более продвинуто, последняя быстрее MS реализации на 15-20%.
OpenGL передача массива в фрагментный шейдер29 мая 201217:25#15
ontario83
> заморачивайся на "массив из семи тысяч интов, которые надо передать в uniform
> блоке и получить к ним доступ со стороны шейдера" :)
В цикле получай массив для каждой строки экрана, и в нем выбирай тайл проходясь по строке экрана. Вроде так. Думаю с кодом уже разберешься. По идее будет двойной цикл. Это медленно будет. Поэтому ты сам более быстрое решение в 1 посте написал x = myarray[index/4][index%4], только там одномерный массив в UBO. Я думаю с хранением значений ID тайла в текстуре будет быстрее, текстуру вообще можно с 1 каналом выбрать. Как-то так.

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

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