OpenGL DrawArray Zeichnet nicht

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Andy16823
Beiträge: 22
Registriert: 18.06.2014, 17:22

OpenGL DrawArray Zeichnet nicht

Beitrag von Andy16823 »

Hallo Community, ich habe das Problemm das DrawArrays() nichts zeichnet. Mein Code seht so aus

Code: Alles auswählen

        private void Form1_Shown(object sender, EventArgs e)
        {
            m_gl = new NetGL.OpenGL();
            m_gl.Initial(this.Handle);
            m_timer = new Timer();
            m_timer.Tick += TimerTick;
            m_timer.Start();

            m_vertex = new float[9];
            
            // Ecke mitte oben
            m_vertex[0] = 0.0f;
            m_vertex[1] = 1.0f;
            m_vertex[2] = 0.0f;

            // Ecke unten Rechts
            m_vertex[3] = 1.0f;
            m_vertex[4] = -1.0f;
            m_vertex[5] = 0.0f;

            // Ecke unten Links
            m_vertex[6] = -1.0f;
            m_vertex[7] = -1.0f;
            m_vertex[8] = 0.0f;

        }

        private void TimerTick(object sender, EventArgs e)
        {
            m_gl.EnabledClientState(NetGL.OpenGL.VertexArray);

            m_gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
            m_gl.MatrixMode(NetGL.OpenGL.Projection);
            m_gl.LoadIdentity();

            m_gl.MatrixMode(NetGL.OpenGL.ModelView);
            m_gl.LoadIdentity();
            m_gl.Scale(0.5f, 0.5f, 0.5f);

            m_gl.Color3f(Color.Red.R, Color.Red.G, Color.Red.B);
            m_gl.VertexPointer(3, NetGL.OpenGL.FloatArray, 0, m_vertex);
            m_gl.DrawArrays(NetGL.OpenGL.Triangles, 0, m_vertex.Length);
            m_gl.Flush();

            m_gl.DisableClientState(NetGL.OpenGL.VertexArray);
            Console.WriteLine(m_gl.GetError());
        }
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von kimmi »

Was gibt denn Console.WriteLine(m_gl.GetError() ) aus? Wäre als Startpunkt ganz hilfreich :).

Gruß Kimmi
kristof
Beiträge: 91
Registriert: 19.01.2009, 13:05

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von kristof »

Vielleicht liegt das Problem nicht bei DrawArray? Du wiest der Projektionsmatrix ja momentan die Identität zu. Versuch dort doch mal eine perspektivische oder orthogonale Projektion zu machen. Ich sehe zwar nicht, warum das in diesem simplen Fall nicht mit der Identität funktionieren sollte, ich habe aber auch schon so manche Stunde damit verbracht zu verstehen warum Geometrie nicht zu sehen ist und dann später festgestellt, dass sie nicht im View Frustum gelandet ist...
Ansonsten schreib mal etwas genauer was du schon probiert hast. Hat es ohne DrawArray schon mal funktioniert?
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von Matthias Gubisch »

Was ich vermisse ist das Setzen des Timer Intervalls vor dem Start des Timers
Ausserdem solltest überprüfen ob die enabled eigenschaft es Timers wirklich true ist.

Ohne es ausprobiert zu haben sieht das so aus als würde TimerTick genau einmal (mit Intervall 0 direkt nach dem Start) auslösen, zu diesem Zeitpunkt ist m_vertex vermutlich noch nicht vollständig initialisiert.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Andy16823
Beiträge: 22
Registriert: 18.06.2014, 17:22

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von Andy16823 »

Der Timer wird gestartet, das problemm lag bei meinem Wrapper. Aber nun habe ich ein neues, ich übergebe zu dem Wrapper

Code: Alles auswählen

array<float> ^data
und dies kann ich nicht so an glVertexPointer übergeben, dort tritt das Problem auf, dass nichts gerendert wird. Nun erstelle ich ein neues Array mit
dem Daten Typ GLfloat

Code: Alles auswählen

	void NetGL::OpenGL::VertexPointer(int Size, int ArrayType, int Stride, array<double>^ DataArray)
	{
		GLdouble *arr = new GLdouble[DataArray->Length];
		for(int i = 0; i < DataArray->Length; i++)
		{
			arr[i] = DataArray[i];
		}
		glVertexPointer(Size, ArrayType, Stride, arr);
	}
aber, ich kann das Array nicht mehr im Speicher freigeben, da sonst wider nichts gerendert wird.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von Schrompf »

Du... Du... du benutzt C++.NET? PAAAANIIIIIK!

Im Ernst: ich habe keine Ahnung, wie die Managed Arrays im Speicher aussehen, aber es sind sicher keine PODs, also dürfte OpenGL daraus allen möglichen Mist lesen. Und mir scheint, Du hast ein grundlegendes Problem mit dem Verständnis von Objekt-Lebenszeiten. Die aktuell einfachste Lösung für Dich wäre hier, den Array-Pointer aus dem zweiten Code-Schnipsel einfach global zu deklarieren. Dann brauchst Du ihn nur einmal allokieren und kannst ihn irgendwann zum Ende des Programms wieder freigeben.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von kimmi »

Eine Verständnisgfrage: machst du das einmal pro Frame oder legst du initial den VertexArray an und setzt den dann vor jedem neuen Frame?
Wenn du den Array freigibt und dann nichts mehr gerendert wird, klingt das irgendwie für mich danach, als würde der VertexArray immer wieder neu generiert auf Basis deines Arrays. Oder du führst keinen Deepcopy der vertexdaten durch.

Gruß Kimmi
Andy16823
Beiträge: 22
Registriert: 18.06.2014, 17:22

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von Andy16823 »

Das ist es ja, in der .Net Anwendung habe ich ein Globales Array erstellt, aber ich erstelle bei dem Aufruf void NetGL::OpenGL::VertexPointer(int Size, int ArrayType, int Stride, array<double>^ DataArray) ja immer wieder ein neues Array mit

Code: Alles auswählen

GLdouble *arr = new GLdouble[DataArray->Length];
for(int i = 0; i < DataArray->Length; i++)
{
arr[i] = DataArray[i];
}
und dieses neu Angelegte array kann ich nach glVertexPointer(Size, ArrayType, Stride, arr); nicht mit delete[] arr Löschen da sonst nichts gezeichnet wird.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von kimmi »

Du legst einmal den VertexArray an. Damit werden deine Daten auf die GPU in einen Buffer kopiert. Wenn du das getan hast, brauchst du nur noch den Buffer mit den Vertexdaten beim Rendern an den aktuellen Render-Kontext zu binden. Schau dir mal die Dokumentation an, wie dieses zu bewerkstelligen ist.

Gruß Kimmi
Andy16823
Beiträge: 22
Registriert: 18.06.2014, 17:22

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von Andy16823 »

Achso ^^ jetzt habe ich es, glVertexPointer, beim Initialisieren des Renderes und im Timer nur DrawArray() Danke sehr :)

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace VPTest
{
    public partial class Form1 : Form
    {
        private NetGL.OpenGL m_gl;
        private Timer m_timer;
        private float[] m_vertex;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            m_gl = new NetGL.OpenGL();
            m_gl.Initial(this.Handle);
            m_timer = new Timer();
            m_timer.Tick += TimerTick;
            m_timer.Start();

            m_vertex = new float[9];
            
            // Ecke mitte oben
            m_vertex[0] = 0.0f;
            m_vertex[1] = 1.0f;
            m_vertex[2] = 0.0f;

            // Ecke unten Rechts
            m_vertex[3] = 1.0f;
            m_vertex[4] = -1.0f;
            m_vertex[5] = 0.0f;

            // Ecke unten Links
            m_vertex[6] = -1.0f;
            m_vertex[7] = -1.0f;
            m_vertex[8] = 0.0f;

            m_gl.EnabledClientState(NetGL.OpenGL.VertexArray);
            m_gl.VertexPointer(3, NetGL.OpenGL.FloatArray, 0, m_vertex);

        }

        private void TimerTick(object sender, EventArgs e)
        {
            m_gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
            m_gl.MatrixMode(NetGL.OpenGL.Projection);
            m_gl.LoadIdentity();
            m_gl.MatrixMode(NetGL.OpenGL.ModelView);
            m_gl.LoadIdentity();
            m_gl.Scale(0.5f, 0.5f, 0.5f);
            m_gl.EnabledClientState(NetGL.OpenGL.VertexArray);
            m_gl.Color3f(Color.Green);
            m_gl.DrawArrays(NetGL.OpenGL.Triangles, 0, m_vertex.Length);
            m_gl.DisableClientState(NetGL.OpenGL.VertexArray);
            Console.WriteLine(m_gl.GetError());
            m_gl.Flush();
        }

    }
}
Andy16823
Beiträge: 22
Registriert: 18.06.2014, 17:22

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von Andy16823 »

Entschulidigt bitte die blöden fragen, aber wie bekomme ich die Arrays wieder aus dem OpenGL Speicher ?

Grüße Andy
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL DrawArray Zeichnet nicht

Beitrag von kimmi »

glDestroyBuffer bzw. der .NET Call, der gemäß deiner Dokumentation dfür vorgesehen ist :).

Kimmi
Antworten