Странные ошибки с освещением при трансформации объекта в OpenGLC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Странные ошибки с освещением при трансформации объекта в OpenGL

Сообщение Anonymous »


Я работаю над игрой на OpenGL и обнаружил странное освещение при вращении И масштабировании объекта. Когда я только масштабирую или вращаю объект, освещение работает нормально, но когда я делаю и то, и другое, получается странный световой эффект.

Скриншот ошибки

Я перепробовал множество возможных исправлений, которые нашел в Интернете, но ни одно из них не сработало.

При отладке я обнаружил, что шейдеры, похоже, являются причиной ошибок освещения, поэтому я покажу только их:

(Вершинный шейдер)

#версия 330 ядра // Входные данные вершины... макет (расположение = 0) в vec3 vertexPosition_modelspace; макет (расположение = 1) в vec2 vertexUV; макет (расположение = 2) в vec3 vertexNormal_modelspace; // Вывод данных... выход vec2 UV; из vec3 Position_worldspace; из vec3 Normal_cameraspace; из vec3 EyeDirection_cameraspace; из vec3 LightDirection_cameraspace; // унифицированные значения униформа mat4 MVP; равномерный мат4 В; униформа мат4 М; униформа мат4 нормалМ; униформа vec3 LightPosition_worldspace; пустая функция(){ // Позиция... gl_Position = MVP * vec4(vertexPosition_modelspace,1); // Положение вершин в мировом пространстве... Position_worldspace = (M * vec4(vertexPosition_modelspace,1)).xyz; // Положение вершины в пространстве камеры vec3 vertexPosition_cameraspace = ( V * M * vec4(vertexPosition_modelspace,1)).xyz; EyeDirection_cameraspace = vec3 (0,0,0) - vertexPosition_cameraspace; // Положение света в пространстве камеры vec3 LightPosition_cameraspace = ( V * vec4(LightPosition_worldspace,1)).xyz; LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace; // Нормальное положение в пространстве камеры Normal_cameraspace = (V * M * vec4(vertexNormal_modelspace, 0)).xyz; // Правильно, только если ModelMatrix не масштабирует модель! Если нет, используйте обратное транспонирование. // UV вершины УФ = вершинаУФ; } (Фрагментный шейдер)

#версия 330 ядра в vec2 UV; в vec3 Position_worldspace; в vec3 Normal_cameraspace; в vec3 EyeDirection_cameraspace; в vec3 LightDirection_cameraspace; цвет vec4; униформный сэмплер2D myTextureSampler; униформа мат4 МВ; униформа мат4 нормалМ; униформа vec3 LightPosition_worldspace; пустая функция(){ // Легкие вещи... vec3 LightColor = vec3(1,1,1); плавающая LightPower = 120.0f; // Свойства материала vec3 MaterialDiffuseColor = текстура (myTextureSampler, UV).rgb; vec3 MaterialAmbientColor = vec3(0.2,0.2,0.2) * MaterialDiffuseColor; vec3 MaterialSpecularColor = vec3(0.3,0.3,0.3); // Расстояние до света Расстояние плавания = длина (LightPosition_worldspace - Position_worldspace); // Нормально в пространстве камеры (нормализовано) vec3 n = нормализовать (Normal_cameraspace); // Направление света (нормализованное) vec3 l = нормализовать (LightDirection_cameraspace); //vec3 nt = нормализовать( ntmat * Normal_cameraspace ); (Псевдокод: не работает!) // Косинус... float cosTheta = зажим(точка(n,l), 0,1); // Вектор глаза в пространстве камеры vec3 E = нормализовать (EyeDirection_cameraspace); // Чтобы отразить свет... vec3 R = отражать (-l, n); // Снова получаем косинус... float cosAlpha = зажим(точка(E,R), 0,1); цвет.rgb = // Ambient: имитирует непрямое освещение МатериалОкружающая средаЦвет + // Diffuse: «цвет» объекта MaterialDiffuseColor * LightColor * LightPower * cosTheta / (расстояние*расстояние) + // Specular: отражающий свет, как в зеркале MaterialSpecularColor * LightColor * LightPower * pow(cosAlpha,5) / (расстояние*расстояние); цвет.а = 1,0; } (normalM — обычная матрица, которую я пытался поместить в шейдер, но это сработало неправильно...)
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»