forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Clear Engine (Понятный движок) (http://forum.boolean.name/showthread.php?t=18702)

Mr_F_ 26.11.2013 16:35

Ответ: Clear Engine (Понятный движок)
 
я делаю так

Код:

vec3 normtex = texture2D(normalmap, IN_TexCoords).xyz;
normtex = normtex*2.0-1.0;

mat3 TBN = mat3(normalize(IN_Tangent), normalize(IN_Binormal), normalize(IN_Normal));
normal = TBN * normtex;

далее normal это нормаль в ворлдспейсе с учётом нормалмапы.
некоторые любят переводить лайты в тангент спейс, но мне кажется так удобнее.

pozitiffcat 26.11.2013 18:05

Ответ: Clear Engine (Понятный движок)
 
Ребят посмотрите мой шейдер

PHP код:

const std::string NORMAL_VS =
        
"attribute vec4 POSITION;\n"
        "attribute vec3 NORMAL;\n"
        "attribute vec2 TEXCOORD;\n"
        "attribute vec3 TANGENT;\n"
        "attribute vec3 BINORMAL;\n"
        "uniform float LIGHTS_COUNT;\n"
        "uniform mat4 PROJ_MATRIX;\n"
        "uniform mat4 VIEW_MATRIX;\n"
        "uniform mat4 MODEL_MATRIX;\n"
        "uniform mat3 NORMAL_MATRIX;\n"
        "uniform vec3 LIGHTS_POSITION[8];\n"
        "varying vec2 texcoord;\n"
        "varying vec3 vVaryingLightDir[8];\n"
        "varying vec3 vVaryingNormal;\n"
        "void main(){\n"
        "    mat3 rotmat = mat3(TANGENT,BINORMAL,NORMAL);\n"
        "    rotmat = NORMAL_MATRIX * rotmat;\n"
        "    vVaryingNormal = NORMAL;\n"
        "    vec4 vPosition4 = MODEL_MATRIX * POSITION;\n"
        "    vec3 vPosition3 = vPosition4.xyz / vPosition4.w;\n"
        "    for (int i = 0; i < 8; ++i){\n"
        "       if (int(LIGHTS_COUNT) <= i) break;\n"
        "       vVaryingLightDir[i] = -normalize(LIGHTS_POSITION[i] - vPosition3);\n"
        "       vVaryingLightDir[i] = rotmat * vVaryingLightDir[i];\n"
        "    }\n"
        "    gl_Position = PROJ_MATRIX * VIEW_MATRIX * MODEL_MATRIX * POSITION;\n"
        "    texcoord = TEXCOORD;\n"
        "}"
;

const 
std::string NORMAL_FS =
        
"uniform sampler2D TEXTURE_DIFFUSE;\n"
        "uniform sampler2D TEXTURE_NORMAL;\n"
        "uniform vec4 LIGHTS_AMBIENT[8];\n"
        "uniform vec4 LIGHTS_DIFFUSE[8];\n"
        "uniform vec4 LIGHTS_SPECULAR[8];\n"
        "uniform float LIGHTS_COUNT;\n"
        "varying vec2 texcoord;\n"
        "varying vec3 vVaryingLightDir[8];\n"
        "varying vec3 vVaryingNormal;\n"
        "void main(){\n"
        "    gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n"
        "    float maxVariance = 10.0;\n"
        "    float minVariance = maxVariance / 2.0;\n"
        "    vec3 normalAdjusted = vVaryingNormal + normalize(texture2D(TEXTURE_NORMAL, texcoord.st).rgb * maxVariance - minVariance);\n"
        "    vec3 texDiff = texture2D(TEXTURE_DIFFUSE, texcoord.st).rgb;\n"
        "    int lc = int(LIGHTS_COUNT);\n"
        "    for (int i = 0; i < lc; ++i){\n"
        "    float diffuseIntensity = max(0.0, dot(normalize(normalAdjusted), normalize(vVaryingLightDir[i])));\n"
        "    vec3 colour = (diffuseIntensity * LIGHTS_DIFFUSE[i].rgb) * texDiff + LIGHTS_AMBIENT[i].rgb;\n"
        "    vec4 vFragColour = vec4(colour, 1.0);\n"
        "    vec3 vReflection = normalize(reflect(-normalize(normalAdjusted), normalize(vVaryingLightDir[i])));\n"
        "    float specularIntensity = max(0.0, dot(normalize(normalAdjusted), vReflection));\n"
        "    if(diffuseIntensity > 0.98)\n"
        "    {\n"
        "        float fSpec = pow(specularIntensity, 64.0);\n"
        "        vFragColour.rgb += vec3(fSpec * LIGHTS_SPECULAR[i].rgb);\n"
        "    }\n"
        "    gl_FragColor += vFragColour;\n"
        "    }\n"
        "    gl_FragColor.a = 1.0;\n"
        "}"


вроде все правильно

Mr_F_ 26.11.2013 18:41

Ответ: Clear Engine (Понятный движок)
 
Цитата:

rotmat = NORMAL_MATRIX * rotmat;\n"
что это?

Цитата:

vec3 vPosition3 = vPosition4.xyz / vPosition4.w;\n"
в модель матрице не должно быть по идее ничего такого, что требовало бы потом этого деления.

Цитата:

for (int i = 0; i < 8; ++i){\n"
" if (int(LIGHTS_COUNT) <= i) break;\n"
" vVaryingLightDir[i] = -normalize(LIGHTS_POSITION[i] - vPosition3);\n"
" vVaryingLightDir[i] = rotmat * vVaryingLightDir[i];\n"
это намного лучше во фрагментном считать

Цитата:

vec3 normalAdjusted = vVaryingNormal + normalize(texture2D(TEXTURE_NORMAL, texcoord.st).rgb * maxVariance - minVariance);\n"
ты зачем-то прибавляешь нормалмапу к вертексной ворлд нормали, забивая на TBN
--

а, я понял, ты переводишь направление от лайтов в тангент спейс в VS, все равно непонятно что за прибавление вертексной нормали в PS тогда, плюс направление от поинтлайтов считать в VS на сцене из кубов это жесть по-любому.

pozitiffcat 26.11.2013 19:07

Ответ: Clear Engine (Понятный движок)
 
Я не сильно силен в такой математике, что то как то по формулам набросал. Мажешь помочь с этими шейдерами? Что как правильно написать

Samodelkin 26.11.2013 22:16

Ответ: Clear Engine (Понятный движок)
 
лучше помоги ему с математикой

pozitiffcat 27.11.2013 00:06

Ответ: Clear Engine (Понятный движок)
 
перепробывал кучу готовых шейдеров, вообще неадекватные результаты. ЧЯДНТ


moka 27.11.2013 00:46

Ответ: Clear Engine (Понятный движок)
 
TBN!

Mr_F_ 27.11.2013 00:48

Ответ: Clear Engine (Понятный движок)
 
лучше скажи в теории как ты понимаешь как работает бамп.
я тебя поправлю где надо. без понимания всё время придётся копипастить.

pozitiffcat 27.11.2013 00:49

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от moka (Сообщение 270666)
TBN!

да блин, естественно я юзаю tbn. Ребят, у вас есть проверенный временем шейдер?

pozitiffcat 27.11.2013 00:51

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270667)
лучше скажи в теории как ты понимаешь как работает бамп.
я тебя поправлю где надо. без понимания всё время придётся копипастить.

я понимаю это так:
мы накладываем обычное попиксельное освещение, но нормали берем из текстуры, учитывая нормаль самого объекта и матрицы нормали... как это все между собой связывается в коде, я понятия не имею, да и не видел по этому поводу простых для понимания мануалов

Mr_F_ 27.11.2013 01:05

Ответ: Clear Engine (Понятный движок)
 
Цитата:

учитывая нормаль самого объекта и матрицы нормали
не так.
Нормалмапа - находится в пространстве TBN, которое образуется одной матрицей, сделанной из тангента, бинормали и нормали. Эти три хреновины - тупо 3 перпендикулярные друг другу вектора.
Каждый пиксель нормалмапы это вектор в их системе координат.
Синий канал это насколько вектор повёрнут в сторону нормали, красный и зеленый - в стороны других осей (в каждом пикселе).

Только щас заметил, ты не декодируешь сам вектор из карты то. Нужно всегда делать nmap = nmap*2-1, чтобы из диапазона [0;1] перевести каждый компонент вектора нормалмапы в диапазон [-1;1].

Ну вот, короче тебе надо соорудить TBN матрицу из трёх векторов и умножить нормалмапу на неё - тогда ты переведёшь нормалку в ворлдспейс, или (как у тебя было) умножить ворлдспейсовые вектора направлений света на неё (в другой последовательности), тогда ты переведёшь их в пространство нормалки и осветишь там.
В блице TFormNormal видел? Ну вот, там были локальные координаты и глобальные, а тут локальные координаты задаются TBN матрицей на каждый вертекс/фрагмент и надо тформить чтобы всё оказалось в одном пространстве в результате.

Я бы по-прежнему рекомендовал перевести нормалку в ворлдспейс, потому что это 1 умножение матрицы против кучи умножений на каждый лайт в цикле.

Направление света от поинт лайтов надо считать в PS! Если у тебя не супер тесселлированная геометрия. Повертексно это слишком убого и ты вообще не поймёшь правильно или неправильно.

pozitiffcat 27.11.2013 01:08

Ответ: Clear Engine (Понятный движок)
 
спасибо понятно объяснил =) да и статейку на геймдеве нашел интересную завтра попробую запилить )))

pozitiffcat 27.11.2013 10:57

Ответ: Clear Engine (Понятный движок)
 
Заметил такую вещь. Исследовал модели освещения и юзал примеры шейдеров. Так вот что означает glModelViewMatrix? Это view_matrix * model_matrix или только model_matrix? Потому что если заюзать view_matrix * model_matrix, то изображение становится не правильное...

Еще: почему такой странный эффект может быть? Чем дальше двигаем свет, тем ярче светит O_o
http://rutube.ru/video/7f47e12f23b3c...c964c7730847c/

PHP код:

const std::string NORMAL_VS =
        
"varying vec3 l;\n"
        "varying vec3 v;\n"
        "varying vec3 n;\n"
        "attribute vec4 POSITION;\n"
        "attribute vec3 NORMAL;\n"
        "attribute vec2 TEXCOORD;\n"
        "attribute vec3 TANGENT;\n"
        "attribute vec3 BINORMAL;\n"
        "uniform vec3 LIGHTS_POSITION[8];\n"
        "uniform vec3 CAMERA_POSITION;\n"
        "uniform mat4 MODEL_VIEW_PROJ_MATRIX;\n"
        "uniform mat4 MODEL_MATRIX;\n"
        "uniform mat4 VIEW_MATRIX;\n"
        "uniform mat3 NORMAL_MATRIX;\n"
        "varying vec2 texcoord;\n"
        "void main(void){\n"
        "    vec3 p = vec3(MODEL_MATRIX * POSITION);\n"
        "    l = normalize(vec3(LIGHTS_POSITION[0]) - p ); \n"
        "    v = normalize(vec3(CAMERA_POSITION) - p );\n"
        "    n = normalize(NORMAL_MATRIX * NORMAL);\n"
        "    //mat3 tbn = mat3(TANGENT, BINORMAL, NORMAL);\n"
        "    //l = tbn * l;\n"
        "    gl_Position = MODEL_VIEW_PROJ_MATRIX * POSITION;\n"
        "    texcoord = TEXCOORD;\n"
        "}\n"
;

const 
std::string NORMAL_FS =
        
"uniform sampler2D TEXTURE_DIFFUSE;\n"
        "uniform sampler2D TEXTURE_NORMAL;\n"
        "uniform vec4 LIGHTS_DIFFUSE[8];\n"
        "uniform vec4 LIGHTS_SPECULAR[8];\n"
        "varying vec3 l;\n"
        "varying vec3 v;\n"
        "varying vec3 n;\n"
        "varying vec2 texcoord;\n"
        "void main (void)\n"
        "{\n"
        "    vec4 diffc = texture2D(TEXTURE_DIFFUSE, texcoord);\n"
        "    vec4 bumpc = texture2D(TEXTURE_NORMAL, texcoord);\n"
        "    vec3 bumpn = normalize((bumpc.rgb * 2.0 - 1.0) * vec3(1.0, 1.0, 1.0));"
        "    vec3 h = normalize(v + l);\n"
        "    const float specPower = 20.0;\n"
        "    vec3 n2   = normalize ( -n );\n"
        "    vec3 bn2  = normalize ( -bumpn );\n"
        "    vec3 l2   = normalize ( l );\n"
        "    vec3 h2   = normalize ( h );\n"
        "    vec4 diff = LIGHTS_DIFFUSE[0] * max ( dot ( n2, l2 ), 0.0 );\n"
        "    vec4 diffn = LIGHTS_DIFFUSE[0] * max ( dot ( bn2, l2 ), 0.0 );\n"
        "    vec4 spec = LIGHTS_SPECULAR[0] * pow ( max ( dot ( n2, h2 ), 0.0 ), specPower );\n"
        "    gl_FragColor = diff * diffc + spec;\n"
        "}\n"



Mr_F_ 27.11.2013 14:17

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Еще: почему такой странный эффект может быть?
тут вроде всё более-менее правильно выглядит, только ты не добавил затухание, поэтому при удалении от стенки лайта, стенка заярчается вместо затемнения (векторы от лайта к стенке становятся более перпендикулярны ей).

затухание по нормальному задаётся формулой 1/(dist*dist)
http://en.wikipedia.org/wiki/Inverse-square_law

Цитата:

glModelViewMatrix? Это view_matrix * model_matrix
ну да, или последовательность может быть другая.

Цитата:

Исследовал модели освещения
там новые матрицы не нужны обычно, они все отталкиваются, как правило, от 3х векторов: нормаль, вектор взгляда и направление света, плюс какие-нибудь переменные типа roughness.


----
а, ещё забыл, blinn отстойно юзать дефолтный, т.к. он не учитывает закон сохранения энергии, это ещё причина уярчений неадекватных.
в реале чем сильнее рассеивается блик, тем он менее интенсивный.

покури-с:
http://www.rorydriscoll.com/2009/01/...tion-in-games/
http://www.thetenthplanet.de/archives/255

pozitiffcat 27.11.2013 16:27

Ответ: Clear Engine (Понятный движок)
 
с затуханием получилось, нос gl_ModelViewMatrix непонятно, всетаки нужно учитывать VIEW_MATRIX или нет, если не брать ее при расчете позиции вершины, то все ок.

Samodelkin 27.11.2013 17:34

Ответ: Clear Engine (Понятный движок)
 
При умножении матриц в общем случае A x B != B x A.
Попробуй model_matrix * view_matrix.
Без VIEW_MATRIX будет все ок, но камеру нельзя будет перемещать в пространстве.

pozitiffcat 27.11.2013 17:36

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Samodelkin (Сообщение 270697)
При умножении матриц в общем случае A x B != B x A.
Попробуй model_matrix * view_matrix.
Без VIEW_MATRIX будет все ок, но камеру нельзя будет перемещать в пространстве.

да знаю я это пробывал поразному...

Запилил почти нормально, но вот смущает следующее:

низ какой то странный, а бока вроде бы нормальные


PHP код:

const std::string NORMAL_VS =
        
"varying vec3 l;\n"
        "varying vec3 v;\n"
        "varying vec3 n;\n"
        "attribute vec4 POSITION;\n"
        "attribute vec3 NORMAL;\n"
        "attribute vec2 TEXCOORD;\n"
        "attribute vec3 TANGENT;\n"
        "attribute vec3 BINORMAL;\n"
        "uniform vec3 LIGHTS_POSITION[8];\n"
        "uniform vec3 CAMERA_POSITION;\n"
        "uniform mat4 MODEL_VIEW_PROJ_MATRIX;\n"
        "uniform mat4 MODEL_MATRIX;\n"
        "uniform mat4 VIEW_MATRIX;\n"
        "uniform mat3 NORMAL_MATRIX;\n"
        "varying float att;\n"
        "varying vec2 texcoord;\n"
        "void main(void){\n"
        "    vec3 p = vec3(MODEL_MATRIX * POSITION);\n"
        "    vec3 tmp = normalize(vec3(LIGHTS_POSITION[0]) - p );\n"
        "    vec3 _t = NORMAL_MATRIX * TANGENT;\n"
        "    vec3 _b = NORMAL_MATRIX * BINORMAL;\n"
        "    vec3 _n = NORMAL_MATRIX * NORMAL;\n"
        "    l.x = dot(tmp, _t);\n"
        "    l.y = dot(tmp, _b);\n"
        "    l.z = dot(tmp, _n);\n"
        "    tmp = -p;\n"
        "    v.x = dot(tmp, _t);\n"
        "    v.y = dot(tmp, _b);\n"
        "    v.z = dot(tmp, _n);\n"
        "    gl_Position = MODEL_VIEW_PROJ_MATRIX * POSITION;\n"
        "    texcoord = TEXCOORD;\n"
        "    att = min(1.0 / distance(LIGHTS_POSITION[0], POSITION.xyz) * 3.0, 1.0);\n"
        "}\n"
;

const 
std::string NORMAL_FS =
        
"uniform sampler2D TEXTURE_DIFFUSE;\n"
        "uniform sampler2D TEXTURE_NORMAL;\n"
        "uniform vec4 LIGHTS_DIFFUSE[8];\n"
        "uniform vec4 LIGHTS_SPECULAR[8];\n"
        "varying vec3 l;\n"
        "varying vec3 v;\n"
        "varying vec3 n;\n"
        "varying vec2 texcoord;\n"
        "varying float att;\n"
        "void main (void)\n"
        "{\n"
        "    vec4 diffmap = texture2D(TEXTURE_DIFFUSE, texcoord);\n"
        "    vec3 normmap = (texture2D(TEXTURE_NORMAL, texcoord).xyz * 2.0) - vec3(1.0, 1.0, 1.0);\n"
        "    vec4  diffColor = LIGHTS_DIFFUSE[0];\n"
        "    vec4  specColor = LIGHTS_SPECULAR[0];\n"
        "    const float specPower = 30.0;\n"
        "    vec3 n2   = normalize ( -normmap );\n"
        "    vec3 l2   = normalize ( l );\n"
        "    vec3 v2   = normalize ( v );\n"
        "    vec3 r    = reflect ( -v2, n2 );\n"
        "    vec4 diff = diffColor * max ( dot ( n2, l2 ), 0.0 );\n"
        "    vec4 spec = specColor * pow ( max ( dot ( l2, r ), 0.0 ), specPower );\n"
        "    gl_FragColor = att * (diff * diffmap + spec);\n"
        "}\n"



Mr_F_ 27.11.2013 19:55

Ответ: Clear Engine (Понятный движок)
 
выведи в рендер TBN, сделай 3 картинки на каждый вектор, скорее всего трабла в них.

pozitiffcat 27.11.2013 20:12

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270705)
выведи в рендер TBN, сделай 3 картинки на каждый вектор, скорее всего трабла в них.

nornal


tangent


binormal черный экран
Пробывал умножать вектор бинормали на (1.0,1.0,-1.0) что бы низ отображался, но в полном шейдере эффекта не дало, вообще никак не повлияло на нормал

Mr_F_ 27.11.2013 20:18

Ответ: Clear Engine (Понятный движок)
 
заскейль векторы перед выводом из [-1;1] в [0;1] чтоб понятнее:
vec*0.5+0.5

pozitiffcat 27.11.2013 20:27

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270708)
заскейль векторы перед выводом из [-1;1] в [0;1] чтоб понятнее:
vec*0.5+0.5

нормаль


бинормаль


тангент

Mr_F_ 27.11.2013 20:43

Ответ: Clear Engine (Понятный движок)
 
на глаз вроде нормальные.
попробуй перенести всё что связано с лайтами из VS в PS и посмотреть стало ли ок.
повертексные маленькие поинт лайты внутри кубов - это повод для косяков.

pozitiffcat 27.11.2013 20:45

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270712)
на глаз вроде нормальные.
попробуй перенести всё что связано с лайтами из VS в PS и посмотреть стало ли ок.
повертексные маленькие поинт лайты внутри кубов - это повод для косяков.

я разбил полигоны на кучу мелких. А как должно быть? На полу так же как на стенках?

PS. рендер с блендера

pozitiffcat 27.11.2013 23:50

Ответ: Clear Engine (Понятный движок)
 
Запилил поддержку лайтмапов


Mr_F_ 28.11.2013 00:25

Ответ: Clear Engine (Понятный движок)
 
как блендишь лайтмапы с дифузом?

pozitiffcat 28.11.2013 00:34

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270719)
как блендишь лайтмапы с дифузом?

диффуз * лайтмап, естественно с разных texcoord.
у меня вот еще вопрос. Как вот запиливают поддержку разных видов освещения да и еще с разными типами теней. Не писать же на каждый случай шейдер. (у меня уже штук 5). Или пишут один убер шейдер, но как тогда с производительностью. Да и слишком много команд в шейдер тоже не засунешь...

Mr_F_ 28.11.2013 01:14

Ответ: Clear Engine (Понятный движок)
 
Цитата:

диффуз * лайтмап
для LDR лайтмапов это даст очень унылый результат, добавь константу, на которую лайтмап будет домножаться, в старых играх (ХЛ2, мафия, макс пейн) она была равна 2 (потому что это можно было сделать FFP блендом), в результате лайтмап мог не только темнить но и засветлять.

Цитата:

Не писать же на каждый случай шейдер
- можно их генерировать из кусков кода
- можно юзать деферед (хотя я не фанат)

pozitiffcat 28.11.2013 09:02

Ответ: Clear Engine (Понятный движок)
 
Ну генерировать это понятно. Просто каждый кадр я задаю в каждый зарегестрированый на сцене шейдер информацию о источниках освещения, и неизвестно будет ли использоваться шейдер или нет... нужно запилить установку значений по требованию тогда.

HolyDel 28.11.2013 11:26

Ответ: Clear Engine (Понятный движок)
 
мне вот всегда было интересно почему все используют нормалкарты в тангентспейсе. ведь для статики можно было бы использовать и в обектспейсе нормалкарты. но нет. никто не использует.

pozitiffcat 28.11.2013 11:49

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от HolyDel (Сообщение 270733)
мне вот всегда было интересно почему все используют нормалкарты в тангентспейсе. ведь для статики можно было бы использовать и в обектспейсе нормалкарты. но нет. никто не использует.

там вроде другой эффект получается.. у меня до этого так было

Mr_F_ 28.11.2013 12:41

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Просто каждый кадр я задаю в каждый зарегестрированый на сцене шейдер информацию о источниках освещения
не знаю как в GL (в webgl вот нельзя), но в DX9 можно было назначать константы не просто "в шейдер" а в конкретный константный регистр на видяхе, так можно было бы 1 раз на старте рендера все константы для всех лайтов засунуть, а потом шейдеры их бы юзали или не юзали.
В DX10 и далее это ещё более удобно обёрнуто в constant buffers. Основная философия - разделить константы на группы по частоте обновления.


Цитата:

мне вот всегда было интересно почему все используют нормалкарты в тангентспейсе. ведь для статики можно было бы использовать и в обектспейсе нормалкарты
потому что те же 8 бит на обжектспейс это маловато, будет палится низкое кач-во.
грубо говоря, с тбн у нас уже идеально гладкие нормали объекта, и мы им добавляем доп отклонение 8 битной нмапой лишь, а так тебе придётся все нормали на объекте задавать 8 битами.

я делал для террейна нормали 8 битные ворлдспейс, смотрелось херово, пришлось юзать 16 бит хотя бы.

pozitiffcat 28.11.2013 13:34

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270735)
не знаю как в GL (в webgl вот нельзя), но в DX9 можно было назначать константы не просто "в шейдер" а в конкретный константный регистр на видяхе, так можно было бы 1 раз на старте рендера все константы для всех лайтов засунуть, а потом шейдеры их бы юзали или не юзали.
В DX10 и далее это ещё более удобно обёрнуто в constant buffers. Основная философия - разделить константы на группы по частоте обновления.

хм... гуглил, но не нагуглил такую фичу в opengl, неужели он не умеет такую важную вещь?

HolyDel 28.11.2013 13:55

Ответ: Clear Engine (Понятный движок)
 
не оно?
http://www.opengl.org/registry/specs...le_uniform.txt

Mr_F_ 28.11.2013 14:03

Ответ: Clear Engine (Понятный движок)
 
аналог констант буферов есть вроде, но это в современном ГЛ, не знаю как в мобилковом (в вебном нет):
http://www.opengl.org/wiki/Uniform_Buffer_Object

Цитата:

не оно?
и правда:
Цитата:

An older form of this functionality exists through the EXT_bindable_uniform extension.

pozitiffcat 28.11.2013 21:29

Ответ: Clear Engine (Понятный движок)
 
Собрал под win32, можете потыкать, там 3 сэмпла. Ну и собраная либа с инклюдами https://bitbucket.org/pozitiffcat/cl...ase_alpha2.zip

Randomize 28.11.2013 22:07

Ответ: Clear Engine (Понятный движок)
 

Цитата:

Работает на MaxSite CMS | Время: 6.3956 | SQL: 14 | Память: 41.08MB | Вход
Немедленно менять хостинг!
Нужен бесплатный тогда посмотри например:
http://byethost.com/
http://beget.ru/
http://hostinger.ru/ (не рекомендую)

ARA 28.11.2013 22:13

Ответ: Clear Engine (Понятный движок)
 
Свет както неправильно всёже работает. Я его приблизил вплотную к стене а он затух.

Arton 28.11.2013 22:14

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от pozitiffcat (Сообщение 270757)
Собрал под win32, можете потыкать, там 3 сэмпла. Ну и собраная либа с инклюдами https://bitbucket.org/pozitiffcat/cl...ase_alpha2.zip

Почему если удерживая курсор завести его за край окна (пример 1,2), то свет вырубается намертво?

pozitiffcat 28.11.2013 22:15

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Arton (Сообщение 270760)
Почему если удерживая курсор завести его за край окна (пример 1,2), то свет вырубается намертво?

положение там unsigned int, когда за экран заводишь там становится что то типа 45658764566

pozitiffcat 28.11.2013 22:16

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от ARENSHI (Сообщение 270759)
Свет както неправильно всёже работает. Я его приблизил вплотную к стене а он затух.

да вот и сам непойму всеже, правильно или нет, хотя блендер вроде похожую картинку дает...

ARA 28.11.2013 22:35

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от pozitiffcat (Сообщение 270762)
да вот и сам непойму всеже, правильно или нет, хотя блендер вроде похожую картинку дает...

Хотя смарю щас в юнити примерно также работает)
Вот что реально напрягает - спекуляр. Ваще что такое спекуляр? Это фэйклвое заблюреное отражение источника света на поверхности. А как предметы в зеркале отражаются, представь? Точно не так как у тебя в семпле. Щас блик как-то странно тянется к центру нижней границы экрана.
В юньке спек выглядит так:

moka 28.11.2013 22:53

Ответ: Clear Engine (Понятный движок)
 
ARENSHI, у тебя на этом скрине Y у нормалмапы инвертирован.

pozitiffcat 28.11.2013 22:53

Ответ: Clear Engine (Понятный движок)
 
да, я никак не могу победить этот странный эффект

ARA 28.11.2013 22:56

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от moka (Сообщение 270765)
ARENSHI, у тебя на этом скрине Y у нормалмапы инвертирован.

Точняк. Я щас сонный уже и не заметил даже. Нормалмапа не моя. Поправил. :)

HolyDel 29.11.2013 02:49

Ответ: Clear Engine (Понятный движок)
 
Нормалмапа не моя. Я просто разместил текстуру

pozitiffcat 29.11.2013 14:49

Ответ: Clear Engine (Понятный движок)
 
Я вот смотрел игры на мобилки в них есть bump. И у них выдает 30 fps, а моя демка выдает 12 fps ЧЯДНТ? Разумеется проверял без этого эффекта и фпс был нормальный даже с десятью скинеными модель камни по 50 костей в каждой. Вывод что тормозит шейдер но там тормозить то нечему

Samodelkin 29.11.2013 17:54

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от pozitiffcat (Сообщение 270780)
Я вот смотрел игры на мобилки в них есть bump. И у них выдает 30 fps, а моя демка выдает 12 fps ЧЯДНТ? Разумеется проверял без этого эффекта и фпс был нормальный даже с десятью скинеными модель камни по 50 костей в каждой. Вывод что тормозит шейдер но там тормозить то нечему

А ты смотрел шейдер под ассемблером?

pozitiffcat 29.11.2013 18:55

Ответ: Clear Engine (Понятный движок)
 
каким образом я посмотрю скомпиленый шейдер на ios?

убрав спекуляр увеличилась скорость с 12 до 21 фпс. ВОТ ЧЕ ТУТ МОЖЕТ ТОРМОЗИТЬ!
PHP код:

"    vec3 r    = reflect ( -v2, n2 );\n"
"    vec4 spec = specColor * pow ( max ( dot ( l2, r ), 0.0 ), specPower );\n" 


Samodelkin 29.11.2013 21:23

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от pozitiffcat (Сообщение 270791)
каким образом я посмотрю скомпиленый шейдер на ios?

убрав спекуляр увеличилась скорость с 12 до 21 фпс. ВОТ ЧЕ ТУТ МОЖЕТ ТОРМОЗИТЬ!
PHP код:

"    vec3 r    = reflect ( -v2, n2 );\n"
"    vec4 spec = specColor * pow ( max ( dot ( l2, r ), 0.0 ), specPower );\n" 


Я имею ввиду свой шейдер посмотри - он же сначала в асм компилируется. Наверное из других игр при желании тоже можно вытащить дизасмом.

Наверное степень? Попробуй обойтись без нее. Почитай об оптимизации шейдеров на ассемблере. Еще об особенностях чипов, может они туго справляются с некоторыми операциями.

4yBa4Ok 29.11.2013 21:25

Ответ: Clear Engine (Понятный движок)
 
pozitiffcat, не думал о компиляции движка на WP 7?

pozitiffcat 29.11.2013 23:51

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от 4yBa4Ok (Сообщение 270794)
pozitiffcat, не думал о компиляции движка на WP 7?

там opengl не зайдет походу. Пилить драйвер directx вломы.. хотя архитектура двигла позволит это сделать

pozitiffcat 03.12.2013 18:00

Ответ: Clear Engine (Понятный движок)
 
Решил попробовать новую концепцию. Вспомнил старые добрые движки, где выводом графики занимался программист, т.е., у нас не было графа сцены и мы в любом месте игрового цикла могли вызвать, что-то типа drawImage(x, y, image) и у нас нарисуется картинка. Это очень удобный механизм для рисования 2д графики. Немного подумав, я решил, что в 3д такая реализация тоже может быть удобной. Я решил попробовать сделать такую реализацию движка параллельно с Clear Engine. Посмотрим, что получится удобней.
Особенно хорошо будет, то, что мы сами можем создавать нужный нам цикл рендера, правда такой движок уже не будет иметь право называться легким, но на основе него можно будет писать свои графы и рендер-циклы.

ARA 03.12.2013 18:19

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Clear Engine
Slim Engine
Плодишь!

moka 03.12.2013 18:22

Ответ: Clear Engine (Понятный движок)
 
Проблемы с альфа сортами, и рендером батчами под одним материалом для одного прохода и миниманизации переключений стейтов, подобное ляжет на плечи разраба.

Также менеджить свой стейт - это круто в плане контроля и возможностей, но очень не удобно и требует дополнительной разработки от самого разраба, что приведёт его к переписке того же стейт менеджера, но по своему.

Имхо, стейт менеджер должен быть конкретным и простым, реализующим всё что нужно и наипростейшими методами.
Удобство работы имхо на первом месте, тогда и не нужно будет думать о своём стейт менеджере.

ABTOMAT 03.12.2013 18:28

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от pozitiffcat (Сообщение 270941)
Решил попробовать новую концепцию. Вспомнил старые добрые движки, где выводом графики занимался программист, т.е., у нас не было графа сцены и мы в любом месте игрового цикла могли вызвать, что-то типа drawImage(x, y, image) и у нас нарисуется картинка. Это очень удобный механизм для рисования 2д графики. Немного подумав, я решил, что в 3д такая реализация тоже может быть удобной. Я решил попробовать сделать такую реализацию движка параллельно с Clear Engine. Посмотрим, что получится удобней.
Особенно хорошо будет, то, что мы сами можем создавать нужный нам цикл рендера, правда такой движок уже не будет иметь право называться легким, но на основе него можно будет писать свои графы и рендер-циклы.

Ну и в чём будет принципиальное отличие?
В 2Д так делали потому что в каком порядке отрендеришь картинки, в таком они и будут друг на друге лежать.
В 3Д этим занимается Z-буфер, и хоть ты в каком порядке отрендеришь, всё будет так же, как и с Z-буфером.
Логично рендерить группами с одинаковыми текстурами/шейдерами, чтоб не гонять их каждый раз и этим стоит заниматься движку.
Альфе нужна сортировка, но с этим опять же лучше пусть двиг справляется.
В-общем я не вижу что такого может прогер сделать крутого, что не может сделать за него двиг и смысла забивать прогеру голову этим.
Разве что в FPS ствол поверх всего отрендерить, но ради 1 ствола огорода не городят.

HolyDel 03.12.2013 19:12

Ответ: Clear Engine (Понятный движок)
 
У меня в движке есть граф сцены, что совершенно не мешает рендерить в ручную объекты.
Код:

camera->RenderEntity(entity);

pozitiffcat 03.12.2013 19:14

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от HolyDel (Сообщение 270950)
У меня в движке есть граф сцены, что совершенно не мешает рендерить в ручную объекты.
Код:

camera->RenderEntity(entity(;

у меня slim ;) ничего лишнего, хочу попробовть такую реализацию

pozitiffcat 03.12.2013 19:17

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от moka (Сообщение 270946)
Проблемы с альфа сортами, и рендером батчами под одним материалом для одного прохода и миниманизации переключений стейтов, подобное ляжет на плечи разраба.

Также менеджить свой стейт - это круто в плане контроля и возможностей, но очень не удобно и требует дополнительной разработки от самого разраба, что приведёт его к переписке того же стейт менеджера, но по своему.

Имхо, стейт менеджер должен быть конкретным и простым, реализующим всё что нужно и наипростейшими методами.
Удобство работы имхо на первом месте, тогда и не нужно будет думать о своём стейт менеджере.

батчи у меня автоматически юзаются, все, что одной текстурой - то рендерится одним батчем. Изображения создаются из текстурного атласа, там правда не супер удобный механизм

загрузка изображения1 в атлас - получение текстурной координаты
загрузка изображения2 в атлас - получение текстурной координаты
билд атласа (создает текстуру внутри себя)
создание изображение1, передав в атлас текстурные координаты1
создание изображение2, передав в атлас текстурные координаты2

pozitiffcat 03.12.2013 19:21

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от ABTOMAT (Сообщение 270947)
Ну и в чём будет принципиальное отличие?
В 2Д так делали потому что в каком порядке отрендеришь картинки, в таком они и будут друг на друге лежать.
В 3Д этим занимается Z-буфер, и хоть ты в каком порядке отрендеришь, всё будет так же, как и с Z-буфером.
Логично рендерить группами с одинаковыми текстурами/шейдерами, чтоб не гонять их каждый раз и этим стоит заниматься движку.
Альфе нужна сортировка, но с этим опять же лучше пусть двиг справляется.
В-общем я не вижу что такого может прогер сделать крутого, что не может сделать за него двиг и смысла забивать прогеру голову этим.
Разве что в FPS ствол поверх всего отрендерить, но ради 1 ствола огорода не городят.

я когда делал освещение, я просто охренел от количества шейдеров, которые расплодились, и что-то простотой перестало пахнуть, решил сделать движок, расчитаный на более продвинутого в плане графики программиста, и возложить цикл на его плечи, так контролировать всякую такую хрень проще. Темболее нарисовать в цикле много раз 1 меш в цикле (как 2д с картинками) проще ИМХО.
Опытом проверится... на самом деле хз.

HolyDel 03.12.2013 20:28

Ответ: Clear Engine (Понятный движок)
 
Цитата:

загрузка изображения1 в атлас - получение текстурной координаты
загрузка изображения2 в атлас - получение текстурной координаты
билд атласа (создает текстуру внутри себя)
создание изображение1, передав в атлас текстурные координаты1
создание изображение2, передав в атлас текстурные координаты2
тоже хотел такую штуку замутить но все руки не доходят

pozitiffcat 04.12.2013 17:02

Ответ: Clear Engine (Понятный движок)
 
добавил доки, правда их там мало не все успел написать
https://bitbucket.org/pozitiffcat/sl...oc/?at=default

реализовал кучу функционала, которым можно воспроизвести работу Clear Engine. И даже более, единственное ограничение, это формат вершины, 96 байт positions, normal, texcoord, texcoord2, joint, weight, binormal, tangent.

Mr_F_ 04.12.2013 17:07

Ответ: Clear Engine (Понятный движок)
 
Цитата:

96 байт
жирно. необходим выбор программистом любого своего варианта

pozitiffcat 04.12.2013 17:10

Ответ: Clear Engine (Понятный движок)
 
Цитата:

Сообщение от Mr_F_ (Сообщение 270996)
жирно. необходим выбор программистом любого своего варианта

да, но там как бы все самое необходимое, причем загрузчик моего формата использует все эти атрибуты
хотя как вариант хранить в поверхности еще и формат описывающий ее...
---
хоят не не вариант. Я не могу для всех шейдеров хранить attribute location в поверхности

Mr_F_ 04.12.2013 17:16

Ответ: Clear Engine (Понятный движок)
 
ни одной модели не нужны все эти данные, большинство моделей не имеют скининга, а те кто имеют - редко требуют вторые UV.
тангент и бинормал ужимаются в один vec4.

--
со страницы 19 можно почитать как жестоко ужимали вертексы в just cause 2:
http://www.humus.name/Articles/Perss...GameWorlds.pdf

вообще тут нет идеального варианта, в одном проекте могут юзаться разные структуры.


Часовой пояс GMT +4, время: 03:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot