2014-05-14 2 views
0

Giawa 자습서 번호 1-5를 기반으로하는 OpenGl 프로그램이 있습니다. 기본적으로 이미지를 만들어 화면에 표시하고 회전시킵니다. 달성하고자하는 것은 키보드 이벤트를 추가하여 이미지의 특정 매개 변수를 변경하는 것입니다. 내가 F6 키를 눌러 수행 할 때KeyPress로 인해 이미지 이동이 멈 춥니 다.

using System; 
using Tao.FreeGlut; 
using OpenGL; 
using System; 
using System.Windows; 
using System.Windows.Forms; 

namespace OpenGLTutorial5 
{ 
    class Program 
    { 
     private static int width = 640, height = 480; 
     private static ShaderProgram program; 

     private static VBO<Vector3> top_pyramid, cube, bottom_pyramid; 
     private static VBO<Vector3> top_pyramidColor, cubeColor, bottom_pyramidColor; 
     private static VBO<int> top_pyramidElements, cubeElements, bottom_pyramidElements; 

     private static System.Diagnostics.Stopwatch watch; 
     private static float angle; 
     private static int rotate = 1; 

     static void Main(string[] args) 
     { 
      // create an OpenGL window 
      Glut.glutInit(); 
      Glut.glutInitDisplayMode(Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH); 
      Glut.glutInitWindowSize(width, height); 
      Glut.glutCreateWindow("OpenGL Tutorial"); 

      // provide the Glut callbacks that are necessary for running this tutorial 
      Glut.glutIdleFunc(OnRenderFrame); 
      Glut.glutDisplayFunc(OnDisplay); 
      // Glut.glutKeyboardFunc(new Glut.KeyboardCallback(OnKeyPress)); 
      Glut.glutSpecialFunc(new Glut.SpecialCallback(OnKeyPress)); 
      Glut.glutCloseFunc(OnClose); 

      // enable depth testing to ensure correct z-ordering of our fragments 
      Gl.Enable(EnableCap.DepthTest); 

      // compile the shader program 
      program = new ShaderProgram(VertexShader, FragmentShader); 

      // set the view and projection matrix, which are static throughout this tutorial 
      program.Use(); 
      program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width/height, 0.1f, 1000f)); 
      program["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(10, 0, 10), Vector3.Zero, Vector3.Up)); 


      top_pyramid = new VBO<Vector3>(new Vector3[] 
      { 
       new Vector3(-1.5, 0, -0.5), new Vector3(-0.5, 1, -0.5), new Vector3(0, 0, -1.5), 
       new Vector3(-0.5, 1, -0.5), new Vector3(0.5, 1, -0.5), new Vector3(0, 0, -1.5), 
       new Vector3(0.5, 1, -0.5), new Vector3(1.5, 0, -0.5), new Vector3(0, 0, -1.5), 
       new Vector3(1.5, 0, -0.5), new Vector3(0.5, -1, -0.5), new Vector3(0, 0, -1.5), 
       new Vector3(0.5, -1, -0.5), new Vector3(-0.5, -1, -0.5), new Vector3(0, 0, -1.5), 
       new Vector3(-0.5, -1, -0.5), new Vector3(-1.5, 0, -0.5), new Vector3(0, 0, -1.5) 
      }); 

      cube = new VBO<Vector3>(new Vector3[] 
      { 
       new Vector3(-1.5, 0, -0.5), new Vector3(-0.5, 1, -0.5), new Vector3(-0.5, 1, 0.5), new Vector3(-1.5, 0, 0.5), 
       new Vector3(-0.5, 1, -0.5), new Vector3(0.5, 1, -0.5), new Vector3(0.5, 1, 0.5), new Vector3(-0.5, 1, 0.5), 
       new Vector3(0.5, 1, -0.5), new Vector3(1.5, 0, -0.5), new Vector3(1.5, 0, 0.5), new Vector3(0.5, 1, 0.5), 
       new Vector3(1.5, 0, -0.5), new Vector3(1.5, 0, 0.5), new Vector3(0.5, -1, 0.5), new Vector3(0.5, -1, -0.5), 
       new Vector3(0.5, -1, 0.5), new Vector3(0.5, -1, -0.5), new Vector3(-0.5, -1, -0.5), new Vector3(-0.5, -1, 0.5), 
       new Vector3(-0.5, -1, -0.5), new Vector3(-0.5, -1, 0.5), new Vector3(-1.5, 0, 0.5), new Vector3(-1.5, 0, -0.5) 
      }); 


      bottom_pyramid = new VBO<Vector3>(new Vector3[] 
      { 
       new Vector3(-1.5, 0, 0.5), new Vector3(-0.5, 1, 0.5), new Vector3(0, 0, 1.5), 
       new Vector3(-0.5, 1, 0.5), new Vector3(0.5, 1, 0.5), new Vector3(0, 0, 1.5), 
       new Vector3(0.5, 1, 0.5), new Vector3(1.5, 0, 0.5), new Vector3(0, 0, 1.5), 
       new Vector3(1.5, 0, 0.5), new Vector3(0.5, -1, 0.5), new Vector3(0, 0, 1.5), 
       new Vector3(0.5, -1, 0.5), new Vector3(-0.5, -1, 0.5), new Vector3(0, 0, 1.5), 
       new Vector3(-0.5, -1, 0.5), new Vector3(-1.5, 0, 0.5), new Vector3(0, 0, 1.5) 
      }); 

      top_pyramidColor = new VBO<Vector3>(new Vector3[] 
      { 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 1, 0), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 1, 0), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 1, 0), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 1, 0), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 1, 0), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 1, 0) 
      }); 

      cubeColor = new VBO<Vector3>(new Vector3[] 
      { 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0,0,1), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0,0,1), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0,0,1), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0,0,1), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0,0,1), 
       new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0,0,1), 
      }); 

      bottom_pyramidColor = new VBO<Vector3>(new Vector3[] 
      { 
       new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(1, 1, 0), 
       new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(1, 1, 0), 
       new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(1, 1, 0), 
       new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(1, 1, 0), 
       new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(1, 1, 0), 
       new Vector3(0, 0, 1), new Vector3(0, 0, 1), new Vector3(1, 1, 0) 
      }); 

      top_pyramidElements = new VBO<int>(new int[] { 
       0,1,2, 
       3,4,5, 
       6,7,8, 
       9,10,11, 
       12,13,14, 
       15,16,17}, BufferTarget.ElementArrayBuffer); 

      cubeElements = new VBO<int>(new int[]{ 
       0,1,2,3, 
       4,5,6,7, 
       8,9,10,11, 
       12,13,14,15, 
       16,17,18,19, 
       20,21,22,23}, BufferTarget.ElementArrayBuffer); 

      bottom_pyramidElements = new VBO<int>(new int[] { 
       0,1,2, 
       3,4,5, 
       6,7,8, 
       9,10,11, 
       12,13,14, 
       15,16,17}, BufferTarget.ElementArrayBuffer); 

      watch = System.Diagnostics.Stopwatch.StartNew(); 

      Glut.glutMainLoop(); 
     } 



     public static void OnKeyPress(int theKey, int x, int y) 
     { 
      switch (theKey) 
      { 
       case Glut.GLUT_KEY_F6: 
        { 
         rotate += 3; 
         Console.WriteLine("Hallo!"); 
         Console.ReadLine(); 
        } 
        break; 
      } 
      Glut.glutPostRedisplay(); 
     } 

     private static void OnClose() 
     { 
      top_pyramid.Dispose(); 
      top_pyramidColor.Dispose(); 
      top_pyramidElements.Dispose(); 

      program.DisposeChildren = true; 
      program.Dispose(); 
     } 

     private static void OnDisplay() 
     { 

     } 

     private static void OnRenderFrame() 
     { 
      // calculate how much time has elapsed since the last frame 
      watch.Stop(); 
      float deltaTime = (float)watch.ElapsedTicks/System.Diagnostics.Stopwatch.Frequency; 
      watch.Restart(); 

      // use the deltaTime to adjust the angle of the cube and pyramid 
      angle += deltaTime; 



      // set up the OpenGL viewport and clear both the color and depth bits 
      Gl.Viewport(0, 0, width, height); 
      Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

      // use our shader program 
      Gl.UseProgram(program); 

      //top pyramid 
      program["model_matrix"].SetValue(Matrix4.CreateRotationY(angle * rotate) * Matrix4.CreateTranslation(new Vector3(0.0f, 0, 1))); 
      Gl.BindBufferToShaderAttribute(top_pyramid, program, "vertexPosition"); 
      Gl.BindBufferToShaderAttribute(top_pyramidColor, program, "vertexColor"); 
      Gl.BindBuffer(top_pyramidElements); 
      //top pyramid 
      Gl.DrawElements(BeginMode.Triangles, top_pyramidElements.Count, DrawElementsType.UnsignedInt, IntPtr.Zero); 

      //cubes 
      program["model_matrix"].SetValue(Matrix4.CreateRotationY(angle * rotate) * Matrix4.CreateTranslation(new Vector3(0.0f, 0, 1))); 
      Gl.BindBufferToShaderAttribute(cube, program, "vertexPosition"); 
      Gl.BindBufferToShaderAttribute(cubeColor, program, "vertexColor"); 
      Gl.BindBuffer(cubeElements); 
      //cubes 
      Gl.DrawElements(BeginMode.Quads, cubeElements.Count, DrawElementsType.UnsignedInt, IntPtr.Zero); 

      //bottom pyramid 
      program["model_matrix"].SetValue(Matrix4.CreateRotationY(angle * rotate) * Matrix4.CreateTranslation(new Vector3(0.0f, 0, 1))); 
      Gl.BindBufferToShaderAttribute(bottom_pyramid, program, "vertexPosition"); 
      Gl.BindBufferToShaderAttribute(bottom_pyramidColor, program, "vertexColor"); 
      Gl.BindBuffer(bottom_pyramidElements); 
      //top pyramid 
      Gl.DrawElements(BeginMode.Triangles, bottom_pyramidElements.Count, DrawElementsType.UnsignedInt, IntPtr.Zero); 

      Glut.glutSwapBuffers(); 
     } 

     public static string VertexShader = @" 
#version 130 

in vec3 vertexPosition; 
in vec3 vertexColor; 

out vec3 color; 

uniform mat4 projection_matrix; 
uniform mat4 view_matrix; 
uniform mat4 model_matrix; 

void main(void) 
{ 
    color = vertexColor; 
    gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1); 
} 
"; 

     public static string FragmentShader = @" 
#version 130 

in vec3 color; 

out vec4 fragment; 

void main(void) 
{ 
    fragment = vec4(color, 1); 
} 
"; 
    } 
} 

이미지 표시를 올바르게 그러나 이미지가 전혀 회전 정지 : 예를 들어, 내 코드에서 나는 빠르게 회전 이미지를 만들기 위해 F6을 누릅니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변

1

귀하의 문제는 OpenGL과 관련이없는 것으로 여겨집니다. 당신은 표준 입력에 텍스트를 입력 할 수

rotate += 3; 
Console.WriteLine("Hallo!"); 
Console.ReadLine(); 

이 라인의 마지막 기다립니다 : F6 키에 대한 핸들러를 보면, 다음과 같은 코드가 있습니다. 나는 당신이 무언가를 입력 할 때까지 그것이 차단 될 것이라고 믿습니다. ReadLine() 전화를 가져 와서 문제가 해결되는지 확인하십시오.

+0

완료, 완벽하게 작동합니다! 고맙습니다 :-) –