Laden...

opengl mit c#

Erstellt von tachyon76 vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.651 Views
T
tachyon76 Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren
opengl mit c#

hallo,
ich versuche mittels opengl und c# ein paar bunte dreiecke auszugeben, womit ich unter c++ keine probleme hatte. doch mit c# ist für mich vieles neu:
die Funktion glVertexPointer erwartet nun statt des üblichen pointers(c++) ein object-array

public static extern void glVertexPointer(int size,uint  type,int stride,object[] pointer);

ich nutze die wrapper-klasse von Chris Hegarty(abegeänderte version von Colin Fahey)
das Array erstelle und fülle ich so:

object[] pVertices;
pVertices = new object[iVertexCount * 3];
pVertices[0] = fX;
pVertices[1] = fY;
pVertices[2] = fZ;
[.....]

render-funktion:


			uint iError;
			GL.glEnableClientState(GL.GL_VERTEX_ARRAY);
			iError = GL.glGetError();
			GL.glDisableClientState(GL.GL_COLOR_ARRAY);
			//object[] oVertices = new object[9];
			float fZ = -.6f;
			GL.glVertexPointer(3, GL.GL_FLOAT , 0, (object[])pVertices);
			GL.glRotatef(.0f, .0f, .0f, 1.0f);
			iError = GL.glGetError();
// hier solte eigentlich das Mesh angezeigt werden, jodoch ist die ausgabe fehlerhaft. d.h. die daten haben irgendwie ein ganz anderes format
			GL.glDrawArrays(GL.GL_TRIANGLES, 3, this.pVertices.Length);
			iError = GL.glGetError();
// ab hier rendere ich nocheinmal das komplette mesh(alle freiecke einzelnd) um sicherzustellen, dass die mesh-daten korrekt sind. so wird das mesh auch richtig dargestellt
			GL.glBegin(GL.GL_TRIANGLES);
			int iCol = 0;
			for (int i = 0; i < pVertices.Length/3; i++)
			{
				iCol += 1;
				if (iCol == 3)
					iCol = 0;
				GL.glColor3f(1.0f, iCol * 1.0f, (i % 3) * 1.0f);
			//	GL.glVertex3f((float)pVertices[i*3], (float)pVertices[i*3+1], (float)pVertices[i*3+2]);
			}	
			GL.glEnd();

hmm, ich weiss nicht weiter, die daten sind irgendwie im komplett falschem format, aber ich bin schon sein 2 tagen am googeln, ohne erfolg.

hat jemand eine idee?

M
456 Beiträge seit 2004
vor 18 Jahren

Wie sieht denn deine Vertexstruktur aus?
Hast du das Layout dieser Struktur expliziet festgelegt (StructLayoutAttribute)?

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

T
tachyon76 Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

tja, ist halt n object-array


object[] pVertices;
pVertices = new object[iVertexCount * 3];

ich weiss auch nicht wirklich, wie ich die struktur sonst festlegen soll.
so in der art?


class cVertex
{
	float fX, fY, fZ;  
};

ist nur meiner meinung nach eigentlich das selbe.

niemand eine idee?

EDIT:
ausserdem habe ich es nicht hinbekommen, z.b. ein float[] in ein object[] zu casten, da die funktion glVertexPointer ein object[] erwartet.

T
tachyon76 Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

*push*

niemand ahnung?

M
456 Beiträge seit 2004
vor 18 Jahren

Kann es sein das bei

GL.glDrawArrays(GL.GL_TRIANGLES, 3, this.pVertices.Length);

der erste Vertex (index = 3) übersprungen wird, und deshalb falsch gezeichnet wird?
Probier vielleicht auch mal eine Version der Methode aus, welche die OGL Funktion nicht mit einem object[] überläd, sondern mit float[]. Tao macht das z.B. so.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

T
tachyon76 Themenstarter:in
12 Beiträge seit 2005
vor 18 Jahren

hi,

das mit dem index = 3

GL.glDrawArrays(GL.GL_TRIANGLES, 3, this.pVertices.Length); 

habe ich nur azu testzwecken so gemacht.
Das erste Dreicek wurde so erst garnicht dargestellt (falsche werte). erst e ab dem zweiten habe ich eine ausgabe bekommen.

und statt des object[] ein float[] zu nutzen habe ich auch anfangs versucht:

ausserdem habe ich es nicht hinbekommen, z.b. ein float[] in ein object[] zu casten, da die funktion glVertexPointer ein object[] erwartet.

bin aber an casting gescheitert.