Я работаю над программой отсроченного затенения, и теперь мне нужно настроить 50 различных огней в сцене. Чтобы сделать это, я генерироваться случайным образом его атрибуты (положение, диффузный цвет, отраженный цвет) с этим фрагментом кода:Отложенное затенение - Несколько огней (OpenGL/GLSL)
void FBORender::BuildLights()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0.0, 0.1);
for (int i = 0; i < NUM_LIGHTS; i++)
{
float dc_r = (float) dis(gen);
float dc_g = (float) dis(gen);
float dc_b = (float) dis(gen);
printf("%f\n", dc_r);
float lp_x = (float)(rand() % 40 - 20);
float lp_y = (float)(rand() % 100 + 10);
float lp_z = (float)(rand() % 40 - 20);
DC[i * NUM_LIGHTS] = dc_r;
DC[i * NUM_LIGHTS + 1] = dc_g;
DC[i * NUM_LIGHTS + 2] = dc_b;
LP[i * NUM_LIGHTS] = lp_x;
LP[i * NUM_LIGHTS + 1] = lp_y;
LP[i * NUM_LIGHTS + 2] = lp_z;
}
}
Однако, я не уверен, как выполнять освещение с несколькими огнями. Я сказал, что окружающий свет должен быть равным рассеянному свету, а зеркальный свет должен быть белым.
Адаптирование шейдер, что я должен был выполнить Фонг Ilumination, у меня есть:
#version 410 core
#define numLights 5
uniform sampler2D tDiffuse;
uniform sampler2D tPosition;
uniform sampler2D tNormals;
uniform vec4 specularColor;
uniform vec3 diffuseColor[numLights];
uniform vec3 vLightPosition[numLights];
in vec2 texCoord;
out vec4 fragColor;
void main(void)
{
vec3 tex = texture(tDiffuse, texCoord.st).xyz;
vec3 vPosition = texture(tPosition, texCoord.st).xyz;
vec3 vNormal = normalize(texture(tNormals, texCoord.st).xyz * 2 - 1);
vec3 vVaryingNormal = vNormal;
for (int i = 0; i < numLights; i++)
{
vec3 vVaryingLightDir = normalize(vLightPosition[i] - vPosition);
float diff = max(0.0, dot(normalize(vVaryingNormal), normalize(vVaryingLightDir)));
vec4 partialColor = diff * vec4(diffuseColor[i], 1.0);
partialColor = vec4(mix(partialColor.rgb, tex, 0.5), partialColor.a);
partialColor += vec4(diffuseColor[i], 1.0);
vec3 vReflection = normalize(reflect(-normalize(vVaryingLightDir), normalize(vVaryingNormal)));
float spec = max(0.0, dot(normalize(vVaryingNormal), vReflection));
if(diff != 0)
{
float fSpec = pow(spec, 128.0);
partialColor.rgb += vec3(fSpec, fSpec, fSpec);
}
fragColor += partialColor;
}
}
Однако я получаю уродливые результаты (если не ошибаюсь тоже), так как следующие изображения показывают:
И эти результаты используют всего 2 огня. Поскольку я должен использовать 50, я думаю, что все, что я увижу, это белый экран ...
Извините, если это глупый вопрос, но не видя других частей вашего кода, это выглядит странно: 'for (int i = 0; i
MaKo
Вы совершенно правы, @MaKo. Я был совершенно глуп. Спасибо за наблюдение. – pceccon