使用OpenGL无法正确显示纹理

时间:2017-03-03 09:08:45

标签: c# opengl textures opentk

所以我试图在OpenGl中显示一个纹理,但是我无法按照我想要的方式运行它。首先,我尝试通过2个构成Quad的三角形来显示纹理。像这样:

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)旋转,它不在中心,它不能按预期工作。之后,我尝试将原点放入Quad的中心,如下所示:

        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的图形。但我并没有想到渲染一个旋转到鼠标位置的纹理会很难。

1 个答案:

答案 0 :(得分:0)

纹理坐标(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);