Seite 2 von 5

Re: Wozu dient CreateTexture()?

Verfasst: 05.08.2011 12:18
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.

Re: Wozu dient CreateTexture()?

Verfasst: 05.08.2011 22:17
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

Re: Wozu dient CreateTexture()?

Verfasst: 05.08.2011 22:25
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.

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 07:27
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?

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 08:39
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.

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 09:03
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.

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 09:29
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.

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 09:46
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.

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 09:59
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.

Re: Wozu dient CreateTexture()?

Verfasst: 06.08.2011 10:25
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... ;)