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