Проблема с передачей массива значений для источников света в SFML ⇐ C++
Проблема с передачей массива значений для источников света в SFML
Я пытаюсь создать систему Lightning на C++, используя SFML и GLSL.
У меня есть серия фонарей. У каждого источника света есть положение и значение радиуса.
Код шейдера следующий
однородная текстура sampler2D; униформа int LightAmt; равномерный поплавок RadiVal[15]; униформа vec2 Position[15]; равномерное затухание поплавка; равномерные шаги с плавающей запятойToFragment; float CircleSDF (точка vec2, плавающий радиус, центр vec2) { // Вычисляем расстояние от точки до центра круга плавающее расстояние = длина (точка - центр); // Расстояние со знаком — это абсолютная разница между расстоянием и радиусом расстояние возврата – радиус; } float DotProduct(vec2 A, vec2 B) { float diffX = зажим(A.x - B.x, 0, Затухание); float diffY = зажим(A.y - B.y, 0, Затухание); return sqrt(diffX * diffX + diffY * diffY); } vec4 AdditiveBlend(vec4 A, vec4 B, float blendFactor) { float ABlend = 1.0f - blendFactor; поплавок BBlend = blendFactor; vec4 totalBlend = (A * ABlend) + ( B * BBlend); TotalBlend.a = А.а; вернуть тотальную смесь; } пустая функция() { vec2 fragCoord = gl_TexCoord[0].xy; vec2 uv = fragCoord.xy; плавающий барКол = 0,0; float isEven = mod(round((uv.y) * 80.0), 2.0); bool Alt = isEven == 0.0; цвет vec4 =texture2D(текстура, gl_TexCoord[0].xy); Боул isLit = ложь; для (int я = 0; я = 0,0) { // Эта часть представляет неосвещенную область } еще { //// Эта часть представляет освещенную область isLit = правда; перерыв; } } если (isLit) { цвет = AdditiveBlend(color,vec4(0.0,0.0,0.0,1.0) , 0.5); } еще { цвет = AdditiveBlend(цвет, vec4(0.0,0.0,0.0,1.0), 0.9); } gl_FragColor = цвет; Общая идея заключается в том, что если пиксель находится внутри любого радиуса источника света, он горит. в противном случае он не горит.
В настоящее время визуализируется только последний источник света, добавленный в мой вектор источников света.
for(int i = 0; i < context->Lights.size(); i++) { sf::Glsl::Vec2 Camera(MainGame::gGCon->Camera.x, MainGame::gGCon->Camera.y); sf::Glsl::Vec2 Window(context->GetWindow()->getSize().x, context->GetWindow()->getSize().y); Время += 0,001; sf::Glsl::Vec2 Pos(context->Lights.X, context->Lights.Y); Поз.х —= Камера.х/2; Поз.у += Камера.у/2; Поз.х /= Окно.х; Поз.у /= Окно.у; если (Время
Я пытаюсь создать систему Lightning на C++, используя SFML и GLSL.
У меня есть серия фонарей. У каждого источника света есть положение и значение радиуса.
Код шейдера следующий
однородная текстура sampler2D; униформа int LightAmt; равномерный поплавок RadiVal[15]; униформа vec2 Position[15]; равномерное затухание поплавка; равномерные шаги с плавающей запятойToFragment; float CircleSDF (точка vec2, плавающий радиус, центр vec2) { // Вычисляем расстояние от точки до центра круга плавающее расстояние = длина (точка - центр); // Расстояние со знаком — это абсолютная разница между расстоянием и радиусом расстояние возврата – радиус; } float DotProduct(vec2 A, vec2 B) { float diffX = зажим(A.x - B.x, 0, Затухание); float diffY = зажим(A.y - B.y, 0, Затухание); return sqrt(diffX * diffX + diffY * diffY); } vec4 AdditiveBlend(vec4 A, vec4 B, float blendFactor) { float ABlend = 1.0f - blendFactor; поплавок BBlend = blendFactor; vec4 totalBlend = (A * ABlend) + ( B * BBlend); TotalBlend.a = А.а; вернуть тотальную смесь; } пустая функция() { vec2 fragCoord = gl_TexCoord[0].xy; vec2 uv = fragCoord.xy; плавающий барКол = 0,0; float isEven = mod(round((uv.y) * 80.0), 2.0); bool Alt = isEven == 0.0; цвет vec4 =texture2D(текстура, gl_TexCoord[0].xy); Боул isLit = ложь; для (int я = 0; я = 0,0) { // Эта часть представляет неосвещенную область } еще { //// Эта часть представляет освещенную область isLit = правда; перерыв; } } если (isLit) { цвет = AdditiveBlend(color,vec4(0.0,0.0,0.0,1.0) , 0.5); } еще { цвет = AdditiveBlend(цвет, vec4(0.0,0.0,0.0,1.0), 0.9); } gl_FragColor = цвет; Общая идея заключается в том, что если пиксель находится внутри любого радиуса источника света, он горит. в противном случае он не горит.
В настоящее время визуализируется только последний источник света, добавленный в мой вектор источников света.
for(int i = 0; i < context->Lights.size(); i++) { sf::Glsl::Vec2 Camera(MainGame::gGCon->Camera.x, MainGame::gGCon->Camera.y); sf::Glsl::Vec2 Window(context->GetWindow()->getSize().x, context->GetWindow()->getSize().y); Время += 0,001; sf::Glsl::Vec2 Pos(context->Lights.X, context->Lights.Y); Поз.х —= Камера.х/2; Поз.у += Камера.у/2; Поз.х /= Окно.х; Поз.у /= Окно.у; если (Время
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Подходит ли фильтр Габора для разделения текстур огня и других источников света?
Anonymous » » в форуме Python - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Подходит ли фильтр Габора для разделения текстур огня и других источников света? [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Разница между передачей параметров строки и массива в рекурсивную функцию
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Разница между передачей параметров строки и массива в рекурсивную функцию
Anonymous » » в форуме Python - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-