[Sharp GL] - Sharp GL zeichnet nicht

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    [Sharp GL] - Sharp GL zeichnet nicht

    Hallo Leute,

    aktuell versuche ich mich, nachdem ich nun lange mit gdi+ gezeichnet habe, mit OpenGL und SharpGL zu beschäftigen.

    Ich habe angefangen auf der Website "LearnOpenGL" die tutorials für c++ abzuarbeiten und habe den ersten schritt geschafft ein Fenster mit dem Quadrat zu zeichnen.
    Nun wollte ich mich ebenso in C# daran versuchen doch leider läuft es nicht wie gewünscht.

    Ich habe alles genau so gemacht wie in den Tutorials beschrieben. Das Verhalten momentan ist, dass das Programm zwar den Hintergrund "cleared" jedoch die Elemente nicht zeichnet.

    Meine Vermutung ist das ich etwas mit den Pointern falsch mache.

    "Mein Code - Komplett"


    C#-Quellcode

    1. public partial class SharpControl : OpenGLControl
    2. {
    3. private const string vShader = "#version 330 core \n layout (location = 0) in vec3 aPos; \n void main()\n {gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);}";
    4. private const string fShader = "#version 330 core \n out vec4 FragColor; \n void main(){FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);}";
    5. private OpenGL gl;
    6. private ShaderProgram sProgram;
    7. private uint[] VAO = new uint[1];
    8. private uint[] VBO = new uint[1];
    9. private uint[] EBO = new uint[1];
    10. float[] indices;
    11. float[] vertices;
    12. public SharpControl()
    13. {
    14. InitializeComponent();
    15. gl = this.OpenGL;
    16. gl.RenderContextProvider.MakeCurrent();
    17. var tmp = this.OpenGLVersion;
    18. gl.Viewport(0, 0, Width, Height);
    19. this.Load += SharpControl_Load;
    20. }
    21. private void Prepair()
    22. {
    23. //The Vertex Shader
    24. VertexShader vertexShader = new VertexShader();
    25. vertexShader.Name = "VertexShader";
    26. vertexShader.CreateInContext(gl);
    27. vertexShader.SetSource(vShader);
    28. vertexShader.Compile();
    29. CheckShaderCompilation(vertexShader);
    30. //The Fragment Shader
    31. FragmentShader fragmentShader = new FragmentShader();
    32. fragmentShader.Name = "FragmentShader";
    33. fragmentShader.CreateInContext(gl);
    34. fragmentShader.SetSource(fShader);
    35. fragmentShader.Compile();
    36. CheckShaderCompilation(fragmentShader);
    37. //The Shader Program
    38. sProgram = new ShaderProgram();
    39. sProgram.Name = "ShaderProgram";
    40. sProgram.CreateInContext(gl);
    41. sProgram.AttachShader(vertexShader);
    42. sProgram.AttachShader(fragmentShader);
    43. sProgram.Link();
    44. CheckShaderProgramCompilation(sProgram);
    45. vertices = new float[]
    46. {
    47. 0.5f, 0.5f, 0.0f, // top right
    48. 0.5f, -0.5f, 0.0f, // bottom right
    49. -0.5f, -0.5f, 0.0f, // bottom left
    50. -0.5f, 0.5f, 0.0f // top left
    51. };
    52. indices = new float[]
    53. { // note that we start from 0!
    54. 0, 1, 3, // first triangle
    55. 1, 2, 3 // second triangle
    56. };
    57. gl.GenVertexArrays(1, VAO);
    58. gl.GenBuffers(1, VBO);
    59. gl.GenBuffers(1, EBO);
    60. gl.BindVertexArray(VAO[0]);
    61. gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, VBO[0]);
    62. gl.BufferData(OpenGL.GL_ARRAY_BUFFER, vertices, OpenGL.GL_STATIC_DRAW);
    63. gl.VertexAttribPointer(0, 3, OpenGL.GL_FLOAT, false, 3 * sizeof(float), IntPtr.Zero);
    64. gl.EnableVertexAttribArray(0);
    65. gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, EBO[0]);
    66. gl.BufferData(OpenGL.GL_ELEMENT_ARRAY_BUFFER, indices, OpenGL.GL_STATIC_DRAW); ;
    67. gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, EBO[0]);
    68. gl.BindVertexArray(0);
    69. }
    70. private void SharpControl_Load(object sender, EventArgs e)
    71. {
    72. gl.ClearColor(255, 255, 255, 255);
    73. PrepairData();
    74. }
    75. protected override void DoOpenGLDraw(RenderEventArgs e)
    76. {
    77. //RenderLoop
    78. gl.ClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    79. gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT);
    80. gl.UseProgramObjectARB(sProgram.ProgramObject);
    81. gl.BindVertexArray(VAO[0]);
    82. gl.DrawElements(OpenGL.GL_TRIANGLES, 6, OpenGL.GL_UNSIGNED_INT,IntPtr.Zero);
    83. gl.Flush();
    84. }
    85. }





    Kann mir bitte jemand helfen den fehler zu finden und verstehen zu helfen.


    Mit freundlichen Grüßen

    Mausekeks
    Brain is Loading: 35%
    @ThuCommix gl.UseProgramObjectARB schien mir passender als gl.UseProgram. Beide Methoden nehmen einen uint als input parameter jedoch bekomme ich ja vom ShaderProgram das ProgramObject zurück daher denke ich das dies passender ist.

    @Bluespide gibt es da unterschiede zu c++? eigentlich nicht oder, das binding ist ja relativ low level.
    Unter c++ sieht die initialisierung identisch aus.
    Brain is Loading: 35%
    Bist du dir da sicher? Bevor ich in meinem Testprojekt nach dem MakeCurrent nicht z.B. sage:

    C#-Quellcode

    1. GL.MatrixMode(GL.PROJECTION);
    2. GL.LoadIdentity();
    3. GL.Ortho(0, Width, 0, Height, 0, 1);
    4. GL.MatrixMode(GL.MODELVIEW);

    sehe ich nur die ClearColor und sonst nichts. Siehst du denn die ClearColor?