From d0e18bdb7924c71cdca8dd983711171d87ef28be Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Mon, 17 Jan 2022 23:12:32 -0500 Subject: glplanet, an OpenGL-based planetary renderer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit glplanet draws Earth like it currently appears from space, putting nighttime areas in shadow and daytime areas in light. It’s modeled after Xplanet (http://xplanet.sourceforge.net/), but whereas Xplanet is entirely a CPU-resident program, glplanet draws using OpenGL. It’s thus much less resource-intensive, particularly when using high-resolution textures. --- src/fragment.glsl | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/fragment.glsl (limited to 'src/fragment.glsl') diff --git a/src/fragment.glsl b/src/fragment.glsl new file mode 100644 index 0000000..fcdc096 --- /dev/null +++ b/src/fragment.glsl @@ -0,0 +1,40 @@ +// Copyright 2021, 2022 Benjamin Barenblat +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +#version 150 + +// The color of sunlight (5800 K) in sRGB. +const vec4 kSunColor = vec4(1.0, 0.9411765, 0.9137255, 1.0); + +in vec3 model_cartesian_position; // unit vector pointing toward current point +in vec2 texture_coordinate; + +uniform sampler2D planet; +uniform sampler2D clouds; +uniform vec3 sun_direction; // unit vector pointing toward sun + +out vec4 out_color; + +void main() { + // Compute diffuse illumination from the Sun. We assume all rays are parallel, + // which isn't true, but at Earth scales, it causes a maximum error of about + // 0.003 degrees, well within our error budget. + float diffuse = max(dot(model_cartesian_position, sun_direction), 0.0); + + // The planet is a mixture of the ground texture and the cloud texture. Assume + // clouds reflect sunlight; the ground texture needs no color adjustment, + // since it's already colored as if being hit by sunlight. + out_color = diffuse * mix(texture(planet, texture_coordinate), kSunColor, + texture(clouds, texture_coordinate).r); +} -- cgit v1.2.3