OpenTK OpenGL纹理没有绘图

时间:2013-09-02 21:01:24

标签: c# opengl opentk

我遇到了在我的四边形上绘制纹理的问题,但它仍然是白色的。我查看了很多指南,但我似乎没有做任何不同的事情。

加载纹理:

        Bitmap bitmap = new Bitmap("Textures/Sprite_Can.png");

        GL.GenTextures(1, out textureID);
        GL.BindTexture(TextureTarget.Texture2D, textureID);

        BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
            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);
        bitmap.UnlockBits(data);


        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);

设置并应用正交投影:

        GL.MatrixMode(MatrixMode.Projection);

        GL.LoadIdentity();

        GL.Ortho(0, control.Width, 0, control.Height, -1, 1);
        GL.Viewport(0, 0, control.Width, control.Height);  

        GL.MatrixMode(MatrixMode.Modelview);

        GL.LoadIdentity();

        GL.ClearColor(Color4.CornflowerBlue);

最后是平局:

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);


        GL.LoadIdentity();

        GL.Translate(30, 30, 0);
        GL.BindTexture(TextureTarget.Texture2D, textureID);

        GL.Begin(BeginMode.Quads);
        GL.TexCoord2(0, 0);
        GL.Vertex2(-1 * width / 2, 1 * height / 2);

        GL.TexCoord2(1, 0);
        GL.Vertex2(1 * width / 2, 1 * height / 2);

        GL.TexCoord2(1, 1);
        GL.Vertex2(1 * width / 2, -1 * height / 2);

        GL.TexCoord2(0, 1);
        GL.Vertex2(-1 * width / 2, -1 * height / 2);
        GL.End();

        GL.Flush();
        control.SwapBuffers();

所以基本上,四边形画得很好。但是,不会渲染纹理。结果,我所拥有的只是一个白色方块。

1 个答案:

答案 0 :(得分:3)

在固定功能OpenGL管道中,在绑定到一个纹理的纹理将应用于您绘制的任何内容之前,还必须Enable纹理单位。

正常的OpenGL API绑定是glEnable (GL_TEXTURE_2D)。 OpenTK等效项为:GL.Enable (EnableCap.Texture2D)