2013-03-04 3 views
0

내가 지정한 색상과 verticies에있는 삼각형을 그릴하려고해야하지만 현재는 그것의 위치에 대한 몇 가지 색상 번호를 따기처럼 보인다는 어떻게해야 일을하지 않는 한 그리기하지OpenTK 기본 삼각형은

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using OpenTK; 
using OpenTK.Graphics.OpenGL; 
using OpenTK.Graphics; 

namespace newTriangle 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyWindow myWindow = new MyWindow(); 
      myWindow.Run(); 
     } 
    } 

    class MyWindow : GameWindow 
    { 
     private uint[] vertexBufferObjectIDs = new uint[2]; 
     private int vertexArrayID, vertexShaderID, fragmentShaderID, shaderProgramID; 

     public MyWindow() 
      : base(800, // Width 
       600, // Height 
       GraphicsMode.Default, 
       "My OpenTK Window", 
       GameWindowFlags.Default, 
       DisplayDevice.Default, 
       3, // major 
       0, // minor 
       GraphicsContextFlags.ForwardCompatible) { } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 
      GL.ClearColor(Color4.CornflowerBlue); 

      GL.GenVertexArrays(1, out vertexArrayID); 
      GL.BindVertexArray(vertexArrayID); 

      ushort[] indices = new ushort[] { 0, 1, 2 }; 
      float[] vertices = new float[] {-1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 
              0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 
              1.0f, 1.0f, 0.0f, 0.0f, 1.0f }; 

      GL.GenBuffers(vertexBufferObjectIDs.Length, vertexBufferObjectIDs); 
      GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferObjectIDs[0]); 
      GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StaticDraw); 

      GL.BindBuffer(BufferTarget.ElementArrayBuffer, vertexBufferObjectIDs[1]); 
      GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * sizeof(ushort)), indices, BufferUsageHint.StaticDraw); 

      GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, true, 5 * sizeof(float), 0); 
      GL.EnableVertexAttribArray(0); 

      GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, 5 * sizeof(float), 2 * sizeof(float)); 
      GL.EnableVertexAttribArray(1); 

      vertexShaderID = GL.CreateShader(ShaderType.VertexShader); 
      string vertShaderText = 
       @" 
          #version 150 

          in vec3 position; 
          in vec3 colour; 
          out vec3 Colour; 
          void main() 
          { 
          Colour = colour; 
          gl_Position = vec4(position, 1) ; 
          }"; 

      GL.ShaderSource(vertexShaderID, vertShaderText); 
      GL.CompileShader(vertexShaderID); 

      fragmentShaderID = GL.CreateShader(ShaderType.FragmentShader); 
      string fragShaderText = 
       @" 
          #version 150 
          in vec3 Colour; 
          out vec4 outputF; 
          void main() 
          { 
          outputF = vec4(Colour, 1.0); 
          }"; 
      GL.ShaderSource(fragmentShaderID, fragShaderText); 
      GL.CompileShader(fragmentShaderID); 

      shaderProgramID = GL.CreateProgram(); 
      GL.AttachShader(shaderProgramID, fragmentShaderID); 
      GL.AttachShader(shaderProgramID, vertexShaderID); 
      GL.LinkProgram(shaderProgramID); 
      GL.UseProgram(shaderProgramID); 
     } 

     protected override void OnUnload(EventArgs e) 
     { 
      base.OnUnload(e); 
      GL.DeleteBuffers(vertexBufferObjectIDs.Length, vertexBufferObjectIDs); 
      GL.DeleteVertexArrays(1, ref vertexArrayID); 

      GL.UseProgram(0); GL.DetachShader(shaderProgramID, vertexShaderID); 
      GL.DetachShader(shaderProgramID, fragmentShaderID); 
      GL.DeleteShader(fragmentShaderID); 
      GL.DeleteShader(vertexShaderID); 
      GL.DeleteProgram(shaderProgramID); 
     } 

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

      GL.Clear(ClearBufferMask.ColorBufferBit); 

      GL.DrawElements(BeginMode.Triangles, 3, DrawElementsType.UnsignedShort, IntPtr.Zero); 

      this.SwapBuffers(); 
     } 
    } 
} 

누구든지 내 실수를 볼 수 있습니까?

+1

왜 셰이더 컴파일 및 프로그램 링크 로그를 확인하지 않습니까? – genpfault

답변

0

당신은 속성의 위치를 ​​연결하지 않았다. BindAttribLocation​에 대한 적절한 호출을 사용하여 수정하거나 location과 함께 layout 한정자를 사용할 수 있습니다. 또한 positionvec3이지만 2 개만 허용됩니다. 당신이 생각했던 것을 아마 보이는 http://i.imgur.com/H9FEXZ0.png : 나에게이 사진을 제공

layout(location = 0) in vec2 position; 
layout(location = 1) in vec3 colour; 

: layout 한정자를 사용

쉬운 수정합니다.

0
vec4(position, 1) 

GLSL 정수는 자동으로 유형 승격되지 않습니다.

당신이 당신의 프래그먼트 쉐이더에서 바로 얻었 기 때문에 기묘합니다.

이 시도 :

vec4(position, 1.0)