2012-07-06 119 views
1

我有一些GLSL问题。当我只使用正常的VBO而没有着色器时,所有的东西都按照预期显示在屏幕上,我可以四处移动。OpenGL着色问题

只要我连接着色器,就像它'冻结',绘制一次,并不刷新。我检查并更新和渲染帧正在执行,因为它们应该是(做了一个messagebox输出检查,以确保它到达代码)。

我想它是什么做的矩阵,但我不知道它是什么

以下是我有:

的Shader创作:

private int vertShadHandle, fragShadHandle; 
    private int shadProgHandle; 

    private void ShaderCreate() 
    { 
     string vertShadeSource, fragShadeSource, vertcontent,fragcontent; 

     vertcontent = System.IO.File.ReadAllText(@"resources/shaders/vertcoordshader.glsl"); 
     fragcontent = System.IO.File.ReadAllText(@"resources/shaders/fragcoordshader.glsl"); 


     vertShadeSource = "resources/shaders/vertcoordshader.glsl"; 
     fragShadeSource = "resources/shaders/fragcoordshader.glsl"; 


     Console.WriteLine("\nvertex shader path:" + System.IO.File.Exists("/resources/shaders/vertcoordshader.glsl")); 
     Console.WriteLine("frag shader path:" + System.IO.File.Exists("/resources/shaders/fragcoordshader.glsl\n")); 

     vertShadHandle= GL.CreateShader(ShaderType.VertexShader); //connect the handles to created shaders 
     fragShadHandle = GL.CreateShader(ShaderType.FragmentShader); 

     shadProgHandle = GL.CreateProgram(); //create shader program 

     GL.ShaderSource(vertShadHandle,vertcontent); //attach file to the shader handle 
     GL.ShaderSource(fragShadHandle,fragcontent); 

     GL.CompileShader(vertShadHandle); //compile the shaders 
     GL.CompileShader(fragShadHandle); 

     Console.WriteLine("\n" + GL.GetShaderInfoLog(vertShadHandle) + "\n"); 
     Console.WriteLine("\n" + GL.GetShaderInfoLog(fragShadHandle) + "\n"); 

     GL.AttachShader(shadProgHandle, vertShadHandle); //attach the shader to the program created 
     GL.AttachShader(shadProgHandle, fragShadHandle); 

     //BindAttributes go here (optional) 


     GL.BindAttribLocation(shadProgHandle,0,"a_Vertex"); 
     GL.BindAttribLocation(shadProgHandle, 1, "a_Color"); 

     GL.UniformMatrix4(GL.GetUniformLocation(shadProgHandle,"MVP"), false, ref MVP); 

     GL.LinkProgram(shadProgHandle); //sanity check on the created shader program, links it 

     Console.WriteLine("\n"+ GL.GetProgramInfoLog(shadProgHandle) +"\n"); 

     GL.DeleteShader(vertShadHandle); 
     GL.DeleteShader(fragShadHandle); 

    } 

更新相框:

protected override void OnUpdateFrame(FrameEventArgs e) 
    { 


     const float PIE = 3.141592654f; 

     gamePad = XNA.GamePad.GetState(Microsoft.Xna.Framework.PlayerIndex.One); 

     camAngle.Y += gamePad.ThumbSticks.Right.X * (float)e.Time * 180; 
     camAngle.X += gamePad.ThumbSticks.Right.Y * (float)e.Time * 180; 

     Vector2 RadAng = new Vector2(); 

     RadAng.X = (camAngle.X/180 * PIE); 
     RadAng.Y = (camAngle.Y/180 * PIE); 


     if (gamePad.ThumbSticks.Left.Y > 0) 
     { 
      camCoord.X -= (float)(Math.Sin(RadAng.Y) * gamePad.ThumbSticks.Left.Y) * (float)(e.Time); 
      camCoord.Z += (float)(Math.Cos(RadAng.Y) * gamePad.ThumbSticks.Left.Y) * (float)(e.Time); 
      camCoord.Y += (float)(Math.Sin(RadAng.X) * gamePad.ThumbSticks.Left.Y) * (float)(e.Time); 
     } 
     if (gamePad.ThumbSticks.Left.Y < 0) 
     { 
      camCoord.X -= (float)(Math.Sin(RadAng.Y) * gamePad.ThumbSticks.Left.Y) * (float)(e.Time); 
      camCoord.Z += (float)(Math.Cos(RadAng.Y) * gamePad.ThumbSticks.Left.Y) * (float)(e.Time); 
      camCoord.Y += (float)(Math.Sin(RadAng.X) * gamePad.ThumbSticks.Left.Y) * (float)(e.Time); 
     } 
     if (gamePad.ThumbSticks.Left.X > 0) 
     { 
      camCoord.X -= (float)(Math.Cos(RadAng.Y) * gamePad.ThumbSticks.Left.X) * (float)(e.Time); 
      camCoord.Z -= (float)(Math.Sin(RadAng.Y) * gamePad.ThumbSticks.Left.X) * (float)(e.Time); 
     } 
     if (gamePad.ThumbSticks.Left.X < 0) 
     { 
      camCoord.X -= (float)(Math.Cos(RadAng.Y) * gamePad.ThumbSticks.Left.X) * (float)(e.Time); 
      camCoord.Z -= (float)(Math.Sin(RadAng.Y) * gamePad.ThumbSticks.Left.X) * (float)(e.Time); 
     } 

     //camCoord.X -= (float)(Math.Sin(RadAng.Y)); 
     //camCoord.Z += (float)(Math.Cos(RadAng.Y)); 
     //camCoord.Y += (float)(Math.Sin(RadAng.X)); 

     if (camAngle.X > 89) 
     { 
      camAngle.X = 89; 
     } 
     if (camAngle.X < -89) 
     { 
      camAngle.X = -89; 
     } 

     if (camAngle.Y > 360) 
     { 
      camAngle.Y -= 360; 
     } 
     else if (camAngle.Y < 0) 
     { 
      camAngle.Y += 360; 
     } 

     CameraMatrix(); 
     MVP = Matrix4.Mult(camMatrix, perspectivematrix); 
    } 

相机功能:

public Matrix4 MVP = new Matrix4(); 
    public Matrix4 camMatrix = new Matrix4(); 
    private void CameraMatrix() 
    { 
     camMatrix = Matrix4.Identity; 
     camMatrix = Matrix4.CreateRotationX(camAngle.X); 
     camMatrix = Matrix4.CreateRotationY(camAngle.Y); 
     camMatrix = Matrix4.CreateTranslation(camCoord); 
     //GL.Rotate(camAngle.X, 1, 0, 0); 
     //GL.Rotate(camAngle.Y, 0, 1, 0); 
     //GL.Translate(camCoord); 
    } 

渲染帧:

protected override void OnRenderFrame(FrameEventArgs e) 
    { 

     //Qfont display debug info 



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


     coordSys.Draw(ref shadProgHandle); 

     GL.PushAttrib(AttribMask.ColorBufferBit); 


     int qFontLine = 0; 
     QFont.Begin(); 
     InfFont.Print("FPS: " + Math.Round(RenderFrequency, 2), new Vector2(0, 0)); 
     ++qFontLine; 
     InfFont.Print(new String('\n', ++qFontLine) + "X: " + -Math.Round(camCoord.X, 2)); 
     InfFont.Print(new String('\n', ++qFontLine) + "Y: " + -Math.Round(camCoord.Y, 2)); 
     InfFont.Print(new String('\n', ++qFontLine) + "Z: " + -Math.Round(camCoord.Z, 2)); 
     ++qFontLine; 
     InfFont.Print(new String('\n', ++qFontLine) + "H-Angle: " + -Math.Round(camAngle.Y, 2)); 
     InfFont.Print(new String('\n', ++qFontLine) + "V-Angle: " + -Math.Round(camAngle.X, 2)); 
     ++qFontLine; 
     InfFont.Print(new String('\n', ++qFontLine) + "Thumbsticks: "); 
     InfFont.Print(new String('\n', ++qFontLine) + "Left.X : " + Math.Round(gamePad.ThumbSticks.Left.X,2)); 
     InfFont.Print(new String('\n', ++qFontLine) + "Left.Y : " + Math.Round(gamePad.ThumbSticks.Left.Y,2)); 
     InfFont.Print(new String('\n', ++qFontLine) + "Right.X: " + Math.Round(gamePad.ThumbSticks.Right.X,2)); 
     InfFont.Print(new String('\n', ++qFontLine) + "Right.X: " + Math.Round(gamePad.ThumbSticks.Right.Y,2)); 
     QFont.End(); 

     GL.PopAttrib(); 

     SwapBuffers(); 
    } 

绘图命令

GL.UseProgram(ShaderProgramHandle); 


GL.EnableVertexAttribArray(0); 
     GL.EnableVertexAttribArray(1); 

     GL.BindBuffer(BufferTarget.ArrayBuffer, _VBO[1]); 
     GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 0, 0); 

     GL.BindBuffer(BufferTarget.ArrayBuffer, _VBO[0]); 
     GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0); 



     GL.DrawArrays(BeginMode.Lines, 0, 6); 


     GL.DisableVertexAttribArray(0); 
     GL.DisableVertexAttribArray(1); 

最后,分别顶点和片段着色器:

#version 330 

in vec3 a_Vertex; 
in vec3 a_Color; 

uniform mat4 MVP; 

out vec3 color; 

void main() 
{ 

    gl_Position = vec4(a_Vertex,1.0);// * MVP; 

    color = a_Color; 
} 

    #version 330 

in vec3 color; 
out vec4 outColor; 

void main() 
{ 
    outColor = vec4(1,1,1,1.0); 
} 
+0

我确实有GL.UseProgram在那里,它只是没有出于某种原因 – 2012-07-06 15:55:01

+0

我已经想通了复制。我改变了顶点着色器来说 gl_Position = gl_ModelViewProjectionMatrix * vec4(a_Vertex,1.0); 我不知道存在。现在,如果我只能找出文本的东西.... – 2012-07-06 16:41:52

+0

发布您的解决方案作为答案,并将其标记为未来的回答(时限后);) – 2012-07-06 17:40:42

回答

0

我已经想通了。我改变了顶点着色器来说

gl_Position = gl_ModelViewProjectionMatrix * vec4(a_Vertex,1.0);

,我不知道的