#opengl #glsl #fragment-shader #opentk
#opengl #glsl #фрагмент-шейдер #opentk
Вопрос:
Используя приведенный ниже код шейдера, я могу показать изображение таким, какое оно есть. Теперь я хочу показать части изображения таким образом, чтобы :
У меня есть три GLcontrols.
Сначала glcontrol должен отображать первую часть изображения на треть в изогнутой форме, как показано на рисунке. Итак, я должен передать три точки L1, L2, L3 и должен показать эти связанные области на нем.
И второй glcontrol должен показывать последнюю часть изображения на треть в изогнутой форме. Для этого я должен передать точки R1, R2, R3.
И третий glcontrol должен показывать оставшуюся центральную часть изображения.
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;
varying vec2 vTexCoord;
uniform int sCurrentGLControl;
uniform int L1;
uniform int L2;
uniform int L3;
uniform int R1;
uniform int R2;
uniform int R3;
void main ()
{
vec4 color;
if(sCurrentGLControl==1) //first half
{
color = texture2D (sTexture, vec2(vTexCoord.x, vTexCoord.y));
}
else if(sCurrentGLControl==2) //third half
{
color = texture2D (sTexture, vec2(vTexCoord.x, vTexCoord.y));
}
else if(sCurrentGLControl==3) //second half
{
color = texture2D (sTexture, vec2(vTexCoord.x, vTexCoord.y));
}
gl_FragColor =color;
}"); GL.CompileShader(fragShader);
Ответ №1:
Предполагая, что желтые точки не имеют значения, и вы фактически выполняете выборку из L1, L2, L3, R3, R2, R1 для создания двойной трапециевидной формы, да, вы сможете отобразить это на изогнутую поверхность или деформированную на плоской поверхности (для прохождения по желтым точкам потребуется больше, чем6 вершин). Вероятно, сложнее написать свой шейдер для обработки этого, поэтому вместо этого передайте шейдеру разные uv-координаты из остальной части вашей программы. Поэтому извлеките связанный с GLControl код из шейдеров и используйте его для определения вызовов рисования с разными буферизованными вершинами (разные координаты vTexCoord).