【问题标题】:SharpGL 2D Texturing issueSharpGL 2D 纹理问题
【发布时间】:2016-10-11 16:34:04
【问题描述】:

我正在尝试使用 SharpGL 包装器使用运行时生成的纹理对三角形进行纹理处理。

我不明白为什么三角形仍然没有纹理。

gl.Error() 放入draw循环返回0,表示GL_NO_ERROR。

 private void openGLControl_OpenGLDraw(object sender, OpenGLEventArgs args)
    {

        OpenGL gl = openGLControl.OpenGL;
        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT );
        gl.LoadIdentity();
        gl.Color(1.0f,1.0f,1.0f,1.0f);
        gl.Begin(OpenGL.GL_TRIANGLES);
        gl.TexCoord(0, 1.0f);
        gl.Vertex(0.0f, 0.0f);
        gl.TexCoord(1.0f, 0f);
        gl.Vertex(1.0f, 0f);
        gl.TexCoord(1.0f, 1.0f);
        gl.Vertex(1.0f, 1.0f);
        gl.End();

    }

    private void openGLControl_OpenGLInitialized(object sender, OpenGLEventArgs args)
    {

        Random rnd = new Random();
        OpenGL gl = openGLControl.OpenGL;
        gl.ClearColor(0, 0, 0, 0);

        gl.Enable(OpenGL.GL_TEXTURE_2D);

        byte[] colors = new byte[256 * 256 * 4];

        for (int i = 0; i < 256 * 256 * 4; i++)
        {
            colors[i] = (byte)rnd.Next(256);
        }

        uint[] textureID = new uint[1];
        gl.GenTextures(1, textureID);
        gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, 256, 256, 0, OpenGL.GL_RGBA, OpenGL.GL_BYTE, colors);
        gl.BindTexture(OpenGL.GL_TEXTURE_2D, textureID[0]);

    }

【问题讨论】:

    标签: c# opengl textures sharpgl


    【解决方案1】:

    您必须先致电gl.BindTexture,然后再致电gl.TexImage2D。

    原因在于这两个函数的第一个参数。 OpenGL 有一个状态机来跟踪绑定的内容。当您调用gl.TexImage2D 时,您是在告诉GL 将像素上传到当前绑定到OpenGL.GL_TEXTURE_2D 的纹理中。 gl.BindTexture 将你生成的纹理绑定到OpenGL.GL_TEXTURE_2D。

    【讨论】:

    • 感谢参与,我试过在TexImage之前调用Bind texture,没有结果一定是别的。
    • 您发布的代码都是有效的 OpenGL,假设 SharpGL 在控件中自动进行缓冲区交换。您是否尝试过将整个纹理设为纯色进行测试?
    • 你能看到三角形吗?还有其他的GL代码吗?
    • 是的,我看到一个白色三角形。除了这两个功能之外,没有其他 GL 代码。完整代码:link 当我创建和使用位图而不是字节数组时,一切正常,但将来我想使用 3D 纹理,所以位图不适合。
    • 这只是一件小事,但在 C# 中,byte 是无符号的,所以也许 OpenGL.GL_UNSIGNED_BYTE 会是一个更好的选择,而不只是 GL_BYTE?
    【解决方案2】:

    纹理不可见的原因是缺少设置:

    uint[] array = new uint[] { OpenGL.GL_NEAREST };
            gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, array);
            gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, array);
    

    默认情况下,SharpGL 使用未生成的 MipMap。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2015-02-07
      相关资源
      最近更新 更多