一个片段可以访问WebGL GLSL中的所有纹理像素值吗? (不仅仅是它自己的TexCoord)

时间:2014-05-04 11:47:42

标签: opengl-es glsl webgl fragment-shader compute-shader

让我们假设我使用WebGL和GLSL制作计算着色器。

在此着色器中,每个片段(或像素)都希望查看纹理上的每个像素,然后决定它自己的颜色。

通常情况下,片段会从一些纹理中提取纹理坐标(UV值),但我希望有效地对单个片段的单个纹理中的所有UV值进行采样。

这可能吗?

2 个答案:

答案 0 :(得分:3)

编辑:我能够从128x128纹理中的每个像素进行采样,但是移动到256x256会导致Chrome失败。意味着每个像素可以在一次绘制调用中从相同纹理中采样大约16384个不同的像素。对于机器学习非常有用!

注意:可能有2个纹理的非方形功率支持256x256(65536像素)下更高的像素样本数,但我只使用方形纹理,因此未经过测试。

<强> GIST OF SOURCE CODE

void main() {
    vec4 tcol = vec4(0, 0, 0, 0);
    for (float x = 0.0; x < PIXELS_WIDE; x++) 
        for (float y = 0.0; y < PIXELS_TALL; y++) 
            tcol += texture2D(tex0, vec2(x / PIXELS_WIDE, y / PIXELS_TALL));
    tcol /= 100.;
    gl_FragColor = tcol;
}

在Chrome中,我能够执行以下循环:

100次通过(作品):

void main() {
    float reg = 0.0;
    for (int i = 0; i < 100; i++) {
        reg += 1.0 / 255.0;
    }
    gl_FragColor = vec4(reg, 0, 0, 1);
}

1 000次通过(工程):

void main() {
    float reg = 0.0;
    for (int i = 0; i < 1000; i++) {
        reg += 0.1 / 255.0;
    }
    gl_FragColor = vec4(reg, 0, 0, 1);
}

10 000次通过(工程):

void main() {
    float reg = 0.0;
    for (int i = 0; i < 10000; i++) {
        reg += 0.01 / 255.0;
    }
    gl_FragColor = vec4(reg, 0, 0, 1);
}

10万通票(打床):

void main() {
    float reg = 0.0;
    for (int i = 0; i < 100000; i++) {
        reg += 0.001 / 255.0;
    }
    gl_FragColor = vec4(reg, 0, 0, 1);
}
GL_INVALID_ENUM : glBindFramebuffer: target was GL_READ_FRAMEBUFFER_ANGLE 
GL_INVALID_ENUM : glBindFramebuffer: target was GL_DRAW_FRAMEBUFFER_ANGLE 
WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost

答案 1 :(得分:1)

  

这可能吗?

然而,当然,由于每个纹理访问需要许多GPU指令周期,因此您可能会遇到片段着色器在每个片段中止之前可能花费多少周期的硬限制。