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

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

1

25.07.2009, 15:04

IDirect3DDevice9::SetTexture vs. ID3DXBaseEffect::SetTexture

Vielleicht habe ich einfach schon zu lange nichts mehr in die Richtung gemacht, aber ich habe gerade ein richtiges durcheinander, wie man mit diesen beiden Funktionen richtig zusammenarbeitet.. :roll:

Um in einem Pixelshader eine Textur zu benutzen, muss ich ja Devide::SetTexture benutzen, um die Textur zu setzen. Wie wird denn das aber im HLSL Code auf die Textur gemappt? - Anscheinend funktioniert es ja auch ohne Effect::SetTexture..

2

25.07.2009, 15:32

Bringst mich mit deiner Frage auch leicht durcheinander... :?

Zitat von »"drakon"«

Um in einem Pixelshader eine Textur zu benutzen, muss ich ja Devide::SetTexture benutzen


Wohl eher mit Effect::SetTexture.
Dass das auch mit Device::SetTexture funktioniert, liegt möglicherweise daran, dass der Shader denselben Puffer verwendet.

Zitat von »"drakon"«

Wie wird denn das aber im HLSL Code auf die Textur gemappt?


Häh?
Nicht so früh schon trinken! ;)

Ich versuch das mal aufzudröseln:
Normaler Ablauf ist ja der, dass der Vertexshader die Texturkoordinaten an den Pixelshader weitergibt. Letzterer mappt/sampled die Texel auf das Objekt.

Denke, mit Effect::SetTexture bist du auf der sicheren Seite, da du idR. wohl mehrere Texturen verwendest.

Hoffe, hab deine Frage richtig interpretiert und ebenso richtig beantwortet.
Ansonsten schlag mich.
fka tm

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

25.07.2009, 15:45

Hmm. Das scheint eben so nicht richtig zu funktionieren.

Wenn ich jetzt Device::SetTexture (0,0) mache, aber über den Effekt die Textur setze, dann bleibt alles schwarz. Egal, wie ich eine Textur über den Effekt setze es wird nur die Textur angezeigt, die ich mit der Device gesetzt habe.

Es scheint wirklich so, dass da etwas mit dem selben Puffer passiert..

4

25.07.2009, 15:48

Zeig mal 'n Streifen Code vom Shader, und vom Programm, wo du die Shadervariablen übergibst.
fka tm

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

25.07.2009, 16:09

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
texture screen;
texture bright;

// Samplers

sampler2D screenSampler =
sampler_state
{
    Texture = <screen>;
//...

};

sampler2D brightSampler =
sampler_state
{
    Texture = <bright>;
//...

};

...
Color = tex2D (screenSampler,input.TexCoord);


C-/C++-Quelltext

1
2
3
4
device->SetTexture (0,0);
...
m_Effect->SetTexture ("screen", m_SceneTexture);
m_Effect->SetTexture ("bright", m_BrightTexture);


Das funktioniert so auch wunderprächtig. Allerdings, wenn ich bei tex2D den sampler wechsle, damit die andere Textur genommen werden soll, dann wird trotzdem die erste Textur genommen. (also screen).

Wenn ich allerdings jetzt die Textur mittels device setzen würde, dann bringe ich es hin auch mit der zweiten Textur zu rendern.

6

25.07.2009, 16:32

Du hast 2 Objekte oder?

Mögliche Variante:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
uniform extern texture  CurrentMap;

sampler2D Sampler =
sampler_state
{
    Texture = <CurrentMap>;
//...

}; 



C-/C++-Quelltext

1
2
3
4
5
m_Effect->SetTexture ("CurrentMap", m_SceneTexture); 
// Render Objekt 1


m_Effect->SetTexture ("CurrentMap", m_BrightTexture); 
// Render Objekt 2


Oder du löst es über Passes oder Techniques.

Ansonsten bräuchte ich mehr Input.
fka tm

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

25.07.2009, 16:37

Nee. Ich brauche beide Texturen gleichzeitig.
Sie sollen addiert werden:

C-/C++-Quelltext

1
color = tex2D(screen, input.TexCoord) + tex2D(bright, input.TexCoord)


Aber das kann doch nicht so schwer sein?! - Prinzipiell müsste es ja mit diesem setzen doch funktionieren, oder etwa nicht?

8

25.07.2009, 16:55

Glaube eher sowas:

C-/C++-Quelltext

1
2
3
4
float3 color1 = tex2D(screen, input.TexCoord).rgb;
float3 color2 = tex2D(bright, input.TexCoord).rgb;

final = float4( color1 + color2, 1.0f);
fka tm

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

25.07.2009, 17:06

^^
Das spielt ja erstmal keine Rolle.. Darum habe ich das ganze ja vereinfacht, indem ich einfach die zweite Textur haben will. ;)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

10

25.07.2009, 19:19

probiers mal mit UpdateSemantics() hies das glaube ich.

Werbeanzeige