Проблема с зеркальным освещением в OpenGL

У меня есть некоторые проблемы с моим зеркальным освещением, у меня рассеянное и рассеянное освещение, но сейчас я смотрю на зеркальное отражение, чтобы попытаться сделать красивую модель.

У меня есть следующее в моем vertexShader:

#version 330

layout (location = 0) in vec3 Position;
layout (location = 1) in vec3 Normal;

out vec4 Colour0;

// Transforms
uniform mat4 gModelToWorldTransform;
uniform mat4 gWorldToViewToProjectionTransform;

// Ambient light parameters
uniform vec3 gAmbientLightIntensity;

// Directional light parameters
uniform vec3 gDirectionalLightIntensity;
uniform vec3 gDirectionalLightDirection;

// Material constants
uniform float gKa;
uniform float gKd;
uniform float gKs;
uniform float gKsStrength;void main()
{
// Transform the vertex from local space to homogeneous clip space
vec4 vertexPositionInModelSpace = vec4(Position, 1);
vec4 vertexInWorldSpace = gModelToWorldTransform * vertexPositionInModelSpace;
vec4 vertexInHomogeneousClipSpace = gWorldToViewToProjectionTransform * vertexInWorldSpace;
gl_Position = vertexInHomogeneousClipSpace;

// Calculate the directional light intensity at the vertex
// Find the normal in world space and normalise it
vec3 normalInWorldSpace = (gModelToWorldTransform * vec4(Normal, 0.0)).xyz;
normalInWorldSpace = normalize(normalInWorldSpace);

// Calculate the ambient light intensity at the vertex
// Ia = Ka * ambientLightIntensity
vec4 ambientLightIntensity = gKa * vec4(gAmbientLightIntensity, 1.0);

// Setup the light direction and normalise it
vec3 lightDirection = normalize(-gDirectionalLightDirection);

//lightDirection = normalize(gDirectionalLightDirection);
// Id = kd * lightItensity * N.L
// Calculate N.L
float diffuseFactor = dot(normalInWorldSpace, lightDirection);
diffuseFactor = clamp(diffuseFactor, 0.0, 1.0);

// N.L * light source colour * intensity
vec4 diffuseLightIntensity = gKd * vec4(gDirectionalLightIntensity, 1.0f) * diffuseFactor;

vec3 lightReflect = normalize(reflect(gDirectionalLightDirection, Normal));

//Calculate the specular light intensity at the vertex
float specularFactor = dot(normalInWorldSpace, lightReflect);
specularFactor = pow(specularFactor, gKsStrength);
vec4 specularLightIntensity = gKs * vec4(gDirectionalLightIntensity, 1.0f) * specularFactor;

// Final vertex colour is the product of the vertex colour
// and the total light intensity at the vertex

vec4 colour = vec4(0.0, 1.0, 0.0, 1.0);
Colour0 = colour * (ambientLightIntensity + diffuseLightIntensity + specularLightIntensity);
}

Затем в моем main.cpp у меня есть некоторый код, чтобы попытаться заставить это работать вместе, зеркальный свет определенно делает что-то, только вместо того, чтобы заставить модель выглядеть блестящей, кажется, что она усиливает свет до такой степени, что я могу ‘ не вижу никаких деталей.

Я создаю следующие переменные:

// Lighting uniforms location

GLuint gAmbientLightIntensityLoc;
GLuint gDirectionalLightIntensityLoc;
GLuint gDirectionalLightDirectionLoc;
GLuint gSpecularLightIntensityLoc;

// Materials uniform location
GLuint gKaLoc;
GLuint gKdLoc;
GLuint gKsLoc;
GLuint gKsStrengthLoc;

Затем я устанавливаю свои переменные так в renderSceneCallBack() функция, которая вызывается в основном:

// Set the material properties
glUniform1f(gKaLoc, 0.2f);
glUniform1f(gKdLoc, 0.9f);
glUniform1f(gKsLoc, 0.5f);
glUniform1f(gKsStrengthLoc, 0.5f);

Затем я создаю initLights() Функция, которую я хотел бы обрабатывать все освещение, это также называется в основном:

static void initLights()
{
// Setup the ambient light
vec3 ambientLightIntensity = vec3(0.2f, 0.2f, 0.2f);
glUniform3fv(gAmbientLightIntensityLoc, 1, &ambientLightIntensity[0]);

// Setup the direactional light
vec3 directionalLightDirection = vec3(0.0f, 0.0f, -1.0f);
normalize(directionalLightDirection);
glUniform3fv(gDirectionalLightDirectionLoc, 1, &directionalLightDirection[0]);

vec3 directionalLightIntensity = vec3(0.8f, 0.8f, 0.8f);
glUniform3fv(gDirectionalLightIntensityLoc, 1, &directionalLightIntensity[0]);

//Setup the specular Light
vec3 specularLightIntensity = vec3(0.5f, 0.5f, 0.5f);
glUniform3fv(gSpecularLightIntensityLoc, 1, &specularLightIntensity[0]);
}

Может ли кто-нибудь увидеть, что я могу делать неправильно, у меня могут быть неправильные расчеты, и я просто не вижу этого. Оба окружающего / рассеянного освещения работают правильно. Эта фотография иллюстрирует то, что в настоящее время происходит, окружающее слева, рассеянное в середине и зеркальное с силой, установленной на 30 справа.

введите описание изображения здесь

Я забыл передать это значение в основной:

gKsStrengthLoc = glGetUniformLocation(shaderProgram, "gKsStrength");
//assert(gDirectionalLightDirectionLoc != 0xFFFFFFFF);

Теперь все работает, используя выбранный ответ

0

Решение

Ваша ценность для gKsStrength выглядит слишком маленьким:

glUniform1f(gKsStrengthLoc, 0.5f);

Это значение определяет, насколько блестящим является объект, а более высокие значения делают его более ярким. Это имеет смысл, если вы посмотрите на вычисление в шейдере:

specularFactor = pow(specularFactor, gKsStrength);

Чем больше показатель степени, тем быстрее уменьшается значение, а это значит, что зеркальная подсветка становится более узкой.

Типичные значения могут быть примерно 10,0f для умеренно блестящих, 30,0f для довольно блестящих и даже выше для очень блестящих материалов.

При значении 0,5f вы получаете очень широкое зеркальное отражение. Ваше значение зеркальной интенсивности также достаточно высокое (0,5), поэтому выделение будет охватывать большую часть объекта и насыщать цвета для крупных деталей.

3

Другие решения


По вопросам рекламы [email protected]