并排显示图像的一半-OpenGL

时间:2018-11-22 11:17:39

标签: c# opengl glsl opentk

我为两个图像创建了两个纹理。现在,我想在opengl中以image2的左侧部分,完整的image1和image2的右侧部分的顺序显示此纹理。我已经做了如下。 Image1显示在opengl屏幕的中央。但是屏幕的左右部分不正确(应该分别显示image2的左部分和image2的右部分)

顶点着色器:

attribute vec3 a_position;
varying vec2 vTexCoord;
void main() {
    vTexCoord = (a_position.xy + 1) / 2;
    gl_Position = vec4(a_position,1);
}

片段着色器:

precision highp float;
uniform sampler2D sTexture;//texture for image 1
uniform sampler2D sTexture1;//texture for image 2
varying vec2 vTexCoord;

void main () {
    if ( vTexCoord.x<=0.25 )
        gl_FragColor = texture2D (sTexture1, vec2(vTexCoord.x/2.0, vTexCoord.y));
    else if ( vTexCoord.x>0.25 && vTexCoord.x<0.75 )
        gl_FragColor = texture2D (sTexture, vec2(vTexCoord.x*2.0, vTexCoord.y));
    else if(vTexCoord.x>=0.75 )
        gl_FragColor = texture2D (sTexture1,  vec2(vTexCoord.x*2.0-1.0, vTexCoord.y));
}

编译着色器:

void CreateShaders() {
    /***********Vert Shader********************/
    vertShader = GL.CreateShader(ShaderType.VertexShader);
    GL.ShaderSource(vertShader, vertexShaderSource);
    GL.CompileShader(vertShader);

    /***********Frag Shader ****************/
    fragShader = GL.CreateShader(ShaderType.FragmentShader);
    GL.ShaderSource(fragShader, fragmentShaderSource);
    GL.CompileShader(fragShader);
}

1 个答案:

答案 0 :(得分:2)

  

我想在opengl中以 image2 的左侧部分,完整的 image1 image2 右侧的顺序显示纹理>

如果纹理坐标小于0.25,则要显示 image2 的范围[0,0.5]。您必须将纹理坐标的x分量从[0.0,0.25]映射到[0,0.5]:

vec2( vTexCoord.x*2.0, vTexCoord.y );

如果纹理坐标是刨丝器,那么您想显示 image2 的范围[0.5,1]。您必须将纹理坐标的x分量从[0.75,1.0]映射到[0.5,1.0]:

vec2( (vTexCoord.x-0.75)*2.0 + 0.5, vTexCoord.y );

vec2( vTexCoord.x*2.0 - 1.0, vTexCoord.y );

如果纹理坐标大于0.25且小于0.75,则您要显示 image1 的整个范围。您必须将纹理坐标的x分量从[0.25,0.75]映射到[0.0,1.0]:

vec2( vTexCoord.x*2.0 - 0.5, vTexCoord.y );

着色器代码如下所示

precision highp float;
uniform sampler2D sTexture;//texture for image 1
uniform sampler2D sTexture1;//texture for image 2
varying vec2 vTexCoord;

void main ()
{
    float u = vTexCoord.x*2.0;
    float a = 0.0; 
    if( vTexCoord.x > 0.75 )
    {
       u -= 1.0;
    }
    else if ( vTexCoord.x >= 0.25 )
    { 
       u -= 0.5;
       a  = 1.0;
    }

    vec4 color1 = texture2D(sTexture1, vec2(u, texCoord.y));
    vec4 color2 = texture2D(sTexture,  vec2(u, texCoord.y));

    gl_FragColor = mix(color2, color1, a);
}

答案的扩展名:

  

如果我只想显示右图像的一部分,例如(0.6,0.8)。

您要将[0.75,1.0]映射到[0.6,0.8]:

  1. [0.75,1.0]至[0,1]:u' = (u-0.75)/0.25

  2. [0,1]至[0.6,0.8]:u'' = u'*0.2+0.6

这导致:

u = (vTexCoord.x-0.75)*0.2/0.25 + 0.6;
  

当将[0.75,1.0]映射到[0.6,0.8]时,我希望用黑白显示[0.75,1.0]的其余部分。使用(vTexCoord.x-0.75)* 0.2 / 0.25 + 0.6图像时,将[.6,.8]部分填充为[0.75,1.0]

您必须将RGB颜色转换为灰度。我建议对Relative luminance使用公式:

float grayscale = dot(color1, vec3(0.2126, 0.7152, 0.0722));
color1.rgb      = vec3(grayscale);