0

我在四边形上绘制纹理时遇到问题,但它仍然是白色的。我浏览了许多指南,我似乎没有做任何与他们不同的事情。

加载纹理:

        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();

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

4

1 回答 1

3

在固定功能的 OpenGL 管道中,您还必须先将Enable纹理单元绑定到一个纹理单元,然后才能将其应用于您绘制的任何内容。

正常的 OpenGL API 绑定是glEnable (GL_TEXTURE_2D). OpenTK 等价物是:GL.Enable (EnableCap.Texture2D).

于 2013-09-02T21:18:26.480 回答