Можно ли в коде шейдера 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
}