OpenGL UV Koordinaten Oben Links ?
OpenGL UV Koordinaten Oben Links ?
Ich habe nun festgestellt, dass sich bei mir die Koordinaten der Texture wie folgt befinden
ich habe es aber so gelernt
http://www.foerterer.com/cpp/texturen/bilder.htm und auf http://wiki.delphigl.com/index.php/Tutorial_Lektion_4 steht es wie oben in der Grafik ? was stimmt nun ?
ich habe es aber so gelernt
http://www.foerterer.com/cpp/texturen/bilder.htm und auf http://wiki.delphigl.com/index.php/Tutorial_Lektion_4 steht es wie oben in der Grafik ? was stimmt nun ?
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Der Ursprung der Texturkoordinaten ist in OpenGL links unten, so wie du es gelernt hast. Ich vermute mal, dass du beim Laden die Daten verkehrt rum in die Textur packst (OpenGL erwartet die Bilddaten zeilenweise von unten nach oben)...
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Für OpenGL „stimmt“, wie dot sagte, links unten mit den Bilddaten zeilenweise von unten nach oben.
Es ist halt nur eine Konvention, und verschiedene APIs machen es unterschiedlich. Oft wird von oben links ausgegangen weil
Es ist halt nur eine Konvention, und verschiedene APIs machen es unterschiedlich. Oft wird von oben links ausgegangen weil
- die ersten Terminals ihren Text von oben links nach unten rechts ausgegeben haben; und
- die Kathodenstrahlröhren der alten Monitore den Bildschirm von oben links nach unten rechts abtasten
Re: OpenGL UV Koordinaten Oben Links ?
Also denn Wrapper habe ich selbst erstellt. Die Texture wird so geladen
Code: Alles auswählen
Drawing::Rectangle Rect(0,0,width, height);
Drawing::Imaging::BitmapData^ data = image->LockBits(Rect, Drawing::Imaging::ImageLockMode::ReadOnly, Drawing::Imaging::PixelFormat::Format24bppRgb);
glTexImage2D(target, level, internalformat, width, height, border, format, type,(void*) data->Scan0);
image->UnlockBits(data);
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Well, there's your problem, die Scanlines einer System.Drawing.Bitmap sind wohl top-down und nicht bottom-up... ;)
-
- Moderator
- Beiträge: 2157
- Registriert: 25.02.2009, 13:37
Re: OpenGL UV Koordinaten Oben Links ?
Potentiell dumme Frage:
Wenn wir uns mal darauf einigen, dass es relativ wenig Sinn hat, das Bild im Speicher zu visualisieren: ist es dann nicht völlig egal ob ich die Zeile die ich zuerst abtaste als "oben" oder als "unten" bezeichne?
Alternative 1: Ursprung links "oben" und "oberste" Zeile wird zuerst abgetastet.
Alternative 2: Ursprung links "unten" und "unterste" Zeile wird zuerst abgetastet.
Sind die nicht äquivalent?
Wenn wir uns mal darauf einigen, dass es relativ wenig Sinn hat, das Bild im Speicher zu visualisieren: ist es dann nicht völlig egal ob ich die Zeile die ich zuerst abtaste als "oben" oder als "unten" bezeichne?
Alternative 1: Ursprung links "oben" und "oberste" Zeile wird zuerst abgetastet.
Alternative 2: Ursprung links "unten" und "unterste" Zeile wird zuerst abgetastet.
Sind die nicht äquivalent?
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Naja, sie führen for all practical purposes zum selben Ergebnis, genau dort liegt ja, wie bereits erwähnt, der Ursprung der Verwirrung des Threaderstellers. Er hat, ohne es zu merken, die Daten verkehrt rum in die Textur gepackt, beobachtet, dass die Texturkoordinaten sich offenbar verkehrt herum verhalten, was ihn dann zu dem Trugschluss geführt hat, dass das Texturkoordinatensystem wohl doch nicht seinen Ursprung unten links hat... ;)Alexander Kornrumpf hat geschrieben:Alternative 1: Ursprung links "oben" und "oberste" Zeile wird zuerst abgetastet.
Alternative 2: Ursprung links "unten" und "unterste" Zeile wird zuerst abgetastet.
-
- Moderator
- Beiträge: 2157
- Registriert: 25.02.2009, 13:37
Re: OpenGL UV Koordinaten Oben Links ?
Das dachte ich mir ja auch.dot hat geschrieben:Naja, sie führen for all practical purposes zum selben ErgebnisAlexander Kornrumpf hat geschrieben:Alternative 1: Ursprung links "oben" und "oberste" Zeile wird zuerst abgetastet.
Alternative 2: Ursprung links "unten" und "unterste" Zeile wird zuerst abgetastet.
Müsste das nicht zu weniger Verwirrung führen? So wie das row-major column-major weniger verwirrend wird wenn man sich klar macht dass es dasselbe Speicherlayout ist., genau dort liegt ja, wie bereits erwähnt, der Ursprung der Verwirrung des Threaderstellers... ;)
Ich verstehe eben nicht was "verkehrt herum" sein soll. Es scheint mir reine Definitionssache zu sein.dot hat geschrieben: Er hat, ohne es zu merken, die Daten verkehrt rum in die Textur gepackt, beobachtet, dass die Texturkoordinaten sich offenbar verkehrt herum verhalten, was ihn dann zu dem Trugschluss geführt hat, dass das Texturkoordinatensystem wohl doch nicht seinen Ursprung unten links hat... ;)
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Nope, row-major und colum-major bezeichnen gerade verschiedene Speicherlayouts. Erst zusammen mit der Multiplikationsreihenfolge (also ob man Vektoren als Zeilen oder Spalten auffasst) ergibt sich wieder so ein Fall, wo zwei eigentlich unabhängige Dinge am Ende so interagieren, dass das beobachtete Verhalten äquivalent erscheint... ;)Alexander Kornrumpf hat geschrieben:Müsste das nicht zu weniger Verwirrung führen? So wie das row-major column-major weniger verwirrend wird wenn man sich klar macht dass es dasselbe Speicherlayout ist.
-
- Moderator
- Beiträge: 2157
- Registriert: 25.02.2009, 13:37
Re: OpenGL UV Koordinaten Oben Links ?
Das meinte ich. Es ist hier ja genauso. Koordinatenursprung und Abtastreihenfolge sind unabhängig und interagieren.dot hat geschrieben:Nope, row-major und colum-major bezeichnen gerade verschiedene Speicherlayouts. Erst zusammen mit der Multiplikationsreihenfolge (also ob man Vektoren als Zeilen oder Spalten auffasst) ergibt sich wieder so ein Fall, wo zwei eigentlich unabhängige Dinge am Ende so interagieren, dass das beobachtete Verhalten äquivalent erscheint... ;)Alexander Kornrumpf hat geschrieben:Müsste das nicht zu weniger Verwirrung führen? So wie das row-major column-major weniger verwirrend wird wenn man sich klar macht dass es dasselbe Speicherlayout ist.
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Die beiden Dinge sind völlig unabhängige Konzepte, lediglich die Art und Weise, wie sie interagieren führt in zwei verschiedenen möglichen Kombinationen zur gleichen Beobachtung! Am Ende landet der selbe Farbwert an der selben Stelle am Bildschirm. Die Texel, von denen die Farbwerte kommen, liegen aber z.B. immer noch an anderen Speicheradressen, gleich wie die Elemente der Matrix...
Man kann beide Varianten von mir aus als äquivalent im Sinne von "es werden am Ende die selben arithmetischen Operationen mit den selben Werten angestellt" bezeichnen, identisch sind sie aber nicht...
Man kann beide Varianten von mir aus als äquivalent im Sinne von "es werden am Ende die selben arithmetischen Operationen mit den selben Werten angestellt" bezeichnen, identisch sind sie aber nicht...
Re: OpenGL UV Koordinaten Oben Links ?
Ich weiß nicht in wie fern das hier rein passt, ich habe nun eine Funktion erstellt, die so ausseht
Ich übergebe also ein .Net Array, das Array wird so erstellt
aber als ergebniss erhalte ich nicht das bild. Zu der Frage, wie muss ich das Texturen Array Füllen ?
Code: Alles auswählen
void NetGL::OpenGL::Build2DMipmaps(int target, int Level, int Width, int Height, int Format, int Type, array<int>^ data)
{
GLint *n_data = new GLint[data->Length];
for(int i = 0; i < data->Length; i++)
{
n_data[i] = data[i];
}
gluBuild2DMipmaps(target, Level, Width, Height, Format, Type, n_data);
}
Code: Alles auswählen
public int Width { get; set; }
public int Height { get; set; }
public int[] Pixel { get; set; }
public Texture2D(System.Drawing.Bitmap Image)
{
this.Width = Image.Width;
this.Height = Image.Height;
this.ReadPixel(Image);
}
private void ReadPixel(System.Drawing.Bitmap Image)
{
this.Pixel = new int[this.Width * this.Height * 4];
for (int y = 0; y < this.Height; y++)
{
for (int x = 0; x < this.Width; x++)
{
this.Pixel[y * this.Width + x] = Image.GetPixel(x, y).R;
this.Pixel[y * this.Width + x + 1] = Image.GetPixel(x, y).G;
this.Pixel[y * this.Width + x + 2] = Image.GetPixel(x, y).B;
this.Pixel[y * this.Width + x + 3] = Image.GetPixel(x, y).A;
}
}
}
Habe es, so Funktioniert es
Code: Alles auswählen
private void ReadPixel(System.Drawing.Bitmap Image)
{
this.Pixel = new int[this.Width * this.Height];
for (int y = 0; y < this.Height; y++)
{
for (int x = 0; x < this.Width; x++)
{
this.Pixel[y * this.Width + x] = Image.GetPixel(x, y).ToArgb();
}
}
}
- xq
- Establishment
- Beiträge: 1590
- Registriert: 07.10.2012, 14:56
- Alter Benutzername: MasterQ32
- Echter Name: Felix Queißner
- Wohnort: Stuttgart & Region
- Kontaktdaten:
Re: OpenGL UV Koordinaten Oben Links ?
Da ihr hier .NET-Bilder verwendet, flipped die Bilder doch einfach direkt nach dem Laden:
Hier ist der Ladecode aus meinem aktuellen Spiel:
Hier ist der Ladecode aus meinem aktuellen Spiel:
Code: Alles auswählen
private int LoadTexture(string fileName)
{
int tex = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, tex);
using (var bmp = new Bitmap(fileName))
{
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
var data = bmp.LockBits(
new Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp.Width, bmp.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);
}
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
GL.BindTexture(TextureTarget.Texture2D, 0);
return tex;
}
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…
Programmiert viel in
Zig
und nervt Leute damit.
Programmiert viel in