 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 30.10.2004, 10:37 Titel: [Texturkoordinaten] Texturenkord werden falsch gesetzt |
|
|
Hi,
ich schreibe gerade an einem Objekt, mit dem man einen Quader darstellen kann. Dazu benutze ich eine Textur die so aussieht:
Das kleine Stück soll die z Koordinate vom Quader sein, das lange die x.
Jetzt berechne ich die Texturkoordinaten mit:
(2 * iDepth + 2 * iWidth) / iDepth = 1 / float fTextureWidthSmall -->
float fTextureWidthSmall = iDepth / (2 * iDepth + 2 * iWidth);
float fTextureWidthLarge = iWidth / (2 * iDepth + 2 * iWidth);
Doch anscheinden hat diese Zahl zu wenig Nachkommastellen (0.166667/0.6666666666), den die Texturen verlaufen an den Kanten:
Kann ich das irgendwie anderst aufbauen? _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.10.2004, 11:08 Titel: |
|
|
nein, das sieht ziemlich normal aus, da die Texturkoordinaten interpoliert wird. Du könntest die Texturfilter ausschalten, oder zwei getrennte Texturen benutzen.
[Edit]
Obwohl: von Pink nach rot siehts ja besser aus, weiß auch nicht warum
[/Edit] _________________ https://jonathank.de/games/
Zuletzt bearbeitet von Jonathan_Klein am 30.10.2004, 11:10, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.10.2004, 11:09 Titel: |
|
|
Das die Texturen an den Kanten verlaufen, hat wohl mit der Filterung zu tun. Welche Filtermethode hast du denn eingestellt?
C. |
|
Nach oben |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 30.10.2004, 11:13 Titel: |
|
|
sieht nach üblichem D3DTEXF_LINEAR aus... |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.10.2004, 11:30 Titel: |
|
|
wenn alles in einer Textur bleiben soll, könnte man natürlich die Textur ein Stück verkürzen, also auf dem Würfel. So würde sie noch etwas mehr gestreckt, aber man würde die Übergänbge nicht mehr sehen.
Außerdem sollte das bei richtig Texturierten Objekten nicht mehr soo auffallen, man siehts ja größtenteils deshalb, weils einfarbig ist. Und bei einfarbigen Sachen kann man Vertexfarben nehmen, oder läßt bei der Textur die Filter weg. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 30.10.2004, 17:58 Titel: |
|
|
Welchen Stat muss ich für eine Texur benutzen, damit das Objekt nur da vom Licht erfasst wird, wo es auch auftrifft? _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 30.10.2004, 18:14 Titel: |
|
|
Du meinst Pixelgenaue Beleuchtung?
Also die geht nicht einfach so per State. Entweder benutz du Shader, Lightmaps oder Beleuchtung auf Vertexbasis(statt einem Großen Dreieck viele kleine, bis die genauigkeit hoch genug ist, dafür gibts ein Beispiel in der DX Doku) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.10.2004, 18:18 Titel: |
|
|
Du musst Normalen angeben und die Beleuchtung einschalten. Das andere Problem kannst du lösen, indem du mit mehreren Texuren arbeitest oder ich erinnere mich dunkel, dass es eine DX-Funktion gibt, mit der du Bereiche auf der Textur als einzelne Texuren definieren kannst, damit nicht zwischen den Bereichen gefiltert wird. Wer weiss wie die Fkt heisst, bitte melden.
C. |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 30.10.2004, 18:42 Titel: |
|
|
Ich habe normale, und eine Beleuchtung. Kann das am Material liegen?
Wenn ich mit mehreren Texturen arbeite kostet das Performance, oder? _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling
Zuletzt bearbeitet von abc_d am 30.10.2004, 18:46, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 30.10.2004, 18:44 Titel: |
|
|
Alles zusätzliche kostet Performance ^^ |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 30.10.2004, 18:47 Titel: |
|
|
Ok, ich formuliere die Frage anderst: kostet es viel Performance wenn ich statt 1er Texur 9,10 verwende? Da ist die aktuelle Methode doch viel schneller?
Merkwürdig, wenn ich bei SetLight true angebe wird das objekt nicht angezeigt, bei false schon! Schaltet DX auf ein anderes Licht um, wenn kein Licht exisitert? ( wenn ich m_lpD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1); aktiviere ist es immer hell)
Code: |
//Sets the light
void bn_Scene::SetLight(bool bState)
{
//Sets the light nr. 0
m_lpD3DDevice->SetLight(0,&m_Light);
m_lpD3DDevice->LightEnable(0,bState);
m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,bState);
//Sets the member var
m_bLightState = bState;
}
|
_________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 30.10.2004, 19:01 Titel: |
|
|
BlackLordOfDragons hat Folgendes geschrieben: | Ok, ich formuliere die Frage anderst: kostet es viel Performance wenn ich statt 1er Texur 9,10 verwende? Da ist die aktuelle Methode doch viel schneller? |
Ja. es kostet mehr Performance wenn man 10 kleine Texturen, anstatt einer großen verwendet. (edit: zumindest beim Laden... aber später auch. Denn das bedeutet mehr Texture Switches. Und davon wollen wir ja so wenig wie möglich haben.)
Aber du kannst ja einfach eine große Textur über mehr als 2 Dreiecke legen.
Wenn du z.B 8 Dreiecke(also 4 Quads - siehe Bild ) verwendest bekommt der Vetex in der Mitte die Texturkoordinaten 0.5, 0.5 .
Code: |
0.0, 0.0 ----0.5, 0.0---- 1.0, 0.0
| | |
| | |
0.0, 0.5 ----0.5, 0.5---- 1.0, 0.5
| | |
| | |
0.0, 1.0 ----0.5, 1.0---- 1.0, 1.0
|
|
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 30.10.2004, 20:02 Titel: |
|
|
Ich glaube da stimmt irgendwas mit dem Licht nicht: http://www.online-tutorials.net/dengine.zip
Startet das Programm und drückt solange auf F8 bis das Licht an bleibt, dann geht mit Leertaste (+ WASD und STRG) ein wenig nach oben. Jetzt nochmal F8 und schon leuchten bei dem Objekt nur noch die Texutren bei den Zinnen. Das Objekt kommt soviel ich weiß von Christian.
Code: |
//Sets the light
ZeroMemory(&m_Light,sizeof(D3DLIGHT9));
//Sets the type
m_Light.Type = D3DLIGHT_POINT;
//Sets the light
m_Light.Diffuse.r = 1.0f;
m_Light.Diffuse.g = 1.0f;
m_Light.Diffuse.b = 0.0f;
m_Light.Range = 100000.0f;
m_Light.Position = D3DXVECTOR3(10.0f,10.0f,10.0f);
m_Light.Attenuation0 = 0.0f;
// m_lpD3DDevice->SetRenderState(D3DRS_AMBIENT,0x00F0F0F0);
this->SetState();
//Sets the light true
this->SetLight(m_bLightState);
|
Code: |
//Sets the states
void bn_Scene::SetState()
{
//D3DTEXF_LINEAR
DXTestForError(m_lpD3DDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR),"Error by setting sample state",15,1);
DXTestForError(m_lpD3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR),"Error by setting sample state",15,1);
DXTestForError(m_lpD3DDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR),"Error by setting sample state",15,1);
// DXTestForError(m_lpD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE),"Error by setting render state",14,1);
// DXTestForError(m_lpD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x01),"Error by setting render state",14,1);
// DXTestForError(m_lpD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL),"Error by setting render state",14,1);
}
//Sets the light
void bn_Scene::SetLight(bool bState)
{
//Sets the light nr. 0
m_lpD3DDevice->SetLight(0,&m_Light);
m_lpD3DDevice->LightEnable(0,bState);
m_lpD3DDevice->SetRenderState(D3DRS_LIGHTING,bState);
m_bLightState = bState;
}
|
_________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.10.2004, 22:06 Titel: |
|
|
Als Ergänzunz, das was ich meinte nennt sich ID3DXTextureGutterHelper.
C. |
|
Nach oben |
|
 |
|
|
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.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|