Opengl es 在OpenGL ES 2.0中,如何从采样器读取相邻的纹理?

Opengl es 在OpenGL ES 2.0中,如何从采样器读取相邻的纹理?,opengl-es,glsl,opengl-es-2.0,Opengl Es,Glsl,Opengl Es 2.0,我在GLSL片段着色器(OpenGL ES 2.0)中传递一个NxM大小的纹理作为采样器。从相邻的texel读取texel数据的正确方法是什么?我在片段着色器中没有“变化”纹理坐标。我只能使用片段坐标来读取纹理信息 以下是我的着色器,我不确定它是否实际读取数据: precision mediump float; uniform sampler2D Sampler; #define OFFSET 1.0 void main() { vec2 T = gl_FragCoord.xy;

我在GLSL片段着色器(OpenGL ES 2.0)中传递一个NxM大小的纹理作为采样器。从相邻的texel读取texel数据的正确方法是什么?我在片段着色器中没有“变化”纹理坐标。我只能使用片段坐标来读取纹理信息

以下是我的着色器,我不确定它是否实际读取数据:

precision mediump float;

uniform sampler2D Sampler;

#define OFFSET 1.0

void main()
{

    vec2 T = gl_FragCoord.xy;

    //Find neighboring velocities:
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+OFFSET)).xy;
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-OFFSET)).xy;
    vec2 E = texture2D(Sampler,vec2(T.x+OFFSET,T.y)).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-OFFSET,T.y)).xy; 
}

对于NxM大小的纹理,偏移值是否应为1.0或其他值

我非常确定,在OpenGL ES 2.0中,所有纹理坐标都在0.0和1.0之间浮动,因此添加1.0将是错误的,并且可能只是环绕到完全相同的位置。x偏移量应为1.0/N,y偏移量应为1.0/M(基于NxM语句)。我不相信这是最好的解决方案,但我已经用它解决了类似的问题


我建议您检查OpenGL ES着色语言规范,以验证我关于纹理坐标格式的声明是否正确(我几个月前就这么做了)。这是一个用谷歌很容易找到的pdf,并且有一个方便的列表,其中列出了某个地方的所有内置函数。

Nem的回答是正确的,纹理坐标应该在[0,1]中。但是请记住,
gl_FragCoord
的值是[0,N]x[0,M](假设视口也是NxM)。因此,将偏移量1添加到片段坐标是正确的,但该总和必须除以屏幕大小(可能与纹理大小相同):


其中,
invScreenSize
是交互屏幕大小
(1/N,1/M)
,以防止着色器中的分割。

您到底想在这里做什么?@IDWMaster我想访问相邻的texel值,就像他说的那样。我不知道哪里有不清楚的地方,也不知道他到底想要实现什么。欢迎来到StackOverflow,我希望你能读到。谢谢大家,它现在起作用了。OpenGL ES着色语言规范本身对texture2D的使用不是很清楚。@事实上,任何OpenGL入门教程都应该告诉您,纹理是通过[0,1]中的标准化纹理坐标访问的。
precision mediump float;

uniform sampler2D Sampler;
uniform vec2 invScreenSize;

void main()
{

    vec2 T = gl_FragCoord.xy;

    //Find neighboring velocities:
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+1.0)*invScreenSize).xy;
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-1.0)*invScreenSize).xy;
    vec2 E = texture2D(Sampler,vec2(T.x+1.0,T.y)*invScreenSize).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-1.0,T.y)*invScreenSize).xy; 
}