Борьба с отбрасыванием тени облака на земную сферу в OpenGL

Я пытаюсь провести симуляцию земли в OpenGL с помощью шейдеров GLSL, и пока все идет хорошо. Хотя я застрял с небольшой проблемой. Прямо сейчас у меня есть 3 сферы, одна для уровня земли (земля), одна для облаков и третья для атмосферы (эффекты рассеяния). Земная сфера справляется с большинством текстур.

Сфера облаков — это сфера немного больше, чем сфера Земли, и она сопоставлена ​​с текстурой облака и сопоставлена ​​с нормалью с помощью плагина, созданного с помощью плагина photoshop. Еще одна вещь, на которую следует обратить внимание: скорость вращения облачной сферы немного больше скорости вращения земной сферы.

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

Вот мой фрагментный шейдер для Земли, где я вычисляю тень облака:

#version 400 core

uniform sampler2D day;
uniform sampler2D bumpMap;
uniform sampler2D night;
uniform sampler2D specMap;
uniform sampler2D clouds;

uniform mat4 cloudRotation;in vec3 vPos;

in vec3 lightVec;
in vec3 eyeVec;
in vec3 halfVec;

in vec2 texCoord;

out vec4 frag_color;

void main()
{

vec3 normal = 2.0 * texture(bumpMap, texCoord).rgb - 1.0;
//normal.z = 1 - normal.x * normal.x - normal.y * normal.y;
normal = normalize ( normal );

vec4 spec = vec4(1.0, 0.941, 0.898, 1.0);
vec4 specMapColor = texture2D(specMap, texCoord);

vec3 L = lightVec;
vec3 N = normal;
vec3 Emissive = normalize(-vPos);
vec3 R = reflect(-L, N);
float dotProd = max(dot(R, Emissive), 0.0);
vec4 specColor = spec * pow(dotProd,6.0) * 0.5;
float diffuse = max(dot(N, L), 0.0);

vec2  cloudTexCoord         =   vec2(cloudRotation * vec4(texCoord, 0.0, 1.0));

vec3 cloud_color            =   texture2D( clouds, cloudTexCoord).rgb;
vec3 day_color              =   texture2D( day, texCoord ).rgb * diffuse + specColor.rgb * specMapColor.g - cloud_color * 0.25;// * (1 - cloud_color.r) + cloud_color.r * diffuse;
vec3 night_color            =   texture2D( night, texCoord ).rgb * 0.5;// * (1 - cloud_color.r) * 0.5;

vec3 color = day_color;
if(dot(N, L) < 0.1)
color = mix(night_color, day_color, (diffuse + 0.1) * 5.0);
frag_color = vec4(color, 1.0);
}

Вот образец вывода в результате вышеприведенного шейдера. Обратите внимание, что тени начинаются в правильном положении, но из-за неправильной скорости вращения они имеют тенденцию двигаться впереди вращения облачной сферы.

Опять же, было бы очень полезно, если бы кто-нибудь мог помочь мне выяснить математику, чтобы синхронизировать тень и облака

заранее спасибо

3

Решение

Задача ещё не решена.

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


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