Странные ошибки с освещением при трансформации объекта в OpenGL ⇐ C++
Странные ошибки с освещением при трансформации объекта в OpenGL
Я работаю над игрой на 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 — обычная матрица, которую я пытался поместить в шейдер, но это сработало неправильно...)
Я работаю над игрой на 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 — обычная матрица, которую я пытался поместить в шейдер, но это сработало неправильно...)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Анимация стрелки раскрывающегося списка для трансформации на 180 градусов при активации.
Anonymous » » в форуме CSS - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-