Показать сообщение отдельно
Старый 27.11.2013, 17:36   #81
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Clear Engine (Понятный движок)

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

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

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


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"


Последний раз редактировалось pozitiffcat, 27.11.2013 в 19:38.
(Offline)
 
Ответить с цитированием