Является ли требование к версии GLSL для этой демонстрации SSDO противоречивым?

Я попытался запустить демонстрационный код SSDO из здесь, но столкнулся с несколькими проблемами, которые еще больше запутали меня после того, как я потратил несколько часов на поиск решений. Тем не менее, теперь я почти уверен, что проблемы связаны с версией GLSL.

Обратите внимание, что:

  • В демо используются glew и glut.
  • Моей средой является Microsoft Visual Studio Community 2019 в Windows 10 pro, поддерживаемая Parallels Desktop на MacBook Pro 15 2018.

Этап 1

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

ERROR: 0:15: Invalid call of undeclared identifier 'texelFetch2D'
ERROR: 0:16: Invalid call of undeclared identifier 'texelFetch2D'
ERROR: 0:17: Invalid call of undeclared identifier 'texelFetch2D'
ERROR: 0:19: Use of undeclared identifier 'pixelPosition'
ERROR: 0:20: Use of undeclared identifier 'lightVector'
ERROR: 0:21: Use of undeclared identifier 'lightVector'
ERROR: 0:21: Use of undeclared identifier 'lightDistance'
ERROR: 0:23: Use of undeclared identifier 'pixelNormal'
ERROR: 0:24: Use of undeclared identifier 'pixelNormal'
ERROR: 0:24: Use of undeclared identifier 'pixelNormal'
ERROR: 0:25: Use of undeclared identifier 'lightDir'
ERROR: 0:25: Use of undeclared identifier 'pixelNormal'
ERROR: 0:27: Use of undeclared identifier 'cosAlpha'
ERROR: 0:27: Use of undeclared identifier 'pixelReflectance'
ERROR: 0:32: Use of undeclared identifier 'diffuseColor'

ERROR: One or more attached shaders not successfully compiled
...

Аналогично пошли сообщения и для других шейдеров.
Соответственно, показанные выше сообщения об ошибках относились к create_direct_light_buffer.frag:


varying vec4 position;
varying vec3 normal;

uniform vec4 lightPosition;
uniform vec4 lightColor;

uniform sampler2D positionTexture;
uniform sampler2D normalTexture;
uniform sampler2D reflectanceTexture;


void main()
{   
    vec4 pixelPosition = texelFetch2D(positionTexture, ivec2(gl_FragCoord.xy), 0);
    vec4 pixelNormal = texelFetch2D(normalTexture, ivec2(gl_FragCoord.xy), 0);
    vec4 pixelReflectance = texelFetch2D(reflectanceTexture, ivec2(gl_FragCoord.xy), 0);
    
    vec3 lightVector = lightPosition.xyz - pixelPosition.xyz;       // vector to light source
    float lightDistance = length(lightVector);         // distance to light source
    vec3 lightDir = lightVector / lightDistance;       // normalized vector to light source

    pixelNormal.w = 0.0;
    pixelNormal = normalize(pixelNormal);
    float cosAlpha = max(0.0, dot(lightDir.xyz, pixelNormal.xyz));
    
    vec4 diffuseColor = vec4(cosAlpha) * pixelReflectance;
    // vec4 ambientColor = vec4(0.2, 0.2, 0.2, 1.0);
    
    // diffuseColor += ambientColor;

    gl_FragColor = diffuseColor;
    gl_FragColor.a = 1.0;
}

Очевидно, я искал texelFetch2D, но получил очень ограниченную информацию. Тем не менее, основываясь на информации, я предварительно предположил, что замена его на texelFetch поможет, для чего требуется версия GLSL не ниже 1.30, согласно этой страницы.


Этап 2

Поэтому я добавил #version 130 в самом начале create_direct_light_buffer.frag, и сообщения об ошибках превратились в:

ERROR: 0:1: '' :  version '130' is not supported

ERROR: One or more attached shaders not successfully compiled
...

Затем я последовал совету @flyx, добавив к функции main, чтобы указать версию:

glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);

Я начал теряться.


Этап 3

Сообщения об ошибках превратились в:

WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord5' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord6' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord0' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_SecondaryColor' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord4' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord7' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_FogCoord' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord1' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord3' to match BindAttributeLocation request.
WARNING: Could not find vertex shader attribute 'PRLGLSL_MultiTexCoord2' to match BindAttributeLocation request.

C
ERROR: 0:2: 'varying' : syntax error: syntax error

ERROR: One or more attached shaders not successfully compiled
...

Эти предупреждения, похоже, не относятся к create_direct_light_buffer.frag, и более того, я не смог найти никаких вопросов и решений по ним, поэтому просто пропустил их.
Когда я попытался разобраться с ошибкой varying, я нашел это сообщение, в котором утверждалось, что varying было заменено на in или out начиная с GLSL версии 1.30.

Это конфликт в заголовке.


Мои ожидания

  1. Демо вообще правильное?
  2. Если есть возможность запустить проект, что мне делать?

Поскольку я новичок в OpenGL, если кто-то может загрузить исходный код попробовать на своем компьютере и подсказать, как это сделать, буду очень благодарен .
В противном случае, если бы какие-то опытные специалисты могли дать мне несколько общих советов о том, что может быть не так или как решить эту проблему, я был бы столь же благодарен.


person XYZ    schedule 20.06.2020    source источник


Ответы (1)


  1. Демо вообще правильное?

Нет. Давайте посмотрим на некоторые детали здесь:

этап 1

Очевидно, я искал texelFetch2D, но получил очень ограниченную информацию. Тем не менее, основываясь на информации, я предварительно предположил, что замена его на texelFetch поможет, что требует версии GLSL не ниже 1.30, согласно этой странице.

texelFetch2D не существует в стандартном GLSL. Это функция, представленная в расширении GL_EXT_gpu_shader4, которая никогда не вошли непосредственно в основную функциональность GL. Концептуально texelFetch является правильной заменой при использовании GLSL 130 или выше.

Хотя этот шейдер может компилироваться в некоторых реализациях, он не поддерживается никаким стандартом и не должен работать.

Интересно, что в SSBO.frag демонстрация правильно запрашивает это расширение, так что код должен работать с реализацией, поддерживающей это расширение:

#version 120
#extension GL_EXT_gpu_shader4 : enable

Просто переключиться на #version 130 тоже не получится, потому что придется переписывать весь шейдер на синтаксис GLSL 130, где много деталей изменилось (например, varyings заменены более общей схемой in/out).

этап 2 и этап 3

Затем я последовал совету @flyx, добавив в основную функцию указание версии:

glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);

Это не сработает. В базовом профиле OpenGL вся устаревшая функциональность недоступна, и это руководство сильно зависит от такой устаревшей функциональности. Чтобы заставить этот код работать с основным профилем OpenGL, потребуется серьезная переработка.

Однако:

Моя среда — Microsoft Visual Studio Community 2019 в Windows 10 pro, поддерживаемая Parallels Desktop на MacBook Pro 15 2018.

Что касается Mac, Apple в целом не рекомендует OpenGL, и, кроме того, MacOS поддерживает только устаревший GL до GL 2.1 и базовый профиль GL, начиная с GL 3.2. Согласно этой записи в базе знаний Parallels, те же самые ограничения передаются окнам гость. Устаревший GL MacOS не будет поддерживать EXT_gpu_shader4 эту демонстрацию, и более высокие версии GL, которые также будут включать в себя необходимые функции, потребуют основных профилей, которые сделают эту демонстрацию непригодной для использования.

Если есть возможность запустить проект, что мне делать?

Так что в основном: никаких шансов.

Итак, что вы должны сделать:

  • не используйте учебники / демонстрации, которые полагаются на устаревшие материалы, которые были удалены более десяти лет назад.
  • не занимайтесь разработкой OpenGL на виртуальных машинах
  • не занимайтесь разработкой OpenGL в Apple, он там полностью устарел, а поддержка GL остановилась на GL 4.1, которому уже десять лет.
person derhass    schedule 20.06.2020
comment
Спасибо, что не дали мне тратить больше времени на бесперспективную работу! Мне интересно, означает ли ваш ответ, что, если я переключусь на правильный ПК с Windows и внесу умеренные изменения в демонстрацию (вместо того, чтобы переписывать все шейдеры), все будет работать нормально? - person XYZ; 20.06.2020
comment
Ну, в типичной реализации OpenGL для Windows у вас будет доступное расширение EXT_gpu_shader4, а поставщики также поддерживают профиль совместимости OpenGL, который позволяет смешивать GL 3.2 или выше со всеми устаревшими хламами, так что шансы запустить его есть намного выше. То же самое касается Linux с проприетарным драйвером nvidia. Но он все еще требует некоторых исправлений, прежде чем можно будет предположить, что этот код работает. - person derhass; 20.06.2020
comment
«Если я переключусь на правильный ПК с Windows», обратите внимание, что вы можете загрузить Windows на свой Mac с помощью Boot Camp, «ПК» не нужен. пока Apple Silicon не будет выпущен, все Mac могут работать под управлением Windows и использовать графические процессоры сторонних производителей с хорошими драйверами для Windows. - person Andrea; 24.06.2020