在openGL控件上平均显示三个纹理 - 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);

    }


一只萌萌小番薯
浏览 131回答 2
2回答

鸿蒙传说

意味着 texture1 应该在 glcontrol 的 0 到 0.33 之间。并且texture2 应该在0.33 到0.66 和texture3 中保持原位。如果纹理坐标在 [0, 0.33] 范围内,则sTexture1必须绘制并且纹理坐标必须从 [0, 0.33] 映射到 [0, 1]:if&nbsp;(&nbsp;vTexCoord.x&nbsp;<&nbsp;1.0/3.0&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;gl_FragColor&nbsp;=&nbsp;texture2D(sTexture1,&nbsp;vec2(vTexCoord.x&nbsp;*&nbsp;3.0,&nbsp;vTexCoord.y));如果纹理坐标在 [0.33, 0.66] 范围内,则sTexture2必须绘制并且纹理坐标必须从 [0.33, 0.66] 映射到 [0, 1]:else&nbsp;if&nbsp;(&nbsp;vTexCoord.x&nbsp;>=&nbsp;1.0/3.0&nbsp;&&&nbsp;vTexCoord.x&nbsp;<&nbsp;2.0/3.0&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;gl_FragColor&nbsp;=&nbsp;texture2D(sTexture2,&nbsp;vec2(vTexCoord.x&nbsp;*&nbsp;3.0&nbsp;-&nbsp;1.0,&nbsp;vTexCoord.y));f 纹理坐标在 [0.66, 1] 范围内,然后sTexture3必须绘制并且纹理坐标必须从 [0.66, 1] 映射到 [0, 1]:else&nbsp;if&nbsp;(&nbsp;vTexCoord.x&nbsp;>=&nbsp;2.0/3.0&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;gl_FragColor&nbsp;=&nbsp;texture2D(sTexture2,&nbsp;vec2(vTexCoord.x&nbsp;*&nbsp;3.0&nbsp;-&nbsp;2.0,&nbsp;vTexCoord.y));

蛊毒传说

gl_FragColor&nbsp;=&nbsp;texture2D&nbsp;(sTexture3,&nbsp;vec2(vTexCoord.x*2.0,&nbsp;vTexCoord.y)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^^^如果 x >= 0.5,将 x 坐标乘以 2.0 会导致值超过 1.0。如果您的采样器设置为 CLAMP_TO_EDGE(似乎是这种情况),这会导致在纹理边缘重复采样相同的纹素(这将显示为您提到的拖尾/模糊)。
打开App,查看更多内容
随时随地看视频慕课网APP