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

Ребят посмотрите мой шейдер

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"
        "}"

вроде все правильно
(Offline)
 
Ответить с цитированием