我有三个纹理应该以相同的方式显示在opengl控件上。表示texture1应该在glcontrol的0到0.33之间。并且texture2应该在0.33到0.66之间,而texture3保留在原处。我已经做了如下。但是中间图像的右侧部分出现模糊区域。请帮助纠正
private void CreateShaders()
{
/***********Vert Shader********************/
vertShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertShader, @"attribute vec3 a_position;
varying vec2 vTexCoordIn;
void main() {
vTexCoordIn=( a_position.xy+1)/2 ;
gl_Position = vec4(a_position,1);
}");
GL.CompileShader(vertShader);
/***********Frag Shader ****************/
fragShader = GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(fragShader, @"
uniform sampler2D sTexture1;
uniform sampler2D sTexture2;
uniform sampler2D sTexture3;
varying vec2 vTexCoordIn;
void main ()
{
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
if ( vTexCoord.x<0.3 )
gl_FragColor = texture2D (sTexture1, vec2(vTexCoord.x*2.0, vTexCoord.y));
else if ( vTexCoord.x>=0.3 && vTexCoord.x<=0.6 )
gl_FragColor = texture2D (sTexture2, vec2(vTexCoord.x*2.0, vTexCoord.y));
else
gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y));
}");
GL.CompileShader(fragShader);
}
答案 0 :(得分:0)
gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y));
^^^^
如果x> = 0.5,则将x坐标乘以2.0会导致值超过1.0。如果将采样器设置为CLAMP_TO_EDGE(似乎是这种情况),则会导致在纹理边缘重复采样相同的纹理像素(如您提到的那样出现拖尾/模糊)。
答案 1 :(得分:0)
表示texture1应该在glcontrol的0到0.33之间。并且Texture2应该在0.33到0.66之间,而Texture3仍然存在。
如果纹理坐标在[0,0.33]范围内,则必须绘制sTexture1
,并且必须将纹理坐标从[0,0.33]映射到[0,1]:
if ( vTexCoord.x < 1.0/3.0 )
gl_FragColor = texture2D(sTexture1, vec2(vTexCoord.x * 3.0, vTexCoord.y));
如果纹理坐标在[0.33,0.66]范围内,则必须绘制sTexture2
,并且必须将纹理坐标从[0.33,0.66]映射到[0,1]:
else if ( vTexCoord.x >= 1.0/3.0 && vTexCoord.x < 2.0/3.0 )
gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 1.0, vTexCoord.y));
如果纹理坐标在[0.66,1]范围内,则必须绘制sTexture3
,并且必须将纹理坐标从[0.66,1]映射到[0,1]:
else if ( vTexCoord.x >= 2.0/3.0 )
gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 2.0, vTexCoord.y));