Показать половину изображения рядом друг с другом на двух отдельных элементах glcontrols - openTK - PullRequest
0 голосов
/ 24 июня 2019

У меня есть одна текстура и два glControls. Мне нужно показать первую половину текстуры на glControl2 и вторую половину текстуры на glControl1. А также я поместил два числовых элемента управления downdown в левый конец текстуры (в диапазоне от 0 до 0,5) и еще два числовых элемента управления downdown в правый конец текстуры (в диапазоне от 0,5 до 1,0). Когда я выбираю 0. 4 и 0. 5 на левом конце текстуры, я должен показать область между 0. 4 и 0. 5 на glControl2. И если я выберу 0,8 и 1 на правом конце текстуры, я должен показать область от 0,8 до 1,0 на glControl1. Я пытался, как, ссылаясь на эту ссылку . Но не получается правильно.

       public 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, @"precision highp float;

    uniform sampler2D sTexture_2;
    uniform float sSelectedRangeLeft;   
    uniform float sSelectedRangeRight;
    uniform float sSelectedRangeLeftEnd;   
    uniform float sSelectedRangeRightEnd;
    uniform int sCurrentGLControl;
    varying vec2 vTexCoordIn;
    void main ()
    {

vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);

float rightsliderStartval=sSelectedRangeRight;//0.5 to 1.0
float rightsliderEndval=sSelectedRangeRightEnd;//1.0 to 0.5
float rightsliderDelta=rightsliderEndval-rightsliderStartval;

float leftsliderStartval=sSelectedRangeLeftEnd;//0.0 to 0.5
float leftsliderEndval=sSelectedRangeLeft;//0.5 to 0.0
float leftsliderDelta=leftsliderEndval-leftsliderStartval;

 if(sCurrentGLControl==1)//GLControl1
 {
 vec4 colorLeft= texture2D(sTexture_2, vec2((0.5+vTexCoord.x)-(0.5-rightsliderStartval)-(1.0-rightsliderEndval), vTexCoord.y));
 gl_FragColor = colorLeft;

}
 else if(sCurrentGLControl==2) //GLControl2
 {  
 vec4 colorRight= texture2D(sTexture_2, vec2(((vTexCoord.x-0.75)*2.0) +(leftsliderStartval), vTexCoord.y));
 gl_FragColor = colorRight;  
 }
 }");
        GL.CompileShader(fragShader);
    }

1 Ответ

0 голосов
/ 25 июня 2019

Вместо условной логики в шейдере гораздо проще создать 2 элемента управления и переместить геометрию (или изменить порт просмотра / камеру) в соответствии с ограничениями.

enter image description here

Обновление Я предлагаю следующий подход для выполнения вашей задачи:

  • Создание 2 прямоугольников, представляющих область полного обзора каждый
  • В обработчике Paint каждого glControl
    • Положение / масштабирование прямоугольника или настройка порта просмотра (камеры) в соответствии со значениями в в соответствующих средствах управления обновлением
    • Применить шейдер
    • Нарисуйте прямоугольник
...