Seite 1 von 1

OpenGL DrawArray Zeichnet nicht

Verfasst: 11.08.2014, 09:32
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());
        }

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 11.08.2014, 13:36
von kimmi
Was gibt denn Console.WriteLine(m_gl.GetError() ) aus? Wäre als Startpunkt ganz hilfreich :).

Gruß Kimmi

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 11.08.2014, 15:47
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?

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 11.08.2014, 16:00
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.

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 12.08.2014, 09:12
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.

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 12.08.2014, 09:33
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.

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 12.08.2014, 09:35
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

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 12.08.2014, 09:56
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.

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 12.08.2014, 11:01
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

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 12.08.2014, 11:11
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();
        }

    }
}

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 13.08.2014, 10:18
von Andy16823
Entschulidigt bitte die blöden fragen, aber wie bekomme ich die Arrays wieder aus dem OpenGL Speicher ?

Grüße Andy

Re: OpenGL DrawArray Zeichnet nicht

Verfasst: 14.08.2014, 12:10
von kimmi
glDestroyBuffer bzw. der .NET Call, der gemäß deiner Dokumentation dfür vorgesehen ist :).

Kimmi