Ребят посмотрите мой шейдер
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"
"}";
вроде все правильно