Я пытаюсь реализовать атмосферное рассеяние в OpenGL. Я использую эту «бумагу» в качестве учебника:
https://drivers.amd.com/developer/gdc/g ... eetham.pdf
Однако у меня есть некоторые трудности, чтобы понять определенные точки и выяснить некоторые константы.
В основном я должен реализовать эти формулы:
< /p>
Во -первых, я не знаю, является ли s расстоянием от глаза до купола или расстояния от глаза до источника света (здесь Солнце) положение.
то же самое для угловой тета Я не могу понять, является ли это угол от земли до солнца или до положения купола, на который смотрит. < /p>
Во -вторых В этом слайде:
это говорит мне синий цвет неба Уилл появляется. Я знаю, что это причина рассеяния Рэлея, но я не могу понять. Все расчеты в приведенных выше формулах дают мне скаляр: так, как белый свет солнца, который в основном представляет собой VEC3 (1,1,1), станет синим, когда я умножаюсь на скаляр, он будет только в серой шкале. Потому что у меня будет результат, например, VEC3 (0,8,0,8,0,8). Я имею в виду, если появляется какой -то другой цвет неба, я должен размножить солнечный свет на VEC3, чтобы по -разному изменить значение RGB. > Вот код для Sky Shader: < /p>
#version 330
in vec3 vpoint;
in vec2 vtexcoord;
out vec2 uv;
out vec3 atmos;
uniform mat4 M;
uniform mat4 V;
uniform mat4 P;
mat4 MVP = P*V*M;
//uniform vec3 lpos;
vec3 lpos = vec3(100,0,0);
uniform vec3 cpos;
vec3 br = vec3(5.5e-6, 13.0e-6, 22.4e-6);
vec3 bm = vec3(21e-6);
float g = -0.75f;
vec3 Esun = vec3(2000,2000,2000);
vec3 Br(float theta){
return 3/(16*3.14) * br * (1+cos(theta)*cos(theta));
}
vec3 Bm(float theta){
return 1/(4*3.14) * bm * ((1 - g)*(1 - g))/(pow(1+g*g-
2*g*cos(theta),3/2));
}
vec3 atmospheric(float theta, float s){
return (Br(theta)*Bm(theta))/(br+bm) * Esun * (1- exp( -(br+bm)*s ));
}
void main() {
gl_Position = MVP * vec4(vpoint, 1.0);
uv = vtexcoord;
vec3 domePos = vec3(M*vec4(vpoint,1.0));
vec3 ldir = lpos - domePos;
float s = length(domePos-cpos);
float theta = acos(dot(normalize(ldir-domePos),normalize(domePos-
cpos)*vec3(1,1,0)));
atmos = atmospheric(theta,s)*1000000*5;
}
< /code>
Я не понимаю, что мне ожидается, вот что я получаю: < /p>
У меня только синий, и нет удивленного заката, но солнце низкое и в соответствии с различными Учебные пособия, которые я видел, я должен увидеть, когда появляется какое -то удивление цвета, когда солнце становится низко.
Подробнее здесь: https://stackoverflow.com/questions/370 ... ementation
Атмосферное рассеянное реализация ⇐ C++
Программы на C++. Форум разработчиков
1738678537
Anonymous
Я пытаюсь реализовать атмосферное рассеяние в OpenGL. Я использую эту «бумагу» в качестве учебника:
https://drivers.amd.com/developer/gdc/gdc02_hoffmanpreetham.pdf
Однако у меня есть некоторые трудности, чтобы понять определенные точки и выяснить некоторые константы.
В основном я должен реализовать эти формулы:
< /p>
Во -первых, я не знаю, является ли s расстоянием от глаза до купола или расстояния от глаза до источника света (здесь Солнце) положение.
то же самое для угловой тета Я не могу понять, является ли это угол от земли до солнца или до положения купола, на который смотрит. < /p>
Во -вторых В этом слайде:
это говорит мне синий цвет неба Уилл появляется. Я знаю, что это причина рассеяния Рэлея, но я не могу понять. Все расчеты в приведенных выше формулах дают мне скаляр: так, как белый свет солнца, который в основном представляет собой VEC3 (1,1,1), станет синим, когда я умножаюсь на скаляр, он будет только в серой шкале. Потому что у меня будет результат, например, VEC3 (0,8,0,8,0,8). Я имею в виду, если появляется какой -то другой цвет неба, я должен размножить солнечный свет на VEC3, чтобы по -разному изменить значение RGB. > Вот код для Sky Shader: < /p>
#version 330
in vec3 vpoint;
in vec2 vtexcoord;
out vec2 uv;
out vec3 atmos;
uniform mat4 M;
uniform mat4 V;
uniform mat4 P;
mat4 MVP = P*V*M;
//uniform vec3 lpos;
vec3 lpos = vec3(100,0,0);
uniform vec3 cpos;
vec3 br = vec3(5.5e-6, 13.0e-6, 22.4e-6);
vec3 bm = vec3(21e-6);
float g = -0.75f;
vec3 Esun = vec3(2000,2000,2000);
vec3 Br(float theta){
return 3/(16*3.14) * br * (1+cos(theta)*cos(theta));
}
vec3 Bm(float theta){
return 1/(4*3.14) * bm * ((1 - g)*(1 - g))/(pow(1+g*g-
2*g*cos(theta),3/2));
}
vec3 atmospheric(float theta, float s){
return (Br(theta)*Bm(theta))/(br+bm) * Esun * (1- exp( -(br+bm)*s ));
}
void main() {
gl_Position = MVP * vec4(vpoint, 1.0);
uv = vtexcoord;
vec3 domePos = vec3(M*vec4(vpoint,1.0));
vec3 ldir = lpos - domePos;
float s = length(domePos-cpos);
float theta = acos(dot(normalize(ldir-domePos),normalize(domePos-
cpos)*vec3(1,1,0)));
atmos = atmospheric(theta,s)*1000000*5;
}
< /code>
Я не понимаю, что мне ожидается, вот что я получаю: < /p>
У меня только синий, и нет удивленного заката, но солнце низкое и в соответствии с различными Учебные пособия, которые я видел, я должен увидеть, когда появляется какое -то удивление цвета, когда солнце становится низко.
Подробнее здесь: [url]https://stackoverflow.com/questions/37099587/atmospheric-light-scattering-implementation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия