Wozu dient CreateTexture()?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Wozu dient CreateTexture()?

Beitrag von DarkDragon »

Danilo hat geschrieben:
DarkDragon hat geschrieben:Man sollte sowas sowieso nicht verwenden. Dafür gibt es Shader!
Kannst Du bitte mal ein Beispiel geben wie man damit
zeichnen kann? Ein Kreis mit Strich durch und darüber
den Text "Hallo PB!" bitte.
Hier:
http://www.bradan.eu/files/drawing_shader.zip
Getestet mit PureBasic 4.60 Beta 3 - 64bit.

Nachtrag: hier noch ein Bild davon
Bild

Wie ich bereits erwähnte fehlt jedoch noch eine Möglichkeit, uniform variablen von PB aus zu definieren, d.h. die Zeit variable ist von OGRE vorgegeben, nicht von PB. Üblicherweise würde man aber eine statische Textur für den Text verwenden, sonst hat man für jeden Buchstaben pro Fragment einen Texturzugriff (auf alten Grafikkarten werden bei einem Branch beide Zweige ausgerechnet und erst danach wird entschieden welcher Zweig genommen wird).
Danilo hat geschrieben:Es gibt aber auch bei DirectX9 die Möglichkeit in eine Texture zu
zeichnen. Dafür gibt es IDirect3DTexture9::LockRect und
IDirect3DTexture9::UnlockRect. LockRect gibt dabei einen
Pointer direkt zu den Bits und den Pitch zurück.
Und mit IDirect3DDevice9::UpdateTexture kann man eine
Texture vom System-Speicher in eine Texture kopieren die
im Pool/Videospeicher ist.
Ja, aber das was hier mit TextureOutput() gemacht wird ist alles auf der CPU und nie auf der GPU ;-) . D.h. viele Neulinge tappen in die Falle und Zeichnen andauernd eine neue Textur. Das ist bei wenigen Texturen nicht weiter schlimm, aber wenn es dann mal ausartet kommen hier auf einmal 1320193201031239012 Topics über "PureBasic ist zu langsam". Das will ich verhindern und deshalb ist mir das Fehlen der Funktion grad recht. Wenn es sowas in der Art wie Render-to-Texture gibt, dann kann man darüber reden, aber vorher nicht. Doch ich glaube Fred würde es wenn überhaupt wieder über die CPU laufen lassen. Ich kenne auch kaum eine Situation in der man nicht-statische Texturen in so einer Art benötigt. Demo/Introszene kann man mit OGRE doch sowieso vergessen ("Engine3D.dll"), also gibt es auch keinen Grund nicht auf Dateien auszuweichen. Eine Laufschrift würde man z.B. auf andere Art und Weise machen: einen animierten Texturlayer mit einer statischer Textur.

@Vermilion:
CreateThread könnte garnicht so einfach gehen, weil die Grafikkarte keine x86 oder amd64 Einheit besitzt, sondern etwas völlig anderes.

[EDIT]
Ich überlege mir gerade .. über Lights könnte man Shader variablen momentan sogar setzen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Wozu dient CreateTexture()?

Beitrag von PMV »

@DarkDragon
Ich hab nur nen schwarzes Bild bei dem Code mit der
PB 4.60 x64 ... in der OGRE.log steht aber leider nix
von wegen Fehler oder so drinn. Falls willst kann ich dir
die aber geben.

Danilo hat geschrieben:Es gibt aber auch bei DirectX9 die Möglichkeit in eine Texture zu
zeichnen. Dafür gibt es IDirect3DTexture9::LockRect und
IDirect3DTexture9::UnlockRect. LockRect gibt dabei einen
Pointer direkt zu den Bits und den Pitch zurück.
Und mit IDirect3DDevice9::UpdateTexture kann man eine
Texture vom System-Speicher in eine Texture kopieren die
im Pool/Videospeicher ist.
OGRE3D bietet auch die Möglichkeit, Texturen zur Laufzeit mit wenigen
Befehlen zu ändern. Doch die Frage ist, ob die Verbindung
PB-Sprite-Lib und OGRE3D-Texture wirklich sinnvoll ist.
Oder vielleicht war es Fred auch zu viel, das um zu setzen
in angemessener Zeit.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Wozu dient CreateTexture()?

Beitrag von Falko »

Bei mir läuft es unter PB 4.6Beta3 in 64-Bit als auch in X86.
Schöne Demo der sich drehenden Zeiger :)


....
22:23:11: WARNING: Cube.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
22:23:11: Texture: font.png: Loading 1 faces(PF_A8R8G8B8,512x64x1) with hardware generated mipmaps from Image. Internal format is PF_A8R8G8B8,512x64x1.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Wozu dient CreateTexture()?

Beitrag von Danilo »

Ich sehe nur eine graue Box (wohl das Mesh), aber ohne Textur. Die OGRE.log
enthält verschiedene Fehlermeldungen:

Code: Alles auswählen

19:45:44: Parsing script CubeMaterial.material
19:45:44: OGRE EXCEPTION(3:RenderingAPIException): Cannot assemble D3D9 high-level shader cubeTestPS/HLSL Errors:
(29): error X3500: asymetric returns from if statements not yet implemented
 in D3D9HLSLProgram::loadFromSource at OgreD3D9HLSLProgram.cpp (line 199)
19:45:44: High-level program cubeTestPS/HLSL encountered an error during loading and is thus not supported.
OGRE EXCEPTION(3:RenderingAPIException): Cannot assemble D3D9 high-level shader cubeTestPS/HLSL Errors:
(29): error X3500: asymetric returns from if statements not yet implemented
 in D3D9HLSLProgram::loadFromSource at OgreD3D9HLSLProgram.cpp (line 199)
19:45:44: OGRE EXCEPTION(2:InvalidParametersException): Named constants have not been initialised, perhaps a compile error. in GpuProgramParameters::_findNamedConstantDefinition at OgreGpuProgram.cpp (line 1087)
19:45:44: Compiler error: invalid parameters in CubeMaterial.material(20): setting of constant failed
19:45:44: Finished parsing scripts for resource group General
19:45:44: Parsing scripts for resource group Internal
19:45:44: Finished parsing scripts for resource group Internal
19:45:44: Mesh: Loading Cube.mesh.
19:45:44: WARNING: material CubeMaterial has no supportable Techniques and will be blank. Explanation: 
Pass 0: Fragment program cubeTestPS cannot be used - not supported.
Welche genauen Systemvoraussetzungen hat denn das Beispiel?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Wozu dient CreateTexture()?

Beitrag von DarkDragon »

Danilo hat geschrieben:Ich sehe nur eine graue Box (wohl das Mesh), aber ohne Textur. Die OGRE.log
enthält verschiedene Fehlermeldungen:

Code: Alles auswählen

19:45:44: Parsing script CubeMaterial.material
19:45:44: OGRE EXCEPTION(3:RenderingAPIException): Cannot assemble D3D9 high-level shader cubeTestPS/HLSL Errors:
(29): error X3500: asymetric returns from if statements not yet implemented
 in D3D9HLSLProgram::loadFromSource at OgreD3D9HLSLProgram.cpp (line 199)
19:45:44: High-level program cubeTestPS/HLSL encountered an error during loading and is thus not supported.
OGRE EXCEPTION(3:RenderingAPIException): Cannot assemble D3D9 high-level shader cubeTestPS/HLSL Errors:
(29): error X3500: asymetric returns from if statements not yet implemented
 in D3D9HLSLProgram::loadFromSource at OgreD3D9HLSLProgram.cpp (line 199)
19:45:44: OGRE EXCEPTION(2:InvalidParametersException): Named constants have not been initialised, perhaps a compile error. in GpuProgramParameters::_findNamedConstantDefinition at OgreGpuProgram.cpp (line 1087)
19:45:44: Compiler error: invalid parameters in CubeMaterial.material(20): setting of constant failed
19:45:44: Finished parsing scripts for resource group General
19:45:44: Parsing scripts for resource group Internal
19:45:44: Finished parsing scripts for resource group Internal
19:45:44: Mesh: Loading Cube.mesh.
19:45:44: WARNING: material CubeMaterial has no supportable Techniques and will be blank. Explanation: 
Pass 0: Fragment program cubeTestPS cannot be used - not supported.
Welche genauen Systemvoraussetzungen hat denn das Beispiel?
Aufgrund der vielen arithmetischen Operationen ShaderModel 3.0 und DirectX 9. Das dürfte aber auch kein Problem mehr darstellen.

Deinen Fehler bekomme ich allerdings nur dann, wenn ich den Code mit PB 4.51 kompiliere. Mit PB 4.60 beta 3 funktioniert es.

Nichtsdestotrotz hab ich mal den Fehler für PB 4.51 behoben:
[URSPRÜNGLICHER LINK NACHTRÄGLICH ENTFERNT - FUNKTIONIERENDE VERSION HIER: http://www.bradan.eu/files/drawing_shader.zip]

So sollte es nun wirklich gehen. :)

@PMV: Ich glaube dein Problem ist dasselbe.
Zuletzt geändert von DarkDragon am 07.08.2011 10:32, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Wozu dient CreateTexture()?

Beitrag von Danilo »

DarkDragon hat geschrieben:Deinen Fehler bekomme ich allerdings nur dann, wenn ich den Code mit PB 4.51 kompiliere. Mit PB 4.60 beta 3 funktioniert es.
Ja, ich habe die letzte Final 4.51. Deshalb fragte ich nochmal
nach den Mindestvoraussetzungen, da ich nicht das Beta-Test-Zeugs
nutze.
DarkDragon hat geschrieben:Nichtsdestotrotz hab ich mal den Fehler für PB 4.51 behoben:
http://www.bradan.eu/files/drawing_shader2.zip

So sollte es nun wirklich gehen. :)
Vielen Dank! Jetzt sind alle Fehler in der OGRE.log weg -
aber ich sehe nur einen schwarzen Bildschirm, so wie PMV.

So wie früher würde es schon überall laufen: :D

Code: Alles auswählen

If StartDrawing( TextureOutput(0) )
    Circle(127,127,120,RGB($FF,$FF,$00))
    LineXY(127,127,0,127,RGB($00,$00,$FF))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10,10,"Hallo, PB!")
    StopDrawing()
EndIf
Und nun nur Probleme... und statt 7 Zeilen einfachsten Code
100 Zeilen Shader-Code und ein Bitmap für den Font.

Verstehe mich nicht falsch, ich finde das alles gut und schön.
Aber ich finde die zusätzliche Möglichkeit mit TextureOutput()
ist handlicher.
Ich habe etliche Bücher für DirectX7/8/9/10/11, und in jedem wird
gezeigt wie man direkt in die Texture zeichnet, weil das einfach
jeder benutzt und normalerweise jede Engine unterstützt.
Das macht MS auch nicht einfach aus DX raus, keine Angst.
LoadTexture() macht doch auch nichts anderes als ein Bild zu
laden und dann in den gelockten Speicher der Texture zu zeichnen/kopieren.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Wozu dient CreateTexture()?

Beitrag von DarkDragon »

Danilo hat geschrieben:
DarkDragon hat geschrieben:Deinen Fehler bekomme ich allerdings nur dann, wenn ich den Code mit PB 4.51 kompiliere. Mit PB 4.60 beta 3 funktioniert es.
Ja, ich habe die letzte Final 4.51. Deshalb fragte ich nochmal
nach den Mindestvoraussetzungen, da ich nicht das Beta-Test-Zeugs
nutze.
DarkDragon hat geschrieben:Nichtsdestotrotz hab ich mal den Fehler für PB 4.51 behoben:
http://www.bradan.eu/files/drawing_shader2.zip

So sollte es nun wirklich gehen. :)
Vielen Dank! Jetzt sind alle Fehler in der OGRE.log weg -
aber ich sehe nur einen schwarzen Bildschirm, so wie PMV.
Hmm das ist seltsam.
Danilo hat geschrieben:So wie früher würde es schon überall laufen: :D

Code: Alles auswählen

If StartDrawing( TextureOutput(0) )
    Circle(127,127,120,RGB($FF,$FF,$00))
    LineXY(127,127,0,127,RGB($00,$00,$FF))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10,10,"Hallo, PB!")
    StopDrawing()
EndIf
Und nun nur Probleme... und statt 7 Zeilen einfachsten Code
100 Zeilen Shader-Code und ein Bitmap für den Font.
Du verstehst aber hoffentlich meinen Einwand. Ich kann mich noch erinnern, in einem früheren PureBoard, als ich anfing mit dem ganzen Zeug hast du mir mal dasselbe über Texturen gesagt wie ich oben: eine Textur wird nur einmal geladen, nicht bei jedem Frame ;-) . Und wenn man nun StartDrawing erlaubt kommen plötzlich lauter Leute auf dieselbe Idee wie ich damals und meinen man könne ja jeden Frame 1213310 neue Texturen erstellen und in die GPU laden, auf jeder Wand ne andere Uhrzeit oder so :lol: .
Danilo hat geschrieben:Verstehe mich nicht falsch, ich finde das alles gut und schön.
Aber ich finde die zusätzliche Möglichkeit mit TextureOutput()
ist handlicher.
Ich habe etliche Bücher für DirectX7/8/9/10/11, und in jedem wird
gezeigt wie man direkt in die Texture zeichnet, weil das einfach
jeder benutzt und normalerweise jede Engine unterstützt.
Das macht MS auch nicht einfach aus DX raus, keine Angst.
LoadTexture() macht doch auch nichts anderes als ein Bild zu
laden und dann in den gelockten Speicher der Texture zu zeichnen/kopieren.
Ja, das ist mir alles klar, aber der Flaschenhals zur GPU wird ja auch immer mehr entlastet. Erst vor einiger Zeit gab es das hier: Bindless Graphics.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Wozu dient CreateTexture()?

Beitrag von Danilo »

DarkDragon hat geschrieben:Du verstehst aber hoffentlich meinen Einwand.
Ja, ich denke ich verstehe schon. Ich bin nur nicht der Meinung
das man TextureOutput() verdammen sollte, weil es evtl. Jemand
mal "falsch" benutzt.
Ich mache mir auch keine Sorgen das hier bald 1320193201031239012
Topics auftauchen wegen Geschwindigkeitsproblemen mit TextureOutput().
So viele neue User sehe ich hier demnächst nicht ankommen. Wirklich.

Aber egal. Der Befehl wurde einfach rausgenommen und ein PB-SDK mit
nützlichen Informationen gibt es nicht, sonst hätte ich mich schonmal
drangesetzt... ;)
So kann man einiges bei PB nicht erweitern, was Fred und freak nicht
können oder wollen. Firmenpolitik. Muß man nicht verstehen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Wozu dient CreateTexture()?

Beitrag von DarkDragon »

Danilo hat geschrieben:
DarkDragon hat geschrieben:Du verstehst aber hoffentlich meinen Einwand.
Ja, ich denke ich verstehe schon. Ich bin nur nicht der Meinung
das man TextureOutput() verdammen sollte, weil es evtl. Jemand
mal "falsch" benutzt.
Ich mache mir auch keine Sorgen das hier bald 1320193201031239012
Topics auftauchen wegen Geschwindigkeitsproblemen mit TextureOutput().
So viele neue User sehe ich hier demnächst nicht ankommen. Wirklich.

Aber egal. Der Befehl wurde einfach rausgenommen und ein PB-SDK mit
nützlichen Informationen gibt es nicht, sonst hätte ich mich schonmal
drangesetzt... ;)
So kann man einiges bei PB nicht erweitern, was Fred und freak nicht
können oder wollen. Firmenpolitik. Muß man nicht verstehen.
Rein aus interesse würde ich mir auch mal die neuen Ogre Sources von PB ansehen. In der Hilfe steht immernoch:
PureBasic Hilfe hat geschrieben:[...] Weitere Informationen sind auf der OGRE Website verfügbar. Die OGRE Lizenz kann hier eingesehen werden und die an PureBasic angepassten OGRE Sourcecodes können hier heruntergeladen werden. [...]
Aber das sind leider die alten Sources von PB ~3.94, es wird kein Makefile, CMake Instruction-File o.ä. mitgeliefert und die Readme ist auf Französisch.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Wozu dient CreateTexture()?

Beitrag von Danilo »

DarkDragon hat geschrieben:Rein aus interesse würde ich mir auch mal die neuen Ogre Sources von PB ansehen.
Ich glaube es gibt Interessanteres. Dich interessieren doch immer die neuesten
Entwicklungen auf diesem Gebiet - aber bei Dir mehr (nur?) OpenGL?

Ich schau mir jetzt mal DX10 und 11 an, die sind wieder ganz anders
als DX9. Hab gestern paar Bücher dazu bekommen und muß mir jetzt
noch eine aktuellere DX11 Graka mit Shader5.0 bestellen.
In DX10 wurde die "fixed-function pipeline" entfernt, d.h. man setzt
keine States mehr über das limitierende DirectX-API (z.b. 8 Lichter über
einen DX-Call). Nun geht alles über Shader.
DirectX10 also ein major cut nach DX9. Und DX11 mehr eine Erweiterung
von DX10/10.1.
Und seit DirectX11: DirectCompute, das API für generelle multithreading
Berechnungen über die GPU, z.B. Physik, Videokompression, Audioverarbeitung usw.

Das klingt doch besser als dieses uralte DirectX9... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten