使用 OpenGL 无法正确显示纹理

Textures are not being displayed right using OpenGL

所以我试图在 OpenGl 中显示一个纹理,该纹理正在旋转到鼠标,但我无法按照我想要的方式将其设置为 运行ning。首先,我尝试通过构建四边形的 2 个三角形来显示纹理。像这样:

Matrix4 modelViewMatrix =
            Matrix4.CreateScale((float)Width/Txture.Width, (float)Height/Txture.Height, 1f) *
            Matrix4.CreateRotationZ(Convert.ToSingle(LookingDir/(180/Math.PI))) *
            Matrix4.CreateTranslation((float)X_PixPos, (float)Y_PixPos, 0f);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref modelViewMatrix);


        GL.BindTexture(TextureTarget.Texture2D, Txture.ID);
        GL.Begin(PrimitiveType.Triangles);
        GL.Color4(1f, 1f, 1f, 1f);
        GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
        GL.TexCoord2(1, 1); GL.Vertex2(Txture.Width, Txture.Height);
        GL.TexCoord2(0, 1); GL.Vertex2(0, Txture.Height);

        GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
        GL.TexCoord2(1, 0); GL.Vertex2(Txture.Width, 0);
        GL.TexCoord2(1, 1); GL.Vertex2(Txture.Width, Txture.Height);
        GL.End();

但是由于它围绕不在中心的原点 (0,0) 旋转,因此它没有按预期工作。之后我试着像这样把原点放在四边形的中心:

        GL.BindTexture(TextureTarget.Texture2D, Txture.ID);
        GL.Begin(PrimitiveType.Triangles);
        GL.Color4(1f, 1f, 1f, 1f);
        GL.TexCoord2(-1f, 1f); GL.Vertex2(-Txture.Width / 2.0f, Txture.Height / 2.0f);
        GL.TexCoord2(1f, 1f); GL.Vertex2(Txture.Width / 2.0f, Txture.Height / 2.0f);
        GL.TexCoord2(1f, -1f); GL.Vertex2(Txture.Width / 2.0f, -Txture.Height / 2.0f);

        GL.TexCoord2(-1f, 1f); GL.Vertex2(-Txture.Width / 2.0f, Txture.Height / 2.0f);
        GL.TexCoord2(1f, -1f); GL.Vertex2(Txture.Width / 2.0f, -Txture.Height / 2.0f);
        GL.TexCoord2(-1f, -1f); GL.Vertex2(-Txture.Width / 2.0f, -Txture.Height / 2.0f);
        GL.End();

由于矩阵的代码保持不变,因此我将其省略在此代码片段中。这几乎按预期工作。原点在中心,纹理围绕它旋转,但它没有向我显示纹理,而是显示了 4 次。难以解释所以我得到了一张图片:Texture beeing displayed 4 times instead of once

所以我尝试用四边形绘制它,但结果相同。尴尬的是,第一次尝试是在有和没有 modelViewMatrix 的情况下正确显示。但是,如果我 运行 第二个代码或没有 modelViewMatrix 的四边形,它就会正确显示。因为我刚开始使用 OpenGl,所以我真的找不到我的错误。

如果有人想知道我正在尝试构建什么:

我正在尝试构建一个 Topdown 游戏,但我不想使用所有这些花哨的引擎,您只需将所有东西拖放到一起并得到一些东西。我想写我的一个引擎,所以我遇到了用于图形的 opentk。但是没想到渲染一个旋转到鼠标位置的贴图这么难

纹理坐标(TexCoord2)或多或少独立于实际的几何位置。它们的范围从 [0,0](左上)到 [1,1](右下)。您看到 4 个纹理,因为您告诉 OpenGL 它应该将纹理从 -1 映射到四边形上的 1。将 wrap-mode 设置为 repeat,-1 到 1 表示沿每个轴恰好有两个纹理彼此相邻。

如果你只想拥有一个纹理,那么使用从0到1的纹理坐标:

GL.TexCoord2(0, 1); GL.Vertex2(-Txture.Width / 2.0f, Txture.Height / 2.0f);
GL.TexCoord2(1, 1); GL.Vertex2(Txture.Width / 2.0f, Txture.Height / 2.0f);
GL.TexCoord2(1, 0); GL.Vertex2(Txture.Width / 2.0f, -Txture.Height / 2.0f);

GL.TexCoord2(0, 1); GL.Vertex2(-Txture.Width / 2.0f, Txture.Height / 2.0f);
GL.TexCoord2(1, 0); GL.Vertex2(Txture.Width / 2.0f, -Txture.Height / 2.0f);
GL.TexCoord2(0, 0); GL.Vertex2(-Txture.Width / 2.0f, -Txture.Height / 2.0f);