kal*_*l21 11 opengl-es glsl opengl-es-2.0
我在GLSL片段着色器(OpenGL ES 2.0)中传递具有NxM大小的纹理作为采样器.从相邻纹理元素读取纹素数据的正确方法是什么?我在片段着色器中没有"变化的"纹理坐标.我只能使用片段坐标来读取纹理信息.
以下是我的着色器,我不确定它是否实际读取数据:
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;
}
Run Code Online (Sandbox Code Playgroud)
对于NxM尺寸纹理,OFFSET值应该是1.0还是其他值?
Chr*_*ica 14
Nem在他的回答中是正确的,纹理坐标应该在[0,1]中.但请记住,值gl_FragCoord在[0,N] x [0,M]中(假设您的视口也是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;
}
Run Code Online (Sandbox Code Playgroud)
其中invScreenSize是倒数屏幕大小(1/N, 1/M),以防止着色器中的划分.
| 归档时间: |
|
| 查看次数: |
6824 次 |
| 最近记录: |