glsl中texture2D的成本

时间:2013-06-11 13:45:59

标签: opengl glsl

这个功能相当混乱 在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 ++)?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

希望这有帮助。