在 openGL 控件上平均显示三个纹理 - OpenTK C#
Display three textures equally on openGL control - OpenTK C#
我有三个纹理应该显示在 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);
}
gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y));
^^^^
如果 x >= 0.5,则 x 坐标乘以 2.0 会导致值超过 1.0。如果您的采样器设置为 CLAMP_TO_EDGE(这似乎是这种情况),这会导致在纹理边缘重复采样相同的纹素(如您所提到的,这将显示为涂抹/模糊)。
Means texture1 should be in 0 to 0.33 of glcontrol. And texture2 should be in 0.33 to 0.66 And texture3 in remain place.
如果纹理坐标在 [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));
我有三个纹理应该显示在 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);
}
gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y));
^^^^
如果 x >= 0.5,则 x 坐标乘以 2.0 会导致值超过 1.0。如果您的采样器设置为 CLAMP_TO_EDGE(这似乎是这种情况),这会导致在纹理边缘重复采样相同的纹素(如您所提到的,这将显示为涂抹/模糊)。
Means texture1 should be in 0 to 0.33 of glcontrol. And texture2 should be in 0.33 to 0.66 And texture3 in remain place.
如果纹理坐标在 [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));