Я попытался запустить демонстрационный код 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 .
Это конфликт в заголовке.
Мое ожидание
- Демонстрация вообще верна?
- Если можно запустить проект, что мне делать?
Поскольку я новичок в OpenGL, я был бы чрезвычайно благодарен, если бы кто-нибудь мог загрузить исходный код , чтобы попробовать на своем компьютере и рассказать мне, как это решить. В противном случае, если бы несколько опытных экспертов могли бы дать мне несколько общих советов о том, что может быть не так или как решить эту проблему, я был бы также благодарен.