OpenGL-置换顶点着色器

OpenGL-置换顶点着色器,opengl,3d,opentk,vertex-shader,Opengl,3d,Opentk,Vertex Shader,我正在使用OpenTK wrapper和C#,并尝试使用置换顶点着色器生成3D模型 我可以运行虚拟着色器来渲染立方体和三角形,但现在我想使用纹理数据创建3D网格。第一次尝试时,我用红色和黑色创建了一个不同区域的图像(.png) 以下是纹理加载函数,仅供参考: loadImage(Bitmap image) { int texID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, texID);

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

我可以运行虚拟着色器来渲染立方体和三角形,但现在我想使用纹理数据创建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;
}

我试图实现的是,输入纹理中的红色区域显示为提升的顶点,黑色区域在“地面”级别生成顶点,但我得到的是一个完全平坦的网格,我不明白为什么。

您使用的是哪种顶点数据?我猜一个四边形有4个顶点?顶点着色器中的texcoord是您传入的,而不是插值的。光栅化发生在顶点着色器之后,另请参见。在您的例子中,我认为您需要一个几何体着色器,或者片段着色器中的每像素置换解决方案。另请参见视差贴图:我从不同来源获取顶点数据和纹理坐标。其目的是生成地形,实际上我的顶点数据有数千个基于地理坐标的顶点,纹理有高度信息。两个顶点(geocoords和texturecoords)都在[0,1]之间标准化,以便匹配和查看结果。我现在正在看视差贴图。@StarShine我对视差贴图有一些问题,看起来视差模型模拟3D细节,但我想要的是真实的3D体积。渲染模型后,我想旋转、平移、缩放等,这是在顶点上完成的。所以我不明白为什么转换是在片段着色器而不是vertexOk上完成的,如果您想要几何体,那么您可以使用几何体着色器阶段分割现有多边形,并基于采样器数据偏移顶点。但是分割(生成的顶点)的数量非常有限。另一种方法是使用openCL动态生成顶点数据,并将其绑定到openGL中。它基本上与离线生成相同,但将顶点保留在硬件上。在这两种情况下,顶点变换上的负载取决于几何体,而几何体着色器的情况并非如此。不过,几何体着色器非常慢。