title: OpenGL - displacement vertex shader
body: <p>I'm working with OpenTK wrapper and C# and trying to use displacement vertex shaders to generate 3D models.</p>
  
  <p>I can run dummie shaders to render cubes and triangles, but now I want to create a 3D grid using texture data. For first attempts I created an image (.png) with different areas using red and black colors.</p>
  
  <p>For reference, here is the texture-loading function:</p>
  
  <pre><code>loadImage(Bitmap image)
  {
        int texID = GL.GenTexture();
  
        GL.BindTexture(TextureTarget.Texture2D, texID);
        System.Drawing.Imaging.BitmapData data = image.LockBits(new System.Drawing.Rectangle(0, 0, image.Width, image.Height),
        System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  
        GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
        OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
  
        image.UnlockBits(data);
  
        GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
  
        return texID;
  }
  </code></pre>
  
  <p>As far as I read in documentation after loading the texture, I bind both arrays (vertex position and texcoords), and call GL.UseProgram. I assume then the texture is binded and loaded, isn't it?</p>
  
  <pre><code>GL.ActiveTexture(TextureUnit.Texture0);
  GL.BindTexture(TextureTarget.Texture2D, objects[0].TextureID);
  int loc = GL.GetUniformLocation(shaders[activeShader].ProgramID, "maintexture");
  GL.Uniform1(loc, 0);
  
  GL.UniformMatrix4(shaders[activeShader].GetUniform("modelview"), false, ref objects[0].ModelViewProjectionMatrix);
  </code></pre>
  
  <p>vertex shader: </p>
  
  <pre><code>#version 330
  
  in  vec3 vPosition;
  in vec2 texcoord;
  out vec2 f_texcoord;
  
  uniform mat4 modelview;
  uniform sampler2D maintexture;
  
  void
  main()
  {       
      vec3 newPos = vPosition;
  
      newPos.y += texture(maintexture, texcoord).r;
      gl_Position = modelview * (vec4(newPos, 1.0) );    
      f_texcoord = texcoord;
  }
  </code></pre>
  
  <p>What I'm trying to achieve is that the red areas in the input texture appear as elevated vertices, and black areas produce vertices at 'ground' level, but I'm getting a perfectly flat grid and I can't understand why.</p>