我使用一维纹理绘制一个简单的纹理四边形(2个三角形),该纹理可容纳512个值,范围从0到1.我在NVIDIA GeForce GT 750M上使用RGBA_32F,GL_LINEAR插值和GL_CLAMP_TO_EDGE
我使用以下着色器绘制四边形:
varying vec2 v_texcoord;
uniform sampler1D u_texture;
void main()
{
float x = v_texcoord.x;
float v = 512.0 * abs(texture1D(u_texture,x).r - x);
gl_FragColor = vec4(v,v,v,1);
}
基本上,我显示纹理值和frag坐标之间的差异。我希望得到一个黑色四边形(没有区别),但这是我得到的:
我试图缩小问题的范围并尝试生成只有两个值(0和1)的一维纹理并使用以下方法显示:
varying vec2 v_texcoord;
uniform sampler1D u_texture;
void main()
{
float x = v_texcoord.x;
float v = texture1D(u_texture,x).r;
gl_FragColor = vec4(v,v,v,1);
}
然后我得到:
显然,这不是从0到1的线性插值。结果似乎分为3个区域:黑色,插值和白色。我尝试了不同的包装值但没有成功(但结果不同)。知道我在这里做错了吗?
答案 0 :(得分:0)
在搜索了一下之后,看起来纹理需要一个小的调整,具体取决于纹理大小:
varying vec2 v_texcoord;
uniform sampler1D u_texture;
uniform float u_texture_shape;
void main()
{
float epsilon = 1.0/u_texture_shape;
float x = epsilon/2.0 +(1.0-epsilon)*v_texcoord.x;
float v = 512.0*abs(texture1D(u_texture,x).r -v_texcoord.x);
gl_FragColor = vec4(v,v,v,1);
}
我想这与包装模式有关但我没有找到有关如何在GPU级别强制执行包装的信息。