2017-03-03 190 views
-1

所以我想,以显示其beeing roated鼠标OpenGL中的纹理,但我不能得到它运行我想要的方式。首先,我尝试通过构建Quad的2个三角形显示纹理。像这样:纹理不显示正确使用OpenGL

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,因此我无法真正发现我的错误。

如果有人想知道什么,我试图建立:

我想建立一个自上而下的比赛,但我不想使用所有这些花哨的引擎,你只需拖放所有你的东西togther并得到有些东西。我想写我的一个引擎,所以我碰到opentk图形。但我并没有想到渲染一个旋转到鼠标位置的纹理会非常困难。

回答

0

纹理坐标(TexCoord2)是实际的几何位置的或多或少的独立。它们的范围从[0,0](左上角)到[1,1](右下角)。您会看到4个纹理,因为您告诉OpenGL它应该将四边形上的纹理从-1映射到1。通过设置为重复的包络模式,-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); 
+0

非常感谢您的帮助。它直接向我展示了我的下一个问题。好像旋转是由物体的位置的影响,当我移动对象保持poiting对小鼠但在某些时候它变成太多,不停止转动。 – ZulluF