Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

1

04.10.2007, 17:50

Transparente Pixel herausfinden

Hallo, David Scherfgen hatte ja seine GUI so programmiert, das wenn ein Klick ausgelöst wurde in einem Rechteck um den Button geprüft wurde, ob er angewählt wurde:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if((pEntry->Data->m_iPage == m_iCurrentPage || pEntry->Data->m_iPage == -1) &&
               pEntry->Data->m_bVisible &&
               pEntry->Data->m_bEnabled &&
               m_vCursorPos.x > pEntry->Data->m_vPosition.x &&
               m_vCursorPos.y > pEntry->Data->m_vPosition.y &&
               m_vCursorPos.x < pEntry->Data->m_vPosition.x + pEntry->Data->m_vSize.x &&
               m_vCursorPos.y < pEntry->Data->m_vPosition.y + pEntry->Data->m_vSize.y)
            {

Ich wollte jetzt noch eine weitere Abfrage reinbringen, denn mit der bisherigen Lösung konnte man z.B. ein Objekt haben, dass Rund ist und es würde angewählt, obwohl sich der Cursor nicht über ihm befindet. Deshalb wollte ich vorher abfragen, welche Farbe dieser Pixel an dieser Stelle hat um gegebenenfalls den Klick nicht weiterzuleiten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tbDraw2D* hallo = new tbDraw2D;
D3DCOLOR Farbe;
if(hallo->Init(m_Skin.pSkinTexture, 0)) TB_INFO("FEHLLLLER");
hallo->BeginDraw(NULL, D3DLOCK_READONLY);


Farbe = hallo->GetPixel((m_vCursorPos-pEntry->Data->m_vPosition+pEntry->Data->m_vTextureCoords).x, (m_vCursorPos-pEntry->Data->m_vPosition+pEntry->Data->m_vTextureCoords).y);
if(Farbe == 0)
{
    pEntry->Data->m_bPressed = FALSE;       
}
else
{   pEntry->Data->m_bPressed = TRUE;
}


Mein Problem ist jetzt das dieser Weg auch wunderbar funktioniert, wenn die Textur eine Größe von 512*512 Pixeln besitzt. Ich brauche jetzt aber eine mit 768*768 Pixeln und da funktioniert das ganze komischerweise nicht mehr. Bei dieser Größe ist der Fall if(Farbe == 0) bei mir noch nicht eingetroffen. Weiß jemand von euch vielleicht den Fehler oder woran es liegen könnte?
Vielen Dank für eine Antwort,
viele Grüße
Andreas[/cpp]

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

2

04.10.2007, 22:36

ich weiß nicht obs dadran liegt, aber es gibt grafikkarten die nur texturen mit 2er potenzen unterstüzen.
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

04.10.2007, 23:21

Tun sie das nicht alle? :P Zumindest laut Spezifikation!
@D13_Dreinig

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

4

05.10.2007, 14:01

Hallo,
vielen Dank für eure Antwort,
ich habs dann mit einer Textur mit einer Größe von 1024*1024 verscucht und dann ging es wieder, also wird es wahrscheinlich daran gelegen haben.

Dann hab ich aber nochmal eine neue Frage:
Ich konnt doch bisher Texturen bei mir verwenden, die weder Quadratisch noch 2er Potenzen waren, warum stellt sich die Grafikkarte denn dann bei tbDraw2D so schräg?
Eine GUI Textur mit 1024*1024 ist auch schon recht groß, gibts noch ne andere Möglichkeit, 768*768 zu behalten und troztdem die Funktionalität zu erhalten?

Viele Grüße
Andreas

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

05.10.2007, 14:04

Zitat

Tun sie das nicht alle? :P Zumindest laut Spezifikation!


!?

@topic: evtl. verwendet das ding intern D3DXCreateTextureFromFile(Ex). die funktion tut die textur beim laden unter bestimmten umständen auf eine passende pow2 textur packen. näheres dazu (und wie man es abstellen kann) findest du in der dx sdk doku bei der beschreibung eben dieser funktion ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

05.10.2007, 14:41

Zitat von »"dot"«

Zitat

Tun sie das nicht alle? :P Zumindest laut Spezifikation!


!?


:!: Eben, normal werden "unpassende" Texturen so vorbereitet das sie eine passende Dimension haben.
@D13_Dreinig

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

7

05.10.2007, 15:13

Heißt das jetzt,
ob ich meine Textur auf 1024*1024 vergrößere oder sie bei 768*768 belasse, es wird trotzdem gleichviel GrafikartenSpeicher verwendet?
Dann ist es also egal, ob ich sie vergrößere oder nicht?
Viele Grüße
Andreas

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

05.10.2007, 15:14

ne keine angst. jede halbwegs moderne graka kommt auch mit non power of 2 texturen zurecht.

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

9

05.10.2007, 15:19

eigentlich zähle ich meine GForce FX 5200 noch zu den einigermaßen neueren, warum funktiniert das denn dann da nicht?

liegt das daran:

Zitat

Width
[in] Width in pixels. If this value is zero or D3DX_DEFAULT, the dimensions are taken from the file and rounded up to a power of two. If the device supports non-power of 2 textures and D3DX_DEFAULT_NONPOW2 is specified, the size will not be rounded.


Wenn ich das richtig verstanden habe muss ich D3DX_DEFAULT_NONPOW2 angeben, dann würde es funktinieren?

Wenn es so ist, eine Frage noch, wo muss ich das dann hischreiben?

Viele Grüße Andreas

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

05.10.2007, 15:20

sofern deine graka das unterstützt. bei ner geforce fx wär ich mir da nicht so sicher^^

Werbeanzeige