假设我正在使用 WebGL 和 GLSL 制作计算着色器。
在这个着色器中,每个片段(或像素)都想查看纹理上的每个像素,然后决定它自己的颜色。
通常一个片段采样它从几个纹理中提供纹理坐标(UV 值),但我想有效地从单个纹理中为单个片段采样所有 UV 值。
这可能吗?
假设我正在使用 WebGL 和 GLSL 制作计算着色器。
在这个着色器中,每个片段(或像素)都想查看纹理上的每个像素,然后决定它自己的颜色。
通常一个片段采样它从几个纹理中提供纹理坐标(UV 值),但我想有效地从单个纹理中为单个片段采样所有 UV 值。
这可能吗?
编辑:我能够从 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
这可能吗?
确实如此,但是由于每次纹理访问都需要多个 GPU 指令周期,因此在片段着色器中止之前,您可能会遇到片段着色器在每个片段上花费的周期数的硬性限制。