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)

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). Или пишут один убер шейдер, но как тогда с производительностью. Да и слишком много команд в шейдер тоже не засунешь...


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

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