From a87e8b43bf67354a66de9c666a864b64c4b54e34 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Wed, 23 Nov 2022 14:16:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BB=D0=BE=D1=81=D0=BA=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=82=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/shader.frag | 20 +++++++++++++++++++- shaders/shader.vert | 12 +++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/shaders/shader.frag b/shaders/shader.frag index a54dbb4..54f15ae 100644 --- a/shaders/shader.frag +++ b/shaders/shader.frag @@ -2,6 +2,10 @@ in vec2 texCoord; +in vec3 Cam_vertex; // Позиция камеры относительно вершины +in vec3 L_vertex; // Позиция источника света относительно вершины +in vec3 Vertex_view; // Вершина в пространстве камеры + layout(std140, binding = 1) uniform Material { vec3 ka; @@ -24,6 +28,20 @@ out vec4 color; void main() { - color = texture(tex_diffuse, texCoord); + // Нормаль + vec3 N = normalize(cross(dFdx(Vertex_view), dFdy(Vertex_view))); + + // Диффузная составляющая + float diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0 + + // Отраженный вектор + vec3 R = normalize(reflect(-L_vertex, N)); + // Зеркальная составляющая + float specular = 0; + // Если есть диффузная составляющая, то считаем зеркальную + if (diffuse > 0) + specular = pow(max(dot(Cam_vertex, R), 0.0), p); // скалярное произведение с отсеканием значений < 0 в степени p + + color = vec4(ka, 1)*texture(tex_ambient, texCoord) + vec4(light_f.color*kd*diffuse, 1)*texture(tex_diffuse, texCoord) + vec4(light_f.color*ks*specular, 1)*texture(tex_specular, texCoord); } \ No newline at end of file diff --git a/shaders/shader.vert b/shaders/shader.vert index aca81ff..cc1e933 100644 --- a/shaders/shader.vert +++ b/shaders/shader.vert @@ -21,8 +21,18 @@ uniform mat4 model; out vec2 texCoord; +out vec3 Cam_vertex; // Позиция камеры относительно вершины +out vec3 L_vertex; // Позиция источника света относительно вершины +out vec3 Vertex_view; // Вершина в пространстве камеры + void main() { - gl_Position = camera.projection * camera.view * model * vec4(pos, 1.0); + vec4 P = model * vec4(pos, 1.0); // трансформация вершины + + Cam_vertex = normalize(camera.position - P.xyz); + L_vertex = normalize(light_v.position - P.xyz); + Vertex_view = P.xyz; + + gl_Position = camera.projection * camera.view * P; texCoord = inTexCoord; }