在 C# 和 openGL 中使用一维纹理为高度图着色
Coloring a heightmap with 1D texture in C# and openGL
我被困在这两天了。我有一个高度图,可以很好地绘制。顶点存储在 Vector3 中,x 和 z 规则间隔,高度为 y。我想根据从 0 到 1 不等的高度为顶点着色;
我正在使用 opengl4CSharp 库。我在这里是一个完全的初学者,我看到的每个例子都是针对 C++ 和 2D 纹理的。所以这就是我到目前为止所拥有的。我确定我遗漏了一些命令或做错了事。
我为纹理定义了一个字节数组
byte[] data = new byte[]
{
255, 000, 000,
000, 255, 000,
000, 000, 255
};
然后我定义各种opengl参数如下:
Gl.Enable(EnableCap.Texture1D);
Gl.PixelStorei(PixelStoreParameter.UnpackAlignment, 1);
// Create a texture name
var textureID = Gl.GenTexture();
IntPtr myTexturePtr = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, myTexturePtr, data.Length);
// Marshal.FreeHGlobal(myTexturePtr);
Gl.BindTexture(TextureTarget.Texture1D, textureID);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureWrapS, TextureParameter.Repeat);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureWrapT, TextureParameter.Repeat);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureMinFilter, TextureParameter.Linear);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureMagFilter, TextureParameter.Linear);
Gl.TexImage1D(TextureTarget.Texture1D, 0, PixelInternalFormat.Three, 3, 0, PixelFormat.Rgb, PixelType.UnsignedByte, myTexturePtr);
接下来我执行以下操作,但我在这些步骤上挂断了...我在 samplerLocation 上遇到错误,尤其是程序参数。那应该是什么?着色器程序?
uint samplerLocation = Gl.GetUniformLocation(plottingProgram, "ColorRamp");
Gl.Uniform1i(samplerLocation, 0);
Gl.ActiveTexture(TextureUnit.Texture0);
Gl.BindTexture(TextureTarget.Texture1D, textureID);
这是着色器
public static string VertexShader = @"
#version 130
layout(location = 0) in vec3 vertexPosition;
out float height;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main(void)
{
height = vertexPosition.y;
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
public static string FragmentShader = @"
#version 130
uniform sampler1D colorRamp;
in float height;
out vec4 FragColor;
void main(void)
{
FragColor = texture(colorRamp, height).rgba;
}
";
有人可以帮忙吗?谢谢
您可以像这样创建一个指向您的 byte[]
的指针:
IntPtr myTexturePtr = Marshal.AllocHGlobal(myTexture.Length);
Marshal.Copy(myTexture, 0, myTexturePtr, myTexture.Length);
那么您应该可以通过 myTexturePtr
代替您当前尝试通过 myTexture
的地方。
Gl.TexImage1D(TextureTarge
t.Texture1D, 0,
PixelInternalFormat.Three, 3, 0,
PixelFormat.Rgb, PixelType.UnsignedByte,
myTexturePtr);
然后,完成后释放指针。
Marshal.FreeHGlobal(myTexturePtr);
我被困在这两天了。我有一个高度图,可以很好地绘制。顶点存储在 Vector3 中,x 和 z 规则间隔,高度为 y。我想根据从 0 到 1 不等的高度为顶点着色; 我正在使用 opengl4CSharp 库。我在这里是一个完全的初学者,我看到的每个例子都是针对 C++ 和 2D 纹理的。所以这就是我到目前为止所拥有的。我确定我遗漏了一些命令或做错了事。 我为纹理定义了一个字节数组
byte[] data = new byte[]
{
255, 000, 000,
000, 255, 000,
000, 000, 255
};
然后我定义各种opengl参数如下:
Gl.Enable(EnableCap.Texture1D);
Gl.PixelStorei(PixelStoreParameter.UnpackAlignment, 1);
// Create a texture name
var textureID = Gl.GenTexture();
IntPtr myTexturePtr = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, myTexturePtr, data.Length);
// Marshal.FreeHGlobal(myTexturePtr);
Gl.BindTexture(TextureTarget.Texture1D, textureID);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureWrapS, TextureParameter.Repeat);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureWrapT, TextureParameter.Repeat);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureMinFilter, TextureParameter.Linear);
Gl.TexParameteri(TextureTarget.Texture1D, TextureParameterName.TextureMagFilter, TextureParameter.Linear);
Gl.TexImage1D(TextureTarget.Texture1D, 0, PixelInternalFormat.Three, 3, 0, PixelFormat.Rgb, PixelType.UnsignedByte, myTexturePtr);
接下来我执行以下操作,但我在这些步骤上挂断了...我在 samplerLocation 上遇到错误,尤其是程序参数。那应该是什么?着色器程序?
uint samplerLocation = Gl.GetUniformLocation(plottingProgram, "ColorRamp");
Gl.Uniform1i(samplerLocation, 0);
Gl.ActiveTexture(TextureUnit.Texture0);
Gl.BindTexture(TextureTarget.Texture1D, textureID);
这是着色器
public static string VertexShader = @"
#version 130
layout(location = 0) in vec3 vertexPosition;
out float height;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main(void)
{
height = vertexPosition.y;
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
public static string FragmentShader = @"
#version 130
uniform sampler1D colorRamp;
in float height;
out vec4 FragColor;
void main(void)
{
FragColor = texture(colorRamp, height).rgba;
}
";
有人可以帮忙吗?谢谢
您可以像这样创建一个指向您的 byte[]
的指针:
IntPtr myTexturePtr = Marshal.AllocHGlobal(myTexture.Length);
Marshal.Copy(myTexture, 0, myTexturePtr, myTexture.Length);
那么您应该可以通过 myTexturePtr
代替您当前尝试通过 myTexture
的地方。
Gl.TexImage1D(TextureTarge
t.Texture1D, 0,
PixelInternalFormat.Three, 3, 0,
PixelFormat.Rgb, PixelType.UnsignedByte,
myTexturePtr);
然后,完成后释放指针。
Marshal.FreeHGlobal(myTexturePtr);