OpenGL - 位移顶点着色器

时间:2014-12-15 10:53:55

标签: opengl 3d opentk vertex-shader

我正在使用OpenTK包装器和C#,并尝试使用置换顶点着色器来生成3D模型。

我可以运行dummie着色器来渲染立方体和三角形,但现在我想使用纹理数据创建一个3D网格。对于第一次尝试,我使用红色和黑色颜色创建了具有不同区域的图像(.png)。

作为参考,这是纹理加载函数:

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;
}

据我在加载纹理后的文档中读到,我绑定了两个数组(顶点位置和texcoords),并调用GL.UseProgram。我假设纹理是绑定和加载的,不是吗?

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);

顶点着色器:

#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;
}

我想要实现的是输入纹理中的红色区域显示为高架顶点,黑色区域在“地面”级别产生顶点,但我得到一个完全平坦的网格,我无法理解这是为什么。

0 个答案:

没有答案