2016-12-25 4 views
0

저는 최근에 OpenTK로 작업하기 시작했습니다. 그리고 언제나처럼 OpenGL을 사용하기 때문에 설정에 좌절감을 느낍니다. 내 코드는 지금 당장 다소 혼란 스럽지만 누구나이 정사영 투영을 사용하여 출력이 왜 공백 (배경색)인지 알 수 있습니까?직교 투영이 아무 것도 표시하지 않는 이유는 모르겠지만 아무도 도와 줄 수 있습니까? (OpenTK)

Render() 함수에 대한 외부 호출은 작동하며 현재 출처를 중심으로 쿼드를 렌더링합니다. 코드에서 원근감 투영 예제를 사용하면 형상이 표시되지만 이는 내 목표가 아닙니다.

쉐이더에 대한 정보를 무시합니다. 실제로는 실제로 사용되지 않습니다. 당신이 직교 카메라를 원하는 경우

using OpenTK; 
using OpenTK.Graphics; 
using OpenTK.Graphics.OpenGL; 
using OpenTK.Input; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Genesis 
{ 
    class Game : GameWindow 
    { 
     public static Game Inst; 

     public Matrix4 ModelViewMatrix; 
     public Matrix4 ProjectionMatrix; 

     private int ShaderProgram; 

     private int VertexShader; 
     private int FragmentShader; 

     float rot = 0; 

     public GameObject Selector; 

     public Multiblock BaseIsland; 

     private List<GameObject> gameObjects = new List<GameObject>(); 

     public Game() 
      : base(1000, 650, GraphicsMode.Default, Strings.WINDOW_TITLE) 
     { 
      VSync = VSyncMode.On; 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      GL.ClearColor(0.0f, 0.8f, 0.8f, 0.0f); 

      GL.Enable(EnableCap.Texture2D); 

      GL.Enable(EnableCap.Blend); 
      GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); 

      GL.Enable(EnableCap.DepthTest); 

      ShaderProgram = GL.CreateProgram(); 

      VertexShader = GL.CreateShader(ShaderType.VertexShader); 
      GL.ShaderSource(VertexShader, ShaderSource.Vertex_Default); 
      GL.CompileShader(VertexShader); 

      FragmentShader = GL.CreateShader(ShaderType.FragmentShader); 
      GL.ShaderSource(FragmentShader, ShaderSource.Fragment_Default); 
      GL.CompileShader(FragmentShader); 

      GL.LinkProgram(ShaderProgram); 

      //GL.UseProgram(ShaderProgram); 

      Assets.Init(); 
      Blocks.Init(); 

      //INIT 
      BaseIsland = new Multiblock("Base Island", 7, 7); 
      for(int x = 2; x <= 4; x++) 
      { 
       BaseIsland.SetBlock(x, 0, Blocks.BLOCK_DIRT); 
      } 
      for (int x = 1; x <= 5; x++) 
      { 
       BaseIsland.SetBlock(x, 1, Blocks.BLOCK_DIRT); 
      } 
      for (int x = 0; x < 7; x++) 
      { 
       BaseIsland.SetBlock(x, 2, Blocks.BLOCK_GRASS); 
      } 
      for (int y = 3; y < 7; y++) 
      { 
       BaseIsland.SetBlock(3, y, Blocks.BLOCK_STONE); 
      } 
      BaseIsland.SetBlock(2, 5, Blocks.BLOCK_STONE); 
      BaseIsland.SetBlock(4, 5, Blocks.BLOCK_STONE); 

      Selector = new GameObject(Assets.UI_SELECTOR); 
     } 

     protected override void OnResize(EventArgs e) 
     { 
      base.OnResize(e); 

      GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height); 

      //ProjectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI/4, Width/(float)Height, 1.0f, 64.0f); 
      ProjectionMatrix = Matrix4.CreateOrthographic(Width, Height, 1.0f, 100.0f); 
      Console.WriteLine(ProjectionMatrix); 
      GL.MatrixMode(MatrixMode.Projection); 
      GL.LoadIdentity(); 
      GL.LoadMatrix(ref ProjectionMatrix); 
     } 

     protected override void OnUpdateFrame(FrameEventArgs e) 
     { 
      base.OnUpdateFrame(e); 

      if (Keyboard[Key.Escape]) 
       Exit(); 

      //TileSelection sel = Input.GetSelectedTile(); 

      Vector2 mousePos = Input.GetMousePosition(); 
      float sx = (mousePos.X * Constants.GLOBAL_SCALE)/(Constants.PIXELS_PER_UNIT * 0.83f); 
      float sy = (mousePos.Y * Constants.GLOBAL_SCALE)/(Constants.PIXELS_PER_UNIT * 0.83f); 
      Selector.Transform.SetPosition(sx, sy); 

      //Console.WriteLine("ProjectionMatrix"); 
      //Console.WriteLine(ProjectionMatrix); 

      rot = (rot + 1.0f) % 360; 
      Console.WriteLine(rot); 
     } 

     protected override void OnRenderFrame(FrameEventArgs e) 
     { 
      base.OnRenderFrame(e); 

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

      ModelViewMatrix = Matrix4.LookAt(Vector3.Zero, -Vector3.UnitZ, Vector3.UnitY); 
      GL.MatrixMode(MatrixMode.Modelview); 
      GL.LoadIdentity(); 
      GL.LoadMatrix(ref ModelViewMatrix); 

      GL.Rotate(rot, 0, 1, 0); 
      GL.Translate(0, 0, -5); 
      GL.Scale(Constants.GLOBAL_SCALE, Constants.GLOBAL_SCALE, 1); 

      //GL.UseProgram(ShaderProgram); 

      for (int i = gameObjects.Count - 1; i >= 0; i--) 
      { 
       GL.PushMatrix(); 

       gameObjects[i].Render(); 

       GL.PopMatrix(); 

      } 

      SwapBuffers(); 
     } 

     public void OnGameObjectCreated(GameObject obj) 
     { 
      gameObjects.Add(obj); 

      Console.WriteLine("GAMEOBJECT CREATED: " + obj.Name + " - " + obj.Texture); 
     } 

     public void OnGameObjectDestroyed(GameObject obj) 
     { 
      gameObjects.Remove(obj); 
     } 

     [STAThread] 
     static void Main() 
     { 
      using (Game game = new Game()) 
      { 
       Game.Inst = game; 
       game.Run(30.0); 
       Game.Inst = null; 
      } 
     } 
    } 
} 
+0

분명히하기 위해, 나는 기하학이 여전히 어딘가에 렌더링되고 있다는 것을 안다. 뷰포트 내에 형상이 나타나도록 (올바르게 변형 된) 형상을 올바르게 구성하는 방법을 모르겠습니다. – Arkathorn

답변

-1

, 당신은 Inspector에서 카메라 속성을 변경해야합니다.

+0

자세히 설명해 주시겠습니까? 내가 유니티를 사용하고 있다고 생각하는 것처럼 들리지만 그렇지 않습니다. Visual Studio 용 그래픽 프레임 워크 인 OpenTK를 사용하고 있습니다. 응용 프로그램은 그래픽 IDE 구성이 아닌 코드로만 컴파일됩니다. – Arkathorn

관련 문제