0
假设我创建了包含8个采样的多采样纹理。如何从多采样纹理获取纹理超出其样本数量
我的片段着色器是
out vec4 color;
uniform sampler2DMS tex;
in vec2 txcoords;
void main()
{
vec4 col;
ivec2 txSize = ivec2(textureSize(tex)* txcoords);
for(int i=0;i<8;i++)
col += texelFetch(tex, txSize, i);
color = col/8;
}
这工作得很好。 但是如果我更换了循环以上
for(int i=10050;i<10058;i++)
这仍然有效。 (通过作品,我的意思是我仍然得到正确的形象)
为什么?不应该OpenGL产生了一个无效的操作错误。
同样,即使纹理有8个样本,我仍然可以获取第9个样本,如果我= 9?对我来说听起来不合适。片段着色器应该在运行时失败。
确切位置在哪里,你会喜欢的OpenGL产生一个无效操作?着色器不像其他API函数那样进行评估; GLSL编译器的静态分析能够检测出你使用的是超出范围的样本,而这可能永远不会发生。它可能在运行时“失败”,它只是在这种情况下的行为是未定义的,所以在此之后发生的任何事情在技术上是正确的:P –
至少如果不是无效的操作错误,我期望颜色输出是垃圾或全部在这种情况下i> = 8时,零(0,0,0,0)。或至少当我> = GL_MAX_SAMPLES。 – viktorzeid
是的,你不应该期望这些东西。当需要移植软件的时候,你会被烧得更多 - 未定义的行为通常只有在不同的实现行为不同时才会知道。 –