存储某些值时,OpenGL ImageStore会变慢

时间:2014-08-18 16:59:10

标签: opengl

我正在撰写一些定义如下的3D纹理:

layout (binding = 0, rgba8) coherent uniform image3D volumeGeom[MIPLEVELS];
layout (binding = 4, rgba8) coherent uniform image3D volumeNormal[MIPLEVELS];

我写的是以下值

float df = dot(normalize(In.WorldNormal), -gSpotLight.Direction);
if(df < 0) df = 0;
else df = 1;
fragmentColor = texture2D(gSampler, In.TexCoord0.xy);
imageStore(volumeGeom[In.GeomInstance], ivec3(coords1), fragmentColor);
imageStore(volumeNormal[In.GeomInstance], ivec3(coords1), vec4(normalize(In.WorldNormal), 1.0));
fragmentColor = vec4(fragmentColor.xyz*CalcShadowFactor(In.LightSpacePos)*df,1.0);

你可以看到我写了第一个fragmentColor,我故意把另一个fragmentColor放在商店之后,即使我没有对它做任何事情。此配置以21 FPS运行。如果我这样做

float df = dot(normalize(In.WorldNormal), -gSpotLight.Direction);
if(df < 0) df = 0;
else df = 1;
fragmentColor = texture2D(gSampler, In.TexCoord0.xy);
fragmentColor = vec4(fragmentColor.xyz*CalcShadowFactor(In.LightSpacePos)*df,1.0);
imageStore(volumeGeom[In.GeomInstance], ivec3(coords1), fragmentColor);
imageStore(volumeNormal[In.GeomInstance], ivec3(coords1), vec4(normalize(In.WorldNormal), 1.0));

其中第二个fragmentColor在之前计算并存储在volumeGeom中,整个事件以13 FPS运行。这意味着imageStore运行速度较慢,具体取决于我正在编写的值。这是因为某些编译器优化吗? 基本上,第二个fragmentColor对于阴影或背光的表面是0。

1 个答案:

答案 0 :(得分:1)

不确定CalcShadowFactor方法有多复杂,但很可能在第一个版本中,图像存储可能与您的计算重叠,而在第二个版本中,您的计算必须先在商店之前结束叫做。这加上注册压力的增加,已经足以使#2版本比#1慢得多。

如果这是完整的源代码,那么在#1情况下,对CalcShadowFactor的调用也可能完全被优化掉,因为从未使用过结果(如果永远不会读取fragmentColor再次,而不是输出。)