#c# #opengl #glsl #fragment-shader #opentk
#c# #opengl #glsl #фрагмент-шейдер #opentk
Вопрос:
У меня есть ползунок, значения которого варьируются от нуля до единицы. Теперь, используя значение этого ползунка, я хочу обрезать изображение снизу до половины изображения и сверху до половины изображения. Я выполнил первую (обрезку снизу), изменив размер высоты GLControl. Не уверен, что это правильный способ добиться этого. Но он работает нормально. Я понятия не имею о втором варианте (обрезка сверху до половины изображения). Пожалуйста, помогите получить его. Прилагаются выходные данные, которые я получил при выполнении нижней обрезки со значениями 0,0,4,1,0 соответственно.
int FramereHeight = (glControl2.Height / 2) / 10; // crop the middle camera upto half of it's height
if (NumericUpdownMiddleBottomCropVal != 0.0)//value ranges from zero to one
{
glControl2.Height = glControl2.Height - Convert.ToInt32(NumericUpdownMiddleBottomCropVal * 10 * FramereHeight);
}
public void CreateShaders()
{
/***********Vert Shader********************/
vertShader = GL.CreateShader(ShaderType.VertexShader);
GL.ShaderSource(vertShader, @"attribute vec3 a_position;
varying vec2 vTexCoord;
void main() {
vTexCoord = (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;varying vec2 vTexCoord;
uniform float sSelectedCropVal;
uniform float sSelectedTopCropVal;uniform float sSelectedBottomCropVal;
void main ()
{
if (abs(vTexCoord.y-0.5) * 2.0 > 1.0 - 0.5*sSelectedCropVal)
discard;
vec4 color = texture2D (sTexture_2, vec2(vTexCoord.x, vTexCoord.y));
gl_FragColor =color;
}"); GL.CompileShader(fragShader);
}
Ответ №1:
Я предполагаю, что sSelectedCropVal
это находится в диапазоне [0.0, 1.0].
Вы можете discard
обрезать фрагменты в зависимости от v corodiante:
if ((0.5 - vTexCoord.y) * 2.0 > 1.0-sSelectedCropVal)
discard;
if ((vTexCoord.y - 0.5) * 2.0 > 1.0-sSelectedBottomCropVal)
discard;
Полный шейдер:
precision highp float;
uniform sampler2D sTexture_2;varying vec2 vTexCoord;
uniform float sSelectedCropVal;
uniform float sSelectedTopCropVal;uniform float sSelectedBottomCropVal;
void main ()
{
if ((0.5 - vTexCoord.y) * 2.0 > 1.0-sSelectedCropVal)
discard;
if ((vTexCoord.y - 0.5) * 2.0 > 1.0-sSelectedBottomCropVal)
discard;
vec4 color = texture2D(sTexture_2, vTexCoord.xy);
gl_FragColor = color;
}
Комментарии:
1. Пожалуйста, смотрите мой вывод при установке sSelectedCropVal= 1.0. Теперь обрезка одновременно снизу и сверху изображения до одной четверти изображения. Могу ли я сделать это отдельно для большего удобства? Когда sSelectedBottomCropVal= 1.0 , пользователь может видеть только первую половину изображения. И когда sSelectedTopCropVal= 1.0 пользователь может видеть только вторую половину изображения. И когда оба = 1.0, все изображение будет удалено.
2. @user2431727 Я изменил ответ.
3. Спасибо за быстрый ответ. Я изменил, как показано ниже, чтобы получить то, на что я был нацелен в вопросе. если ((0.5 — vTexCoord.y) * 2.0 > (1.0-sSelectedBottomCropVal)) отбросить; если ((vTexCoord. y — 0.5) * 2.0 > (1.0-sSelectedTopCropVal)) отбросить;