Здравствуйте. Пытаюсь реализовать закраску полигонов с учетом нормалей.
Вот есть хорошая статья и внутри есть код шейдера.
Взял его к себе.
получилось такая штука:
Point3D VertexShader(Point3D vPosition, Point3D vNormal)
{
Point3D mvPosition;
//Transform the point
mvPosition = Mul(mv, vPosition); //mvPosition is used often
//gl_Position = p * mvPosition;
//Set up Normal, Light, Eye and Half vectors
Point3D N = Normilize(Mul(mv, vNormal));
Point3D L = Normilize(Sub(lightPosition, mvPosition));
if (lightPosition.q == 0.0)
L = Normilize(lightPosition);
Point3D E = MulF3d(Normilize(mvPosition), -1);
Point3D H = Normilize(Add(L, E));
//Calculate diffuse coefficient
float Kd = max(dotProduct(L, N), 0.0);
//Calculate Blinn-Phong specular coefficient
float Ks = pow(max(dotProduct(N, H), 0.0), shininess);
//Calculate lit colour for this pixel
Point3D color = Add(Add(Add(MulF3d(diffuseProduct, Kd), MulF3d(specularProduct, Ks)), ambientProduct), emission);
Point3D mcl = MulF3d(color, 255);
mcl.x = min(mcl.x, 255);
mcl.y = min(mcl.y, 255);
mcl.z = min(mcl.z, 255);
return mcl;
}
НАстройки света взял из то го же примера:
mv = { 1,1,1,1 }; // так и не понял что это за переменная поэтому выставил 1 везде
shininess = 125.0f;
ambientProduct = { 0.0f, 0.0f, 0.1f, 1.0f }; // синий должен быть
diffuseProduct = { 0.0f, 0.0f, 1.00f, 1.0f };
specularProduct = { 0.1f, 0.1f, 0.1f, 1.0f };
emission = { 1.0f, 1.0f, 1.0f, 1.0f };
lightPosition = { 20,20,20,1 }; // уже ставил по всякому в разные точки
я так понял что ему надо передать точку и нормаль в ней.
Point3D VertexShader(Point3D vPosition, Point3D vNormal)
Подаю точки куба без проекций. как есть. Но почему то цвет всегда рассчитывается на ярко белый. Почему так то??
В качестве нормали подаю нормаль плоскости.