在C#和openGL中使用1D纹理着色高度图

时间:2017-01-13 22:08:00

标签: c# opengl textures fragment-shader

我被困在这两天了。我有一张高度好的地图。顶点存储在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;
    }
    ";

有人可以帮忙吗?感谢

1 个答案:

答案 0 :(得分:1)

您可以像这样创建指向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);