【问题标题】:Showing particular area from a texture by passing some points - OpenTK通过传递一些点来显示纹理中的特定区域 - OpenTK
【发布时间】:2021-03-16 10:19:09
【问题描述】:

使用下面的着色器代码,我可以按原样显示图像。现在我想以一种方式显示图像的各个部分:

我有三个 GL 控件。

第一个 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);

     

【问题讨论】:

    标签: opengl glsl fragment-shader opentk


    【解决方案1】:

    假设黄点不相关,并且您实际上是从 L1、L2、L3、R3、R2、R1 采样以创建双梯形形状,是的,您将能够将其映射到曲面或扭曲一个平坦的表面(沿着黄点走需要超过 6 个顶点)。编写着色器来处理这个问题可能更困难,因此请从程序的其余部分将不同的 uv 坐标传递给着色器。因此,将 GLControl 相关代码从着色器中提取出来,并使用它来确定具有不同缓冲顶点(不同 vTexCoord)的绘制调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-26
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2023-03-14
      相关资源
      最近更新 更多