OpenGL 3.3 Textured Quad zeichnen

  • C#
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Andy.

    OpenGL 3.3 Textured Quad zeichnen

    Hey, ich versuche nun sein einiger Zeit einen texturierten Quad zu zeichnen, als Vorlage verwende ich diesen Code:

    open.gl/content/code/c3_basic.txt

    Ich wusste nicht wie genau man

    C-Quellcode

    1. (void*)(5 * sizeof(GLfloat))


    nach C# übersetzt, da es sich allerdings nur um einen Offset im BufferObj handelt habe ich das wie folgt gemacht:

    C#-Quellcode

    1. IntPtr((5 * sizeof(float)))


    Mein übersetzter Code sieht wie folgt aus:

    C#-Quellcode

    1. var vertices = new float[]
    2. {
    3. // Position Color Texcoords
    4. -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
    5. 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
    6. 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
    7. -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f // Bottom-left
    8. };
    9. var vao = new uint[1];
    10. OpenGLInterops.GenVertexArrays(1, vao);
    11. OpenGLInterops.BindVertexArray(vao[0]);
    12. var vbo = new uint[1];
    13. OpenGLInterops.GenBuffers(1, vbo);
    14. OpenGLInterops.BindBuffer(OpenGLInterops.GL_ARRAY_BUFFER, vbo[0]);
    15. OpenGLInterops.BufferData(OpenGLInterops.GL_ARRAY_BUFFER, vertices, OpenGLInterops.GL_STATIC_DRAW);
    16. var ebo = new uint[1];
    17. OpenGLInterops.GenBuffers(1, ebo);
    18. var elements = new ushort[]
    19. {
    20. 0, 1, 2,
    21. 2, 3, 0
    22. };
    23. _colorShader.Bind();
    24. tex.Bind(0);
    25. OpenGLInterops.BindBuffer(OpenGLInterops.GL_ELEMENT_ARRAY_BUFFER, ebo[0]);
    26. OpenGLInterops.BufferData(OpenGLInterops.GL_ELEMENT_ARRAY_BUFFER, elements, OpenGLInterops.GL_STATIC_DRAW);
    27. int posAttrib = OpenGLInterops.GetAttribLocation(_colorShader.ShaderProgramObject, "position");
    28. OpenGLInterops.EnableVertexAttribArray((uint)posAttrib);
    29. OpenGLInterops.VertexAttribPointer((uint)posAttrib, 2, OpenGLInterops.GL_FLOAT, false, 7 * sizeof(float), IntPtr.Zero);
    30. int colAttrib = OpenGLInterops.GetAttribLocation(_colorShader.ShaderProgramObject, "color");
    31. OpenGLInterops.EnableVertexAttribArray((uint)colAttrib);
    32. OpenGLInterops.VertexAttribPointer((uint)colAttrib, 3, OpenGLInterops.GL_FLOAT, false, 7 * sizeof(float),new IntPtr((2 * sizeof(float))));
    33. int texAttrib = OpenGLInterops.GetAttribLocation(_colorShader.ShaderProgramObject, "texcoord");
    34. OpenGLInterops.EnableVertexAttribArray((uint)texAttrib);
    35. OpenGLInterops.VertexAttribPointer((uint)texAttrib, 2, OpenGLInterops.GL_FLOAT, false, 7 * sizeof(float), new IntPtr((5 * sizeof(float))));
    36. OpenGLInterops.glDrawElements(OpenGLInterops.GL_TRIANGLES, 6, OpenGLInterops.GL_UNSIGNED_INT, IntPtr.Zero);
    37. tex.Unbind();
    38. _colorShader.Unbind();
    39. OpenGLInterops.DeleteBuffers(1, ebo);
    40. OpenGLInterops.DeleteBuffers(1, vbo);
    41. OpenGLInterops.DeleteVertexArrays(1, vao);


    Es läuft auch alles ohne Probleme durch, jedoch seh ich bis auf die ClearColor nichts von der Textur.. Hier noch mal der Fragment und VertexShader:

    C-Quellcode

    1. #version 150 core
    2. in vec2 position;
    3. in vec3 color;
    4. in vec2 texcoord;
    5. out vec3 Color;
    6. out vec2 Texcoord;
    7. void main() {
    8. Color = color;
    9. Texcoord = texcoord;
    10. gl_position = vec4(position, 0.0, 1.0);
    11. }


    C-Quellcode

    1. #version 150 core
    2. in vec3 Color;
    3. in vec2 Texcoord;
    4. out vec4 outColor;
    5. uniform sampler2D tex;
    6. void main() {
    7. outColor = texture(tex, Texcoord) * vec4(Color, 1.0);
    8. }


    Kann jemand von euch einen Fehler erkennen oder mir sagen wie ich es anders/besser machen sollte?
    Hey, ich kenne mich mit OpenGL leider garnicht aus aber falls es am void-Pointer liegt:
    Es ist in C# kein Problem, void-Pointer zu deklarieren. Muss halt in nem unsafe block sein.

    C#-Quellcode

    1. unsafe {
    2. var ptr = (void*)(5 * sizeof (float));
    3. }


    Man sollte in C# allerdings keine void Pointer verwenden, wenn man nicht wirklich weiß was man da tut.
    Und IntPtr sollte zu dem Zweck eigentlich funktionieren.

    Eine Idee hab ich noch: Kannst du ein byte-Array an die funktion übergeben anstatt nem Pointer?
    Könnte funktionieren.
    Kommt aufs gleiche raus, das kann also nicht der Fehler sein.. Ne der IntPtr gibt nur den offset im Buffer an, der ist kein ByteArray oder so etwas. Das Problem muss eigentlich iwie an den Shadern und sowas liegen, ich weiß es leider auch nicht. Hat @jvbsl oder @~blaze~ eine Idee?

    EDIT: Compilation failed for vertex shader. - Ich kann den Fehler aber nicht entdecken :S

    EDIT2: OMG... gl_position -> gl_Position

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ThuCommix“ ()

    @~blaze~ hat doch keine Ahnung von OGL :D
    Außerdem immer schön glGetError aufrufen, denn OpenGl lässt entweder einfach deine Applikation abstürzen(wenn es z.B. Speicherzugriffsfehler sind - aber auch nicht immer^^), oder du siehst einfach nicht das, was du sehen möchtest.
    Außerdem sind die Fehlermeldungen dort auch gar nicht schlecht.

    Und ich hoffe, dass du den Code nicht so am stück aufrufst :D Und nachher auch alles schön in Klassen kapselst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---