Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在openGL控件上均匀显示三种纹理-OpenTK C#_C#_Opengl_Glsl_Fragment Shader_Opentk - Fatal编程技术网

在openGL控件上均匀显示三种纹理-OpenTK C#

在openGL控件上均匀显示三种纹理-OpenTK C#,c#,opengl,glsl,fragment-shader,opentk,C#,Opengl,Glsl,Fragment Shader,Opentk,我有三种纹理,它们应该在opengl控件上以同样的方式显示,这三种纹理应该在opengl控件中。表示纹理1应在glcontrol的0到0.33之间。纹理2应在0.33到0.66之间,纹理3应保持不变。我做了如下的事情。但中间图像的右部分得到了一个模糊区域。请帮忙改正 private void CreateShaders() { /***********Vert Shader********************/ vertShader = GL.C

我有三种纹理,它们应该在opengl控件上以同样的方式显示,这三种纹理应该在opengl控件中。表示纹理1应在glcontrol的0到0.33之间。纹理2应在0.33到0.66之间,纹理3应保持不变。我做了如下的事情。但中间图像的右部分得到了一个模糊区域。请帮忙改正

   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);
    }
private void CreateShaders()
{
/***********垂直着色器********************/
vertShader=GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertShader,@“属性向量3 a_位置;
可变vec2-vtexcordin;
void main(){
vTexCoordIn=(a_位置xy+1)/2;
gl_位置=vec4(a_位置,1);
}");
总帐编译头(vertShader);
/***********Frag着色器****************/
fragShader=GL.CreateShader(ShaderType.FragmentShader);
GL.ShaderSource(fragShader,@“
均匀取样器2D结构1;
均匀取样器2;
均匀取样器2D结构3;
可变vec2-vtexcordin;
空干管()
{                                               
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
如果(vTexCoord.x=0.3&&vTexCoord.x
如果x>=0.5,将x坐标乘以2.0会导致值超过1.0。如果将采样器设置为钳制_到_边(似乎是这样),则会在纹理边缘重复采样相同的纹理(如您所述,这将显示为涂抹/模糊)

如果x>=0.5,将x坐标乘以2.0会导致值超过1.0。如果将采样器设置为钳制_到_边(似乎是这样),则会在纹理边缘重复采样相同的纹理(如您所述,这将显示为涂抹/模糊)

表示纹理1应在glcontrol的0到0.33之间。纹理2应在0.33到0.66之间,纹理3应保持在原位

如果纹理坐标在[0,0.33]范围内,则必须绘制
sTexture1
,并且纹理坐标必须从[0,0.33]映射到[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));
else if ( vTexCoord.x >= 2.0/3.0 )
    gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 2.0, vTexCoord.y));
if(vTexCoord.x<1.0/3.0)
gl_FragColor=纹理2D(结构1,向量2(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));
else if ( vTexCoord.x >= 2.0/3.0 )
    gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 2.0, vTexCoord.y));
表示纹理1应在glcontrol的0到0.33之间。纹理2应在0.33到0.66之间,纹理3应保持在原位

如果纹理坐标在[0,0.33]范围内,则必须绘制
sTexture1
,并且纹理坐标必须从[0,0.33]映射到[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));
else if ( vTexCoord.x >= 2.0/3.0 )
    gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 2.0, vTexCoord.y));
if(vTexCoord.x<1.0/3.0)
gl_FragColor=纹理2D(结构1,向量2(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));
else if ( vTexCoord.x >= 2.0/3.0 )
    gl_FragColor = texture2D(sTexture2, vec2(vTexCoord.x * 3.0 - 2.0, vTexCoord.y));

我有以下几行:GL.TexParameter(TextureTarget.Texture2D,TextureParameterName.TextureWrapS,(int)TextureWrapMode.ClampoEdge);GL.TexParameter(TextureTarget.Texture2D,TextureParameterName.TextureWrapT,(int)TextureWrapMode.ClampoEdge);当我对这些行进行注释时,会得到一个缩放的输出:GL.TexParameter(TextureTarget.Texture2D,TextureParameterName.TextureWrapS,(int)TextureWrapMode.ClampoEdge);GL.TexParameter(TextureTarget.Texture2D,TextureParameterName.TextureWrapT,(int)TextureWrapMode.ClampoEdge);当我对这行进行注释时,一个缩放的输出得到了它得到了!你能解释一下为什么需要乘以3吗?以及在最后一个循环中为什么用2.0减去吗?@nds从[0.66,1]映射到[0,1]:
0.66*3-2=0
1*3-2=1
。注意,每个纹理的纹理坐标都在[0,1]范围内谢谢。看起来纹理的纵横比丢失了。例如:如果使用下面的代码:if(vTexCoord.x),它被设置为gl_Position=vec4(a_Position,1);纵横比意味着图像的纵横比?或者关键字?它得到了。你能解释一下为什么需要乘以3吗?以及在最后一个循环中为什么用2.0减去?@nds映射从[0.66,1]到[0,1]:
0.66*3-2=0
1*3-2=1
。注意,每个纹理的纹理坐标都在[0,1]范围内。谢谢。看起来纹理的纵横比丢失了。例如:如果使用下面的代码:if(vTexCoord.x),则设置为gl_Position=vec4(a_Position,1);纵横比表示图像的纵横比?或关键字?