Opengl 如何从多采样纹理中提取超出其采样数的texel

Opengl 如何从多采样纹理中提取超出其采样数的texel,opengl,textures,multisampling,Opengl,Textures,Multisampling,假设我创建了一个包含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); co

假设我创建了一个包含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;
}
输出vec4颜色;
均匀取样器2dms-tex;
在vec2 txcoords中;
void main()
{
vec4-col;
ivec2 txSize=ivec2(纹理尺寸(tex)*txcoords);

对于(int i=0;i我应该指出,通常超出范围的缓冲区访问在OpenGL中具有未定义的行为。但是,为了提高健壮性,最近在OpenGL 4.x中推出了一个扩展,允许您在这些情况下定义行为

GL\u ARB\u健壮性\u缓冲区\u访问\u行为

此扩展的工作原理是在创建OpenGL上下文时将新标志传递给它,然后超出范围的缓冲区访问将产生定义良好的值


在您的情况下,超出范围的
texelFetch(…)
将返回
vec4(0.0,0.0,0.0,0.0)

您希望OpenGL在何处生成无效操作?着色器的计算方法与其他API函数不同;您希望的最好方法是通过GLSL编译器静态分析来检测您使用的样本超出了范围,并且这种情况可能永远不会发生。它可能确实“失败”在运行时,只是本例中的行为未定义,因此在此之后发生的任何事情在技术上都是正确的:至少如果不是无效的操作错误,我希望颜色输出为垃圾或全零(0,0,0,0)在这种情况下,当i>=8时。或者至少当i>=GL\u MAX\u SAMPLES时。是的,你不应该期望出现这种情况。在移植软件时,你会经常被烧掉——未定义的行为通常只在不同的实现行为不同时才会被发现。“如果i=9,我仍然可以获取第9个样本?”不,那将是第十个。零基索引。
    for(int i=10050;i<10058;i++)