【问题标题】:Showing particular region of texture on GLControl - openTK在 GLControl 上显示特定的纹理区域 - openTK
【发布时间】:2020-12-28 04:34:55
【问题描述】:

我必须在我的 Glcontrol 上显示一个选定的图像区域。为此,我有两个变量 LeftSideVal 和 RightSideVal。 LeftSideVal 在 0 到 0.5 的范围内,RightSideVal 在 0.5 到 1.0 的范围内。

如果我设置 LeftSideVal =0.3 和 RightSideVal=0.8,那么我必须在 GLControl 上显示 0.3 和 0.8 之间的区域,并显示其大小(视口)。

我已经尝试如下。但它不能正常工作。更改值时显示一些模糊区域。

  GL.Viewport(new Rectangle(0, 0, glControl.Width, glControl.Height));

===着色器代码===

  if( vTexCoord.x >=LeftSideVal && vTexCoord.x <=RightSideVal){      
  vec4 color=texture2D (sTexture, vec2(vTexCoord.x+LeftSideVal,vTexCoord.y)); 
  gl_FragColor=color;
  }

【问题讨论】:

    标签: c# opengl glsl opentk


    【解决方案1】:

    范围 [left side val, right side val] 是在整个屏幕上显示的纹理坐标范围。所以你需要映射它。

    在你的着色器中使用

    float s = LeftSideVal + vTexCoord.x*(RightSideVal-LeftSideVal);
    texture(sTexture, vec2(s, vTexCoord.y));
    

    严格来说,纹理坐标变换可以用另一个矩阵乘法来表示。通用版本将是

    uniform mat3 T;
    
    /* ... */
    
    texture(sTexture, (T*vec2(vTexCoord,1).xy)
    

    其中 T 设置为在 2D 中表示此变换的适当变换矩阵。

    【讨论】:

    • 现在,LeftSideVal + vTexCoord.x*(RightSideVal-LeftSideVal) 正确显示了所选区域。但它的纵横比缺失。我可以在视口上更正它吗?
    • @user2431727:嗯,要保持纵横比,您必须在 y 方向上进行相同的映射,即使用一些 BottomSideValTopSideVal。有了这些,您必须从视口方面计算它们的值。基本上你想要(RightSideVal-LeftSideVal)/(TopSideVal-BottomSideVal) == viewport_width/viewport_height
    • 可以翻转吗?当做类似纹理(sTexture,vec2(1.0 - s,vTexCoord.y))时 - 有些部分丢失了
    • @user2431727 如果你这样做 1-x 到目前为止,你只翻转你正在剪切你的小节的图像。然后,您还将在映射计算中进行翻转。然而,这归结为(如果您简化表达式,这就是结果)只是在它们通过映射之前交换左右坐标(或顶部和底部)。所以计算变成了s = RightSideVal - vTexCoord.x*(RightSideVal-LeftSideVal);。 - 从长远来看,它有助于培养对这些事情的直觉。我建议您尝试一下每个术语如何影响视觉效果。
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多