ronniko
> Спекуляр свет
свет так не работает. с учетом что поверхность ровная, а нормаль одна на всю плоскость
То как работает свет это одно.
А вот то, как косячат в коде и в шейдерах это ещё та история.
По твоему скрину видно , что это свет.
Почему он появляется таким на кубе, тебе и предстоит выяснить и найти причину.
war_zes
У меня такое бывало, когда не отсекался расчёт спека при угле между нормалью и светом больше 90 градусов.
вот нашел как раз такой же эффект
https://github.com/bcrusco/Forward-Plus-Renderer
там прям видна это конусовидная капля белого света (особенно в видео).
он даже по форме похож на тоже что на моем скрине страницей раньше
и не естественна не только ее форма, но и ощущение как будто оно в землю уходит
я и писал что во многих подобных демках со светом вижу такой же эффект. И стало интересно - из-за чего он возникает и как его убирают - в реальных играх и движках так свет нигде не рисуется - то есть это фиксится
war_zes
Зачем тебе освещение, когда у тебя нечего освещать?
Разбираю программирование с шейдерами HLSL Directx 9 + Delphi 7. Возникло затруднение при использовании текстуры в пиксельном шейдере (считать значение чтобы модулировать цвет, комбинировать и т.д.). Пример работает (картинка с вращающимся кубиком есть), но напрочь отказывается менять результат на выходе пиксельного шейдера. Т.е. менять яркость, текстурные координаты в шейдере не получается.
Подскажите, пожалуйста.
Действия с пиксельным шейдером в программе:
Шейдеры:
Фрагментный:
Пиксельный:
Весь текст программы: Пример использования шейдеров в DirectX 9
true_bump
true_bump
Так какой FVF с шейдерами? Там Vertex Declaration
Хз как это вообще работает без VertexDecl, Pure скорее всего выдал бы ошибку и ничего не нарисовал
master-sheff, спасибо за справку! Попробую внести исправления.
monobogdan
>VertexDecl
Да, там должно быть что-то такое (смутные воспоминания, изучал шейдеры в 2014 году, но с тех пор ничего не сохранилось)
Есть статьи по менеджменту памяти для кадра (фрейма, тика) рендера? Менеджмент памяти текстур, нюансы управления памятью объектов графики. Интересуют именно статьи. Накидайте плиз, ежели таковы знаете.
master-sheff, подсказки нейросети оказались полезными! В принципе, всё работает, удалось в шейдере считать условный тексель и менять его спектр
monobogdan
>VertexDecl
Работает и без Vertex Declaration. Но, да, он должен быть. Добавил его в пример (используя переведённые на Паскаль примеры из DirectX SDK и случайно найденную в интернете книгу Фрэнка Д. Луны), но, картинка в результате сломалась. Либо не рисует ничего, либо рисует как бы без учёта действий во фрагментном шейдере (кубик в одной проекции без учёта вращения).
Const
decl: array[0..1] of TD3DVertexElement9 =
(
(Stream:0; Offset:0; _Type:D3DDECLTYPE_FLOAT3; Method:D3DDECLMETHOD_DEFAULT; Usage:D3DDECLUSAGE_POSITION; UsageIndex:0),
(Stream:0; Offset:12; _Type:D3DDECLTYPE_FLOAT2; Method:D3DDECLMETHOD_DEFAULT; Usage:D3DDECLUSAGE_TEXCOORD; UsageIndex:0)
);
D3DFVF_VERTEX_NORMAL_TEX3 = D3DFVF_XYZ or D3DFVF_TEX1;
Var
g_pVertexDeclaration: IDirect3DVertexDeclaration9;
//...
Result:= FD3DDevice.CreateVertexDeclaration(@decl, g_pVertexDeclaration);
if Failed(Result) then Exit;
//...
SetVertexDeclaration(g_pVertexDeclaration);какое из двух скринов визуально правильное?
это я разбираюсь с темой srgb
в первом варианте у меня включен glEnable(GL_FRAMEBUFFER_SRGB);
текстура фреймбуфера создана с типом R8G8B8A8_SRGB
текстура diffuse у моделек создана также с R8G8B8A8_SRGB
во втором варианте тоже самое, но текстура diffuse у моделек создана как R8G8B8A8_UNORM
текстура просто накладывается vec4 albedo = texture(diffuseTexture, fragTexCoord);
мне второй вариант нравится больше. в первом на всех моих мониторах темный мрак
но иишка говорит что именно первый вариант правильный, и что так и должно быть - сцена должна быть темно (я у ней специально это уточнял - и говорит что осветление сцены - это как раз некоректно)
Темнеющая сцена — это не ошибка, это исправление ошибки.
Ты перешёл от неправильного (слишком яркого) рендеринга к физически корректному.
так всеже как лучше делать? Может потом, когда буду накручивать освещение - оно там все станет лучше выглядеть?
И вообще есть какой-то визуальный тест который такие вещи проверяет? ну свидетели юнит-тестов должны же как-то тестировать что все правильно включено в sRGB
какая же это невнятная тема. почему если я рисую цветом 127;127;127 то на экране должно рисоваться цветом 188;188;188 и это правильно? это же вообще другой цвет по сути. иишка тоже не объясняет
vec3(0.5) — это число в линейном цветовом пространстве
#808080 — это sRGB-кодировка того же визуального серого
👉 Они не равны по физической яркости.
что значит они не равны? это тупо один и тот же цвет. как он может быть не тем же самым.
Цель GL_FRAMEBUFFER_SRGB — скомпенсировать нелинейность монитора, чтобы 0.5 в линейном пространстве выглядело как 50% яркости.
так я не вижу 50% яркости. Я вижу 30% яркости серого от силы... может это на дешманских мониторах так, а на топовых там все тип топ? ну не понимаю как 20-30% яркости глаз должен воспринимать как 50%.
я уже упирался в эту тему, но тогда иишек не было, сейчас буду дальше мучать
war_zes
> какая же это невнятная тема. почему если я рисую цветом 127;127;127 то на экране должно рисоваться цветом 188;188;188 и это правильно?
Экономия данных, вполне объяснимо.
256 градаций яркости - это не так уж много, глаз замечает разницу между соседями, особенно внизу диапазона. Почему? Да потому, что, если взять линейную шкалу, то будет 20 - это вдвое ярче, чем 10, на 100%, а 210 - всего лишь на 5% ярче, чем 200. Поэтому шкала смещена так, чтобы внизу было гуще. По идее, вообще нужна логарифмическая шкала, но у неё нет нуля, поэтому выбрали степень 1/2.2.
Да, это создаёт неудобства - для любых преобразований цвета нужно сначала делать гамма коррекцию в одно сторону, в линейную шкалу, потом выполнять все преобразования, а потом обратная гамма коррекция.
Давно читал, что человеческие органы чувств в основном экспоненциальные.
На примере света это значит вот что - возьмём одинаковые лампочки. Сперва зажгём одну и скажем, что этот уровень освещения это "базис". Теперь добавим еще одну лампочку - глаз увидит увеличение ярости. Назовём это "яркость увеличилась на одну величину". Так вот теперь чтобы субъективно увеличить яркость еще НА одну величину придётся добавить 2 лампочки. А чтобы еще на одну - 4. И так далее.
То же самое касается восприятия громкости - поэтому там децибелы, т.е. логарифмическая шкала для оценки степени громкости звука.