这个SSDO demo的GLSL版本要求是self-conflicting吗?
Is the GLSL version requirement of this SSDO demo self-conflicting?
我尝试 运行 来自 here 的 SSDO 演示代码,但在我花了几个小时寻找解决方案后遇到了几个问题,这些问题让我更加困惑。尽管如此,现在我几乎可以肯定问题出在 GLSL 版本.
注意:
- 该演示使用
glew
和 glut
。
- 我的 环境 是 Microsoft Visual Studio Community 2019 on Windows Parallels Desktop 在 15" MacBook Pro 2018 上支持 10 pro。
第 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,根据this page。
第 2 阶段
所以我在create_direct_light_buffer.frag
的最前面加上了#version 130
,报错信息变成了:
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
错误时,我发现 this post,它声称 varying
被 in
或 out
取代,因为 GLSL 版本 1.30.
这就是标题中的冲突。
我的期望
- 演示完全正确吗?
- 如果可以运行项目,我应该怎么做?
由于我是 OpenGL 的新手,如果有人可以下载 source code 在 his/her 自己的电脑上试用并告诉我如何解决,我将不胜感激。
否则,如果一些 highly-experienced 专家可以就可能出现的问题或如何解决此问题给我一些一般性建议,我将同样感激不尽。
- Is the demo correct at all?
没有。让我们看看这里的一些细节:
阶段 1
Apparently I searched for texelFetch2D
, but garnered only very limited
information. Yet based on the information, I tentatively assumed that
replacing it with texelFetch
would help, which requires a GLSL version
no less than 1.30, according to this page.
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
Then I took @flyx's advice, adding to the main function to specify the
version:
glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);
那不行。在核心配置文件 OpenGL 中,所有已弃用的遗留功能都不可用,并且该教程在很大程度上依赖于此类已弃用的功能。需要进行重大重写才能使此代码与核心配置文件 OpenGL 一起使用。
但是:
My environment is Microsoft Visual Studio Community 2019 on Windows 10 pro supported by Parallels Desktop on a 15" MacBook Pro 2018.
在 Mac 方面,OpenGL 通常被 Apple 弃用,除此之外,MacOS 仅支持到 GL 2.1 的旧版 GL,以及从 GL 3.2 开始的核心配置文件 GL。根据this parallels knowledge base entry,同样的限制转发给windows客人。 MacOS' 旧版 GL 将不支持 EXT_gpu_shader4
此演示所依赖的,而更高的 GL 版本也将包含所需的功能,将需要核心配置文件,这将使该演示无法使用。
If it is possible to run the project, what should I do?
所以基本上:没有机会。
那么,你应该做什么:
- 不要使用依赖十多年前删除的不当内容的教程/演示
- 不要在 VM 中进行 OpenGL 开发
- 不要在 Apple 上进行 OpenGL 开发,它在那里已完全弃用,并且 GL 支持在 GL 4.1 停止,到现在也已有十年历史。
我尝试 运行 来自 here 的 SSDO 演示代码,但在我花了几个小时寻找解决方案后遇到了几个问题,这些问题让我更加困惑。尽管如此,现在我几乎可以肯定问题出在 GLSL 版本.
注意:
- 该演示使用
glew
和glut
。 - 我的 环境 是 Microsoft Visual Studio Community 2019 on Windows Parallels Desktop 在 15" MacBook Pro 2018 上支持 10 pro。
第 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,根据this page。
第 2 阶段
所以我在create_direct_light_buffer.frag
的最前面加上了#version 130
,报错信息变成了:
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
错误时,我发现 this post,它声称 varying
被 in
或 out
取代,因为 GLSL 版本 1.30.
这就是标题中的冲突。
我的期望
- 演示完全正确吗?
- 如果可以运行项目,我应该怎么做?
由于我是 OpenGL 的新手,如果有人可以下载 source code 在 his/her 自己的电脑上试用并告诉我如何解决,我将不胜感激。
否则,如果一些 highly-experienced 专家可以就可能出现的问题或如何解决此问题给我一些一般性建议,我将同样感激不尽。
- Is the demo correct at all?
没有。让我们看看这里的一些细节:
阶段 1
Apparently I searched for
texelFetch2D
, but garnered only very limited information. Yet based on the information, I tentatively assumed that replacing it withtexelFetch
would help, which requires a GLSL version no less than 1.30, according to this page.
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
Then I took @flyx's advice, adding to the main function to specify the version:
glutInitContextVersion(3, 2); glutInitContextProfile(GLUT_CORE_PROFILE);
那不行。在核心配置文件 OpenGL 中,所有已弃用的遗留功能都不可用,并且该教程在很大程度上依赖于此类已弃用的功能。需要进行重大重写才能使此代码与核心配置文件 OpenGL 一起使用。
但是:
My environment is Microsoft Visual Studio Community 2019 on Windows 10 pro supported by Parallels Desktop on a 15" MacBook Pro 2018.
在 Mac 方面,OpenGL 通常被 Apple 弃用,除此之外,MacOS 仅支持到 GL 2.1 的旧版 GL,以及从 GL 3.2 开始的核心配置文件 GL。根据this parallels knowledge base entry,同样的限制转发给windows客人。 MacOS' 旧版 GL 将不支持 EXT_gpu_shader4
此演示所依赖的,而更高的 GL 版本也将包含所需的功能,将需要核心配置文件,这将使该演示无法使用。
If it is possible to run the project, what should I do?
所以基本上:没有机会。
那么,你应该做什么:
- 不要使用依赖十多年前删除的不当内容的教程/演示
- 不要在 VM 中进行 OpenGL 开发
- 不要在 Apple 上进行 OpenGL 开发,它在那里已完全弃用,并且 GL 支持在 GL 4.1 停止,到现在也已有十年历史。