Changed night texture to procedual night sky generation.
This commit is contained in:
parent
7e6b5df51c
commit
4d100fd290
@ -7,22 +7,44 @@ in vec4 sunPosition;
|
|||||||
out vec4 oColor;
|
out vec4 oColor;
|
||||||
|
|
||||||
uniform sampler2D uTexture;
|
uniform sampler2D uTexture;
|
||||||
uniform sampler2D nightTexture;
|
|
||||||
uniform float farPlane;
|
uniform float farPlane;
|
||||||
uniform vec4 fogColor;
|
uniform vec4 fogColor;
|
||||||
uniform vec3 cameraCenter;
|
uniform vec3 cameraCenter;
|
||||||
uniform vec3 sunColor;
|
uniform vec3 sunColor;
|
||||||
uniform vec3 directionalVector;
|
uniform vec3 directionalVector;
|
||||||
|
uniform float skydomeSize;
|
||||||
|
|
||||||
const float sunSize = 20.0;
|
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() {
|
void main() {
|
||||||
vec4 textureColor = vec4(0.0, 0.0, 0.0, 1.0);
|
vec4 textureColor = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
float sunAngle = -dot(normalize(directionalVector), vec3(0.0, 1.0, 0.0));
|
float sunAngle = -dot(normalize(directionalVector), vec3(0.0, 1.0, 0.0));
|
||||||
vec4 dayColor = texture(uTexture, vTexCoord);
|
vec4 dayColor = texture(uTexture, vTexCoord);
|
||||||
if (sunAngle >= 0.0) {
|
if (sunAngle >= 0.0) {
|
||||||
textureColor = mix(dayColor, texture(nightTexture, vTexCoord), sunAngle);
|
vec4 nightColor = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
textureColor = mix(vec4(0.0, 0.0, 0.0, 1.0), textureColor, 1.0 - sunAngle);
|
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 {
|
else {
|
||||||
textureColor = dayColor;
|
textureColor = dayColor;
|
||||||
|
13
graphics.cc
13
graphics.cc
@ -102,8 +102,8 @@ void Graphics::init(Level* level) {
|
|||||||
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &number_of_texture_units);
|
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &number_of_texture_units);
|
||||||
printf("Your graphics card supports %d texture units.\n", number_of_texture_units);
|
printf("Your graphics card supports %d texture units.\n", number_of_texture_units);
|
||||||
// Exit if we need more texture units
|
// Exit if we need more texture units
|
||||||
if (number_of_texture_units < 19) {
|
if (number_of_texture_units < 18) {
|
||||||
printf("You need at least 19 texture units to run this application. Exiting\n");
|
printf("You need at least 18 texture units to run this application. Exiting\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,9 +173,6 @@ void Graphics::init(Level* level) {
|
|||||||
flamePostShader->setUniform("windowSizeX", int(windowSize.x));
|
flamePostShader->setUniform("windowSizeX", int(windowSize.x));
|
||||||
flamePostShader->setUniform("windowSizeY", int(windowSize.y));
|
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 = SharedTexture2D(new Texture2D(windowSize, GL_RGBA8));
|
||||||
flame_fbo_color_texture->setMinFilter(GL_NEAREST);
|
flame_fbo_color_texture->setMinFilter(GL_NEAREST);
|
||||||
flame_fbo_color_texture->setMagFilter(GL_NEAREST);
|
flame_fbo_color_texture->setMagFilter(GL_NEAREST);
|
||||||
@ -188,11 +185,11 @@ void Graphics::init(Level* level) {
|
|||||||
framebuffer_flame->validate();
|
framebuffer_flame->validate();
|
||||||
|
|
||||||
mergeShader->use();
|
mergeShader->use();
|
||||||
mergeShader->setTexture("flame_fbo", flame_fbo_color_texture, 16);
|
mergeShader->setTexture("flame_fbo", flame_fbo_color_texture, 15);
|
||||||
mergeShader->setTexture("light_fbo", light_fbo_color_texture, 17);
|
mergeShader->setTexture("light_fbo", light_fbo_color_texture, 16);
|
||||||
|
|
||||||
flameColorShader->use();
|
flameColorShader->use();
|
||||||
flameColorShader->setTexture("flame_fbo", flame_fbo_color_texture, 18);
|
flameColorShader->setTexture("flame_fbo", flame_fbo_color_texture, 17);
|
||||||
|
|
||||||
updateClosestLights();
|
updateClosestLights();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user