OpenGL纹理精度/ texcoord与属性

时间:2014-07-12 09:11:35

标签: opengl interpolation fragment-shader

我使用一维纹理绘制一个简单的纹理四边形(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坐标之间的差异。我希望得到一个黑色四边形(没有区别),但这是我得到的:

result

我试图缩小问题的范围并尝试生成只有两个值(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);
}

然后我得到:

Linear interpolation

显然,这不是从0到1的线性插值。结果似乎分为3个区域:黑色,插值和白色。我尝试了不同的包装值但没有成功(但结果不同)。知道我在这里做错了吗?

1 个答案:

答案 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级别强制执行包装的信息。