Можем ли мы разделить текстуру на две равные части в коде шейдера - c# openTK - PullRequest
0 голосов
/ 03 августа 2020

Можно ли в коде шейдера opengl разделить изображение на две равные части? В определенных условиях мне нужно управлять только первой или второй половиной текстуры.

Используя приведенный ниже код, я могу выполнить проекцию и обрезку всего изображения (sTexture). Теперь я хочу выполнить те же операции, проверив значение IsSelectFirstHalf. Если IsSelectFirstHalf = 1.0, то я хочу выполнить те же операции с первой половиной sTexture (которая должна быть sTexture_FirstHalf). В противном случае на SecondHalf изображения (sTexture_SecondHalf).

      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;   
    uniform sampler2D sTexture_FirstHalf;  
    uniform sampler2D sTexture_SecondHalf; 
    varying vec2 vTexCoordIn;
    uniform float IsSelectFirstHalf;
    uniform float sSelectedCropVal;
    uniform float sSelectedRangeProjection;
    uniform float sSelectedRangeProjectionHorizontal;
    void main ()
    {

vec2  pos  = vTexCoordIn.xy* 2.0 - 1.0;
float b    = sSelectedRangeProjection;//0.5;
float b_Horizontal=sSelectedRangeProjectionHorizontal;//0.5;
float u ;
float v;
float scale = (1.0 + b) / (1.0 + b * sqrt(1.0 - pos.x*pos.x));
float scale_Hriznl = (1.0 + b_Horizontal) / (1.0 + b_Horizontal * sqrt(1.0 - pos.y*pos.y));
u = (pos.x * scale_Hriznl) * 0.5 + 0.5;
v=(pos.y * scale) * 0.5 + 0.5;

 if ( v < 0.0 || v > 1.0 || u < 0.0 || u > 1.0 )
       { 
          discard;
       }

   float c  = sSelectedCropVal;
    if (abs(pos.y) * (1.0 + c) > 1.0){
        discard;}
   if (abs(pos.x) * (1.0 + c) > 1.0){
        discard;}

   vec4  color_NewFrame = texture2D (sTexture, vec2(u, v));
   gl_FragColor = color_NewFrame;

 }");
        GL.CompileShader(fragShader);
    }
}

Используя Viewport, я могу отображать первую половину и вторую половину с тем же кодом шейдера, что и выше. Но тогда проецирование и кадрирование не работают должным образом. Итак, я спрашиваю, можно ли разделить текстуру в коде шейдера. Затем я могу использовать тот же код шейдера, что и выше.

  if(IsSelectFirstHalf==1.0)//D1 F1
            {   
                GL.Viewport(new Rectangle(0, 0, glControl.Width * 2, glControl.Height));//FirstHalf
             }
            else 
            {
       GL.Viewport(new Rectangle(-glControl.Width, 0, glControl.Width * 2, glControl.Height));//second half
            }
...