gpt4 book ai didi

opengl-es - 在 OpenGL ES 2.0 中,如何从采样器读取相邻纹理像素?

转载 作者:行者123 更新时间:2023-12-02 09:11:16 34 4
gpt4 key购买 nike

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

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

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 大小的纹理,OFFSET 值应该是 1.0 还是其他值?

最佳答案

Nem 的回答是正确的,纹理坐标应该在 [0,1] 中。但请记住,gl_FragCoord 的值在 [0,N]x[0,M] 中(假设您的视口(viewport)也是 NxM)。因此,您在片段坐标上添加偏移量 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;
}

其中 invScreenSize 是屏幕尺寸的倒数(1/N, 1/M),以防止在着色器中进行分割。

关于opengl-es - 在 OpenGL ES 2.0 中,如何从采样器读取相邻纹理像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7774351/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com