Отображение трех текстур одинаково на элементе управления openGL - OpenTK C # - PullRequest
1 голос
/ 14 марта 2019

У меня есть три текстуры, которые должны отображаться на элементе управления opengl таким образом, чтобы эти три были в нем одинаково.Значит texture1 должен быть в 0 до 0.33 от glcontrol.И 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);
    }

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Означает, что texture1 должен быть от 0 до 0.33 от glcontrol. И 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));

f если координаты текстуры находятся в диапазоне [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));
0 голосов
/ 14 марта 2019
gl_FragColor = texture2D (sTexture3, vec2(vTexCoord.x*2.0, vTexCoord.y));
                                                     ^^^^

Умножение x-координаты на 2.0 приводит к значениям, превышающим 1.0, если x> = 0.5. Если ваш сэмплер настроен на CLAMP_TO_EDGE (что, кажется, имеет место), это приводит к многократной выборке одного и того же текселя на краю текстуры (который будет выглядеть как размытие / размытие, как вы упомянули).

...