Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

openGL Textur unter Free Basic

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
cadrat



Anmeldungsdatum: 09.08.2008
Beiträge: 14
Wohnort: Jork

BeitragVerfasst am: 13.08.2008, 18:20    Titel: openGL Textur unter Free Basic Antworten mit Zitat

Hallo Ihr,
ich versuche gerade Stormys openGL-Tutorial (http://other.paul-grunewald.de/ogl/) und bleibe bei den Texturen hängen. Die Bibliothek 2d_opengl.bi hab ich in das Quelltextverzeichnis (inc/) entpackt.

Code:
#include "inc/2d_opengl.bi"
dim Textur as GFXType
call load_texture("Y05.bmp", Textur)
glBindTexture GL_TEXTURE_2D, Textur.Handle
glTranslatef 100,100,0
        glBegin GL_QUADS
        glTexCoord2f 0, 0
        glVertex2i  0, 50
        glTexCoord2f 1, 0
        glVertex2i 50, 50
        glTexCoord2f 1, 1
        glVertex2i 50,  0
        glTexCoord2f 0, 1
        glVertex2i  0,  0
glEnd
glLoadIdentity
glBindTexture GL_TEXTURE_2D, 0


Fehlermeldung:'gl2.bas(3) error 135: Only valid in -lang deprecated or fblite or qb, found 'call' in 'call load_texture("Y05.bmp", Textur)

Nächster Versuch mit -lang deprecated kompiliert
Fehlermeldung:/usr/share/freebasic/bin/linux/ld: cannot find -lpng_load_linux

Oder anders gefragt: Wie lade ich ein .bmp (besser .tga laut Empfehlung des Tutorials)
openGL-gerecht? Hat da jemand Erfahrungen?

Gruß und Dank

Stefan


Zuletzt bearbeitet von cadrat am 14.08.2008, 17:13, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 13.08.2008, 18:31    Titel: Antworten mit Zitat

Hi Stefan,

lass mal das call in der Zeile
Code:
call load_texture("Y05.bmp", Textur)

weg. Danach sollte es gehen. Achja, und für Linux müsste ich wohl die png-lib nochmal neu kompilieren. Momentan ist sie nur für Windows hergerichtet.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cadrat



Anmeldungsdatum: 09.08.2008
Beiträge: 14
Wohnort: Jork

BeitragVerfasst am: 13.08.2008, 18:44    Titel: Antworten mit Zitat

Hallo Stormy,

der 'call' ist gelöscht. Nu kömmt:
/usr/share/freebasic/bin/linux/ld: cannot find -lpng_load_linux

... wenn das ein Indiz für die png_lib ist ?

Wäre toll wenn Du deine Bibliothek aktualisieren könntest, dein Tutorial find ich super und würde es gerne bis zum Ende durcharbeiten.

Gruß

Stefan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 13.08.2008, 19:02    Titel: Antworten mit Zitat

Hallo,
also meine Linux-Distri ist gerade kaputt, aber du könntest die Library noch so zum Laufen bekommen (allerdings dann ohne PNG-Support):

Öffne "\inc\2d_opengl.bi" und darin kommentiere folgende Zeilen weg:

Zeile 45-46:
Code:
#include "zlib.bi"
#include "ogl_load_png.bi"


Zeile 64-68:
Code:
ELSEIF extention = "png" THEN
   if (not LoadPNG(@texture, filename)) then   '' Load The Texture
      WriteToConsole "Error: Loading texture... " + filename
      return 1
   end if

_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cadrat



Anmeldungsdatum: 09.08.2008
Beiträge: 14
Wohnort: Jork

BeitragVerfasst am: 14.08.2008, 19:28    Titel: Antworten mit Zitat

Nu geht Dein Beispielcode ohne Fehler durch den Compiler. Leider bleibt das Rechteck leer. Die Größe passt sich aber an das jeweils probehalber geladene tga/ bmp/ jpg an.
Vielleicht hast noch einen Tip?

Code:
' Einbindung von OpenGL
#include once "GL/gl.bi"
#include once "GL/glu.bi"
#include "inc/2d_opengl.bi"

const scrnX = 640
const scrnY = 480
const depth = 32
const fullscreen = &h0           ' Vollbildmodus ( &h0 = aus, &h1 = an )

dim Textur as GFXType

load_texture("xxx.tga", Textur)

screenres scrnX,scrnY,depth,,&h2 OR fullscreen

' Konfiguration von OpenGL
glMatrixMode(GL_PROJECTION)      ' Matrix definieren
glLoadIdentity
glViewport(0,0,scrnX,scrnY)      ' Achse festlegen
glOrtho(0,scrnX,scrnY,0,-128,128)
glMatrixMode(GL_MODELVIEW)       ' Deaktivierung des Rendern der Rückseiten
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
glEnable GL_TEXTURE_2D           ' Texturen aktivieren
glLoadIdentity
glEnable(GL_DEPTH_TEST)          ' Tiefentest
glDepthFunc(GL_LESS)
glEnable(GL_ALPHA_TEST)          ' Alphatest
glAlphaFunc(GL_GREATER, 0.1)

do
   glClear  GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT
   ' !! Hier kommen die Zeichenbefehle rein !!
   glBindTexture GL_TEXTURE_2D, Textur.Handle      ' Texture binden

   glTranslatef 100,100,0       ' z = 0
   glBegin GL_QUADS
        glTexCoord2f 0, 0
        glVertex2i 0, textur.height
        glTexCoord2f 1, 0
        glVertex2i textur.width, textur.height
        glTexCoord2f 1, 1
        glVertex2i textur.width, 0
        glTexCoord2f 0, 1
        glVertex2i 0,  0
   glEnd
   glLoadIdentity
   glBindTexture GL_TEXTURE_2D, 0          ' Texture freigeben
     '
     glFlush ' Verarbeitung der Befehle
     flip
     screensync
loop until multikey(&h01) ' Verlasse die Schleife sobald Escape gedrückt wird
end
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 14.08.2008, 21:14    Titel: Antworten mit Zitat

Hallo Leute, hallo cadrat,

versuch mal, im Bereich von "Konfiguration von OpenGL"
mit dem Befehl glDisable GL_BLEND das Blending
auszuschalten.
Bei mir mußte ich das immer tun.

Aber das soll jetzt nicht heißen, daß Texturen unter Blending
nicht funktionieren. Falls mein Tip zu einem ersten Erfolg
führt, hast du die Richtung, wo du weiter suchen mußt.
Irgendwie fehlen dann noch Einstellungen zu einem
korrekten Blending.

Auf der Seite http://www.freebasic-portal.de/ hab ich ein
Tutorial angefangen, um unter FreeBasic mit OpenGL
zu agieren.
Jedoch fehlt (noch) der Bereich Texturen und Blending,
kommt zwar irgendwann noch dazu, aber du brauchst
es ja gleich.

Hoffe es hilft

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 15.08.2008, 00:09    Titel: Antworten mit Zitat

Hallo,
schau mal in der Konsole, ob da etwas steht von wegen "Error loading texture...". Dass das Viereck weiss ist, deutet darauf hin, dass die Texture nicht geladen wurde. Hast du bei der Textur auch beachtet, dass sie sowohl in der Breite als auch Höhe eine 2er-Potenz hat? Falls du die Grafik in GIMP bearbeitest, solltest du dieses Posting nochmal durchlesen.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cadrat



Anmeldungsdatum: 09.08.2008
Beiträge: 14
Wohnort: Jork

BeitragVerfasst am: 16.08.2008, 19:24    Titel: Antworten mit Zitat

Hallo Ihr,

glDisable GL_BLEND brachte leider keinen Erfolg. Die Konsole meldet ein korrektes Programmende. Zweier Potenz passt (64x64 bzw 128x128), .jpg, .bmp, tga mit Ursprung oben links und ohne hab ich probiert. Ich denke das ist, was Stormy meinte, mit seinem Link. Das weiße Viereck passt immer brav seine Größe an das Bitmap an nur es bleibt weiß. Lediglich die Farbtiefe hab ich mit GIMP nich so steuern können, bietet bei .tga nur pauschal RGB an, kann es daran liegen?

Sollte ich da mal ganz tief in die Bildformate einsteigen? Oder von FreeImage hab ich da was gelesen ... Muss doch irgendwie klappen, vielleicht hab ihr einen Tip in welche Richtung ich da meine Recherchen lenken sollte.

Nachtrag #01: Ich glaube ich fange an die Nuss zu knacken. Ich berichte später lächeln

Nachtrag #02: Es klappt. Ich seh ein Bild eines Baumes auf dem Schirm. happy

Code:
' ╒════════════════════════════════════════════════════════════════════╕
' │                                                                    │
' ╘════════════════════════════════════════════════════════════════════╛
   #include once "GL/gl.bi"
   #include once "GL/glu.bi"
   #include      "inc/2d_opengl.bi"
' ╒════════════════════════════════════════════════════════════════════╕
' │                                                                    │
' ╘════════════════════════════════════════════════════════════════════╛
   dim tex as GFXType
' ╒════════════════════════════════════════════════════════════════════╕
' │                                                                    │
' ╘════════════════════════════════════════════════════════════════════╛
   load_texture("pic/aaa.tga", tex, GL_LINEAR,1)
   screen 20, 32, 2, &H02
' ╒════════════════════════════════════════════════════════════════════╕
' │                                                                    │
' ╘════════════════════════════════════════════════════════════════════╛
   glMatrixMode(GL_PROJECTION)      ' Matrix definieren
   glLoadIdentity
   glViewport(0, 0, 1024 ,768)      ' Achse festlegen
   glOrtho(0 ,1024 ,768 ,0 ,-128 ,128)
   glMatrixMode(GL_MODELVIEW)       
   glEnable(GL_CULL_FACE)
   glCullFace(GL_BACK)
   glEnable (GL_TEXTURE_2D)           ' Texturen aktivieren
   glLoadIdentity
   glEnable(GL_DEPTH_TEST)          ' Tiefentest
'   glDisable (GL_BLEND)
   glDepthFunc(GL_LESS)
   glEnable(GL_ALPHA_TEST)          ' Alphatest
   glAlphaFunc(GL_GREATER, 0.1)
   glClear GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT
' ╒════════════════════════════════════════════════════════════════════╕
' │                                                                    │
' ╘════════════════════════════════════════════════════════════════════╛   
   glGenTextures(1, @tex.Handle)
   glBindTexture GL_TEXTURE_2D, tex.Handle      ' Texture binden
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
   glTexImage2D GL_TEXTURE_2D, 0, 3, _
                tex.Height, tex.Width,0 , tex.textype, _
                GL_UNSIGNED_BYTE, tex.imageData
   glTranslatef 500,100,0       ' z = 0
   glBegin GL_QUADS
        glTexCoord2f 0, 1: glVertex2i 0        , tex.height
        glTexCoord2f 1, 1: glVertex2i tex.width, tex.height
        glTexCoord2f 1, 0: glVertex2i tex.width, 0
        glTexCoord2f 0, 0: glVertex2i 0        , 0
   glEnd
   glLoadIdentity
   glBindTexture GL_TEXTURE_2D, 0          ' Texture freigeben
' ╒════════════════════════════════════════════════════════════════════╕
' │                                                                    │
' ╘════════════════════════════════════════════════════════════════════╛   
     glFlush ' Verarbeitung der Befehle
     flip
     screensync
   do
   loop until multikey(&h01) ' Escape
   end
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 26.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 20.09.2008, 23:42    Titel: Antworten mit Zitat

Hallo!
Sorry,wenn ich den Thread jetzt etwas rauskrame, aber ich hab eigentlich genau das gleiche Problem, wie im erten Post geschildert.
Dann, wenn ich die Datei 2d_opengl.bi importiere, erhalte ich den Fehler:

Zitat:
FreeBASIC\bin\win32\ld.exe: cannot find -lpng_load_windows

Ich verstehe nicht, wie ich dem Fehler entgegenwirken kann. ich hab heute extra die neusete Version von Freebasic runtergeladen etc.
Ich konnte nur herausfinden, dass der Fehler nicht kommt, wenn ich den Code im Ordner Freebasic speichere. Das ist nur sehr ungünstig, da sonst die Übersicht völlig flöten geht. Hoffe, mir kann geholfen werden! xD

Bye!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 21.09.2008, 01:35    Titel: Antworten mit Zitat

Hallo,

schau dir mal meine zweite Antwort an. Damit deaktivierst du den PNG-Support. Allerdings ist das nur notdürftig geflickt.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Lloyd



Anmeldungsdatum: 26.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 21.09.2008, 13:28    Titel: Antworten mit Zitat

Aber, das hieße dann doch, dass ich keine PNGs laden kann, oder? Das wäre schon etwas doof, weil ich hauptsächlich mit denen arbeite.
Allerdings hab ich die Zeilen nun auskommentiert, und es kommt keine Fehlermeldng, deswegen schon mal danke! happy

Trotzdem, wenn ich das doch noch umgehen könnte, wäre das fantastisch!

Hm.... Ich wollte eine Textur ( Bmp ) laden und auf ein Dreieck legen.
In der Console kommt keine Fehlermeldung, weswegen ich davon ausgehe, dass der Fehler nicht beim Laden passiert ist. Evtl. mache ich auch was bei den befehlen für die Textur falsch.
Code:

glBindTexture GL_TEXTURE_2D, Textur(0).Handle
            glBegin GL_Triangles
                glTexCoord2i 0, textur(0).height
                glVertex3i PositionX(i, 1) + PanX , PositionY(i, 1) + PanY, 2
                glTexCoord2i textur(0).width, 1
                glVertex3i PositionX(i, 2) + PanX , PositionY(i, 2) + PanY, 2
                glTexCoord2i textur(0).width, textur(0).height
                glVertex3i PositionX(i, 3) + PanX , PositionY(i, 3) + PanY, 2
            glEnd
            glBindTexture GL_TEXTURE_2D, 0


Die Koordinaten stimmen, das dreieck wird gezeichnet. Nur das ist jetzt vollkommen grün. Die Textur ist übrigens 128x128 Pixel groß. Vielleicht stimmt auch was mit der ordnerangeba nicht:
Code:

Dim Shared As GFXType Textur(0)
load_texture("Texturen/Wall.bmp", Textur(0))

Der ordner Texturen liegt in der gleichen, wie die .bas Datei auch.

Edit:
Hm, ich bräuchte auch die Befehle um Text anzeigen zu lassen und auch eine Eingabe wie Input in eine Variable. Wäre nett, wenn mir das einer sagen könnte!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 21.09.2008, 15:57    Titel: Antworten mit Zitat

Hallo,
zu der PNG-Geschichte: Kopier die Datei libpng_load_windows.a ins Projekt-Verzeichnis. Damit wäre das Problem gelöst.

Zum zweiten Problem:

Schreib mal glEnable GL_TEXTURE_2D nach dem Texturladen.


Zitat:
Hm, ich bräuchte auch die Befehle um Text anzeigen zu lassen und auch eine Eingabe wie Input in eine Variable. Wäre nett, wenn mir das einer sagen könnte!


In meinem Tutorial ist eine - wenn auch langsame - Variante vorgestellt. Im Forum wurde auch eine Routine vorgestellt, die FreeType nutzt. Die Input-Routine könntest du dir damit selbst basteln (Stichwort: INKEY$).
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 21.09.2008, 16:20    Titel: Antworten mit Zitat

hallo Alle, hallo Lloyd,

zu deinen Problemen:
1) Textur wird nicht angezeigt
a)prüfe die Texturkoordinaten, laß per:
Code:

DIM AS INTEGER DateiNr
DateiNr=FreeFile
Open "protokoll.txt" for append as DateiNr
PRINT #Dateinummer, Date & Time & "Texturkoordinaten 1 = 0," & textur(0).height
PRINT #Dateinummer, Date & Time & "              3d-Punkt 1 = 0," & PositionX(i, 1)+PanX & "," & PositionY(i, 1) + PanY & ", 2"
.
.
.
CLOSE DateiNr
''CODE AUS GEDÄCHNTINS, NICHT GETESTET !

die Variableninhalte in eine Datei Schreiben.

Alternativ kannst du in obigem Code die Zeile mit dem OPEN durch folgende Zeile ersetzen:
Code:
 
Open "CONS" for output as DateiNr

dann erscheinen die Ausgaben auf dem Konsolenfenster, das bedeutet auch, daß du dein Programm nicht mit den parametern für Grafikfenster kompilieren darfst, weil dabei das Konsolenfenster dann nicht geöffnet wird und entsprechend deine Variablen nirgends angezeigt werden können.

Es fällt mir noch auf, daß du dein Texturbild erst mit glBindTexture "bindest", um im Nachgang diese Bindung mit parameter "0" zu wiederholen.
Vielleicht lieg ich ja falsch, wenn ich vermute, du willst das Texturieren "An-" und Aus-Schalten", das geht anders:
glEnable GL_Texture_2D schaltet Texturierung ein
glDisable GL_Texture_2D schaltet Texturierung aus
glBindBindTexture bindet ein Texturbild. Solange kein anderes gebunden wird, wird bei jeglichem, nachfolgendem Texturieren dieses Bild verwendet. Diese Bindung muß nicht zwingend aufgehoben werden, wenn man Objekte erstellt, die NICHT texturiert werden sollen, einfach vor solchen Objekten ein glDisable GL_Texture_2D setzen, schon wird nicht mehr Texturiert. Also sind Bind-Befehle erst notwendig, wenn kein oder ein falsches Bild grad gebunden ist.

Wie du schon weißt, arbeite ich grad an dem Tutorial zum Texturieren. Ein erstes Stück ist fertig. Um die Anzeigeoptionen (Umbruch, Einteilung etc.) zu testen, hau ich immer mal ein Stück davon auf meine Benutzer-Seite im FreeBasic-Portal, sozusagen als "Sandbox". Dort steht deshalb ein Stück, wie es laufen kann. Es enthält auch noch ein paar Aufbaufehler, aber das nur im Zusammenhang mit er Tutorial-Ablauf-Reihenfolge, so wie du schon angreifst, kannst du bestimmt einiges aus dem dort stehenden verstehen/verwenden. Klicke einfach: http://www.freebasic-portal.de/index.php?s=userpage&id=156


2) Eingaben:
Schau auf der Portalseite nochmal meine ersten, fertigen Tutorials an, dort frag ich die Tastatur ab, wenn auch (ertst mal) nur die Cursortasten. Geht am besten mit INPUT(1), TextVariable aber ein einziges mal in der GL-Schleife auch mit INKEY. Die Tutorials stehen unter:
http://www.freebasic-portal.de/index.php?s=tutorials&cat=3

3) Anzeigen:
das ist ein kleines Problem. Print, Circle und Co. arbeiten nicht auf einem OpenGL-Fenster. Behilf dich mit dem am Anfang gesagten,
Open "Cons" for output as #DateiNr, um Ausgaben auf dem Konsolefenster auszulösen. Du hast dort zwar keine Grafik, aber um das Programm zu checken ist es völlig ausreichend.

Irgendwann sind meine Tutorials fertig, dann findest du auch die zwei Lösungen, um entweder auf den Anzeigeframe was zu schreiben oder per Textur auf Objekte zu legen.
Falls du es nicht erwarten kannst, soviel kann ich sagen:
du erstellst ein Texturbild, in dem organisiert alle Buchstaben/Zahlen/Zeichen in fiktiven gleich großen Feldern drin sind.
Dann mußt du eine neue Textur anmelden, und innerhalb dem Grafikkartenspeicher aus dem Gesamtbild aller Buchstaben je nach zu schreibendem Text diejenigen in die neu erstellte Textur per OpenGL-Befehl kopieren, die dein Text ergeben. Danach die neue Textur "Binden" und auf ein Objekt setzen.

Nun hoffe ich, daß ich mich halbwegs verständlich ausgedrückt hab
und natürlich, daß es dir hilft

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Lloyd



Anmeldungsdatum: 26.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 21.09.2008, 18:08    Titel: Antworten mit Zitat

Nach langem rumprobieren, bin ch auf den Fehler gekommen. Was sehr simples, was ich aber nicht wusste:
Ich hatte versucht, die Datei zu laden, noch bevor ich einen Bildschirm "erstellt" hatte. Jetzt gehts! \o/

Hm... ich will eigentlich ja nicht ständig wegen kleinigkeiten fragen, gibts irgendwie sowas wie ne Befehlsreferenz dazu? Jetzt müsste ich wissen, wie ich die Textur exakt so wie sie ist, also ohne drehen und verzerren, auf ein Objekt legen kann. Also, dass ich mehrere Dreiecke nebeneinander hab, und diese beispielsweise eine Mauer bilden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 21.09.2008, 19:07    Titel: Antworten mit Zitat

hallo Alle, hallo Lloyd,

hab grad eben wieder eine erweiterte Version des Textur-Tuts in die Sandbox gespeichert, da ist das was du meinst beschrieben, wenn auch (noch) sehr einfach.

selbst auf die Gefahr hin, daß du das sowieso schon weißt, folgende Hinweise:

a) ohne verdrehen: das kriegst du hin lächeln
- Du legst für jeden Objekt-3D-Punkt je einen Punkt auf dem Texturbild an.
- Schaue (virtuell) immer von außen her auf dein Objekt im 3D-Raum auf die zu texturierende Fläche.
- So, wie du die Punkte auf deiner Objektfläche siehst, positionierst du dann die Punkte auf dem Texturbild.
- also, was auf der Objektfläche links oben ist, ist auf dem Texturbild auch links oben (der gesetzte Punkt), für rechts unten auf dem Objekt gleichfalls den Punkt rechts unten auf dem Texturbild setzen.
b) nicht verzerren/Verziehen
- wenn du (virtuell) alle auf dem Texturbild gesetzten Punkte mit Strichen verbindest, sollte die gleiche Form zu sehen sein, wie sie die zu texturierende Fläche hat.
Wenn du also eine sternförmige Fläche texturierst, dann müssen die mit virtuellen Strichen verbundenen Punkte auf der Textur genau diesen Stern auch zeigen.
c) verkleinern/vergrößern
- das gibt es nicht, bzw. ist immer unabstellbar vorhanden. Wenn du z.B. ein Viereck texturierst und auf dem Texturbild das gleiche Viereck mit den Punkten abbildest, stimmts schon.
- Ob das Texturbild nun beim Anzeigen auf dem Objekt/Monitor vergrößert oder verkleinert werden muß, hängt in erster Linie von dem Abstand zwischen "Kamera" und Objekt ab.
- Klar, wenn du eine 256x256-Pixel-Textur auf dein Viereck klebst, ist es bei Kamera-nah-dran viel detailreicher, als z.B. eine 64x64-Pixel-Textur. Aber das liegt in der Natur der Sache.
-Sicher kannst du auch vom Texturbild per Punkte-Setzen nur das linke obere Viertelsquadrat der Fläche auf dein viereckiges Objekt setzen, anstatt das gesamte Texturbild in voller Größe draufkleben, wenn man dein Objekt nur aus weiter Ferne sieht, kann das Sinn machen
-Das Gegenteil davon ist, dein Objekt sieht man sehr nah. Dabei ist eine hochauflösende Textur sinnvoll. Um (Textur-)Speicher zu sparen kannst du für solche Fälle Texturbilder verwenden, die man mehrfach nebeneinander kleben kann, also der rechte Rand des Bildes an den Linken paßt und der Obere auch an den Unteren Rand. So eine quadratische Textur auf deine quadratische Objektseite fünf mal nebeneinander und davon 5 Reihen untereinander kleben geht mit Texturkoordinaten 5.0, 5.0

Was so mancher (ich auch) im Anfang nicht gleich erkennt, man muß nicht für jede zu texturierende Fläche eine eigenes Texturbild an OpenGL schicken. Ein Bild einmal an OpenGL schicken und auf z.B. 20 Flächen kleben ist normal. Sobald man die gl_Beginn Schleife beendet kann man eine nächste Schleife beginnen und mit jetzt anders gesetzten Texturpunkten auf demselben Texturbild ein ganz anderes Objekt tapezieren.

Noch ein Hinweis, bezüglich "richtigrum". Wenn du (wie in meinem Tut) Bitmap-Bilder per BLOAD in den Ram kopierst, sind Oben und Unten im Ram und ergo dann auch auf der Grafikkarte vertauscht/gespiegelt. Das liegt am Speicherformat von Bitamp-24bit, mit welchem FreeBasic in einem solchen Fall arbeitet.
Solltest du mit Bitmap-Dateien arbeiten, dann hast du zwei Möglichkeiten:
1) vor dem Übergeben an OpenGL im Ram zurückspiegeln (empfohlen)
2) Bei jeglichem Setzen von Texturpunkten ebenfalls Oben und Unten vertauschen (nicht empfohlen, zuviel Durcheinander)

hoffe, ich hab mich einigermaßen verständlich ausgedrückt

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Lloyd



Anmeldungsdatum: 26.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 21.09.2008, 19:57    Titel: Antworten mit Zitat

Nunja, ich hatte mir das so vorgestellt:
Ich hab eine Art Teppich oder Fliesen aus der Textur. Also so, dass sie sich in allen Richtungen wiederholt.
Nun hab ich mehrere Objekte, die diese Textur bekommen sollen.
Hier mal ein Bild ( zugegeben, etwas übertrieben, aber ich denk, es wird klar, was gemeint ist. )


Hoffe, mir kann geholfen werden! ^.^°

Achja, ich bin jetzt erstmal für ne Woche auf klassenfahrt, deswegen ist es nicht mehr so dringend...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 24.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 21.09.2008, 21:09    Titel: Antworten mit Zitat

hallo Lloyd,

in deinem Beispiel fällt mir Eines auf:
du verwendest die Befehle von OpenGL glTexCoord2i und glVertex3i.

Dazu ist zu sagen, daß die Endung i für INTEGER steht.
Das bedeutet, auch wenn du 1.235 übergibst, OpenGL nimmt dafür den Wert 1. (Integer heißt Ganzzahlen = keine Kommastellen)

Für Texturen gibt man die Positionen der Punkte auf den Bildern Werte von 0 bis 1 mit Kommastellen an, die Mitte des Bildes ist also 0.5 , 0.5

Wenn du dem Befehl glTexCoord mit der Endung 2 und i also sagst, du kriegst 2 Parameter als Ganzzahlen, dann werden deine Kommastellen verschluckt.

Für 3D-Pos und Textur verwende ich immer die Endung f für Float = Floatingpoint = Kommazahlen.
Somit sollten deine Befehle:
glTexCoord2f
glVertex3f
heißen.

Für die Umsetzung deiner beiden Dreiecke auf die Textur gilt folgendes Schema:


Die wirklichen Positionswerte für X und Y auf der Textur kriegst du bestimmt selber hin, sind ja genau genommen die Positionen in der 3D-Welt, nur halt umzurechnen auf Kommawerte zwischen 0 und 1, solange du das Dreieck mit dem Bild 1:1 belegen willst.

Hoffe es hilft

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz