1

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

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

通常一个片段采样它从几个纹理中提供纹理坐标(UV 值),但我想有效地从单个纹理中为单个片段采样所有 UV 值。

这可能吗?

4

2 回答 2

3

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

注意:在 256x256(65536 像素)下,可能存在 2 次方纹理以支持更高的像素样本数,但我只使用方形纹理,因此未对此进行测试。

源代码要点

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);
}

100 000 次通行证(拉屎):

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
于 2014-05-04T13:12:16.533 回答
1

这可能吗?

确实如此,但是由于每次纹理访问都需要多个 GPU 指令周期,因此在片段着色器中止之前,您可能会遇到片段着色器在每个片段上花费的周期数的硬性限制。

于 2014-05-04T11:57:40.500 回答