Changed night texture to procedual night sky generation.

This commit is contained in:
Faerbit 2015-03-07 14:39:01 +01:00
parent 1ab8bb9a92
commit 86619fd2dd
2 changed files with 30 additions and 11 deletions

View File

@ -7,22 +7,44 @@ in vec4 sunPosition;
out vec4 oColor;
uniform sampler2D uTexture;
uniform sampler2D nightTexture;
uniform float farPlane;
uniform vec4 fogColor;
uniform vec3 cameraCenter;
uniform vec3 sunColor;
uniform vec3 directionalVector;
uniform float skydomeSize;
const float sunSize = 20.0;
const float starSize = 1.0;
const vec4 starColor = vec4(1.0, 1.0, 0.9, 1.0);
const int starCount = 2;
vec3 starPositions[starCount] = vec3[](
vec3(-0.3102524288591748, 0.9505037096381865, -0.016915328877346533),
vec3(-0.14085574439428544, 0.9519584459035886, -0.27190950065041153)
);
float starSizes[starCount] = float[] (
float(0.5),
float(1.2)
);
void main() {
vec4 textureColor = vec4(0.0, 0.0, 0.0, 1.0);
float sunAngle = -dot(normalize(directionalVector), vec3(0.0, 1.0, 0.0));
vec4 dayColor = texture(uTexture, vTexCoord);
if (sunAngle >= 0.0) {
textureColor = mix(dayColor, texture(nightTexture, vTexCoord), sunAngle);
textureColor = mix(vec4(0.0, 0.0, 0.0, 1.0), textureColor, 1.0 - sunAngle);
vec4 nightColor = vec4(0.0, 0.0, 0.0, 1.0);
for(int i = 0; i<starCount; i++) {
vec3 starPosition = (starPositions[i] * skydomeSize) + vec3(cameraCenter.x, 0.0, cameraCenter.z);
float distanceToStar = distance(starPosition, vec3(fragPosition));
float thisStarSize = starSize * starSizes[i];
if (distanceToStar < thisStarSize) {
float starIntensity = clamp(0.3*exp(1/(distanceToStar/thisStarSize))-exp(1.0)*0.3, 0.0, 1.0);
nightColor = mix(nightColor, starColor, starIntensity);
}
}
textureColor = mix(dayColor, nightColor, sunAngle);
}
else {
textureColor = dayColor;

View File

@ -102,8 +102,8 @@ void Graphics::init(Level* level) {
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &number_of_texture_units);
printf("Your graphics card supports %d texture units.\n", number_of_texture_units);
// Exit if we need more texture units
if (number_of_texture_units < 19) {
printf("You need at least 19 texture units to run this application. Exiting\n");
if (number_of_texture_units < 18) {
printf("You need at least 18 texture units to run this application. Exiting\n");
exit(-1);
}
@ -173,9 +173,6 @@ void Graphics::init(Level* level) {
flamePostShader->setUniform("windowSizeX", int(windowSize.x));
flamePostShader->setUniform("windowSizeY", int(windowSize.y));
skydomeShader->use();
skydomeShader->setTexture("nightTexture", level->getSkydome()->getNightTexture()->getReference(), 15);
flame_fbo_color_texture = SharedTexture2D(new Texture2D(windowSize, GL_RGBA8));
flame_fbo_color_texture->setMinFilter(GL_NEAREST);
flame_fbo_color_texture->setMagFilter(GL_NEAREST);
@ -188,11 +185,11 @@ void Graphics::init(Level* level) {
framebuffer_flame->validate();
mergeShader->use();
mergeShader->setTexture("flame_fbo", flame_fbo_color_texture, 16);
mergeShader->setTexture("light_fbo", light_fbo_color_texture, 17);
mergeShader->setTexture("flame_fbo", flame_fbo_color_texture, 15);
mergeShader->setTexture("light_fbo", light_fbo_color_texture, 16);
flameColorShader->use();
flameColorShader->setTexture("flame_fbo", flame_fbo_color_texture, 18);
flameColorShader->setTexture("flame_fbo", flame_fbo_color_texture, 17);
updateClosestLights();
}