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?
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.
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.
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.
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.