0

对这个功能很困惑在glsl的代码中,我总是看到这样的东西

uniform sampler2D source;
varying vec2 textureCordi;

void main()
{
    vec2 uv = textureCordi.xy;
    vec3 t1 = texture2D(source, vec2(uv.x - step_w, uv.y - step_h)).rgb; //2
    float average = (t1.r + t1.b + t1.g) / 3.0;
    //.....
}

//2中,t1保存了源的数据(我认为是数据),但是它复制了多少数据呢?纹理的坐标在0~1之间,假设纹理是一个图像,图像的大小是1024 * 768,那么t1会节省1024 * 768个像素吗?gpu 在这个命令下会做什么?

如果 t1 做繁重的复制工作,我可以要求 texture2D 将源的引用返回给 t1(如 c++)吗?

4

2 回答 2

4

该操作只查找一个纹素,它对应于您传入的纹理坐标(考虑到过滤、mipmap 等)。纹理坐标是您要获取的纹素的归一化坐标。

编辑: t1 保存操作请求的一个纹素的 rgb 值(作为具有 3 个分量的向量)。归一化的纹理坐标是texture2D. 下一行计算了该纹素的三个通道的平均强度,而不是整个纹理的平均值。

于 2013-06-11T13:48:51.300 回答
1

这是每个片段的操作,对于每个片段,texture2D您都对单个纹素进行采样。许多并行操作是在 gpu 上针对整个基元完成的,并且在某种程度上,是的,所有数据最终都“存储”在某个输出缓冲区中,但每个main()函数仅针对当前片段运行。它不知道其他片段发生了什么,因此每个操作都是针对片段的。

为了进一步澄清这一点,这应该会有所帮助,但这可能有点过头了:GPGPU - http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html 片段着色器管道 - http://www. lighthouse3d.com/tutorials/glsl-tutorial/fragment-processor/

希望这可以帮助。

于 2013-06-11T14:47:09.927 回答