Сообщение от 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";