Является ли требование версии GLSL для этой демонстрации SSDO самоконфликтным? - PullRequest
0 голосов
/ 20 июня 2020

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

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

  • В демонстрации используются glew и glut .
  • Моя среда - это Microsoft Visual Studio Community 2019 на Windows 10 pro, поддерживаемая Parallels Desktop на 15-дюймовом MacBook Pro 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, и, кроме того, я не смог найти никаких вопросов и решений относительно им, поэтому я просто позволил им go. Когда я попытался выяснить ошибку varying, я нашел этот пост , в котором утверждалось, что varying было заменено на in или out с GLSL версии 1.30 .

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

Мое ожидание

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

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

1 Ответ

1 голос
/ 20 июня 2020
  1. Демонстрация вообще верна?

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

этап 1

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

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

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

Интересно, что в 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 Настольный компьютер на 15-дюймовом MacBook Pro 2018.

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

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

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

Итак, что вам следует делать:

  • не используйте учебные / демонстрационные материалы, которые являются r полагаясь на испорченный материал, который был удален за десять лет go
  • не занимайтесь разработкой OpenGL в виртуальных машинах
  • не занимайтесь разработкой OpenGL на Apple, там он полностью устарел, и поддержка GL остановилась на GL 4.1, которой тоже уже десять лет.
...