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

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

1

23.09.2006, 20:07

D3D Beleuchtunsproblem

Nach langer Zeit, komme ich endlich wieder dazu ein wenig D3D zu programieren und schon hab ich das erste Problem.
Und zwar sieht die Beleuchtung auf von meinem Objekt seltsam aus. Die Kanten der Dreiecke sind immer ein wenig zu hell, sodass an den Kannten immer helle Steifen entstehen und das Modell somit gerastert aussieht (ich hoffe man kann das auf den Screenshots einigermaßen erkennen).

Screen01
Screen02


Für jedes Dreieck werden 3 Verices verwendet, die Normalen aller 3 Vertices, fallen aber zusamen
Normalen

Hat jemand von euch eine Idee, woran das liegen kann.

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

23.09.2006, 20:42

Ich sehe da nichts ungewöhnliches.
Dein Licht ist wohl einfach zu hell.

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

3

23.09.2006, 21:23

Danke anscheinend ist wirklich die Beleuchtung zu stark, mir ist aber nicht klar warum:

Im Material und im Licht sind alle Farbwerte bis auf Diffuse 0.

Hier ein paar Beisipiele
LichtDiffuse: 0.3, 0.3, 0.3 Material-Diffuse: 0.1, 0.1, 0.1
Screen01
Material-Diffuse: 0.5, 0.5, 0.5 Material Diffuse: 0.1, 0.1, 0.1
Screen02
Material-Diffuse: 0.5, 0.5, 0.5 Material-Diffuse: 0.5, 0.5, 0.5
Screen03

für MD:0.5, 0.5, 0.5 und LD:0.5, 0.5, 0.5 kommt mir das schon ein bisschen sehr stark beleuchtet vor oder?

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

23.09.2006, 21:36

Ja.
Hast du sonst noch irgendwelche Werte ungleich null?
Ambient? Emissive? Specular?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

23.09.2006, 21:40

also viel mehr als raten kann ich auch nicht...

haben die normalen auch länge 1?
verwendest du die ffp oder einen shader (wenn ja wär der shader code interessant)?
ambient?
emissive?
specular?

EDIT: ^^ das geht fast als doppelpost durch :P
ich sollte mir vielleicht angewöhnen zu aktualisieren bevor ich poste...

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

6

23.09.2006, 21:41

nein, ist alles auf 0
normalvektoren haben länge 1
shader werden nicht verwendet

bin irgnedwie ratlos

hier mal ein bisschen Code, viell. hab ich ja irgendwo einen blöden fehler

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void Renderer::initialize(HWND wnd) throw(Exception)
{
    if(!wnd)
      throw(Exception(EXC_BASE, L"Can't initialize Renderer with [wnd=NULL]"));
    window_ = wnd;

    direct3d_ = Direct3DCreate9(D3D_SDK_VERSION);
    if(!direct3d_)
      throw(Exception(EXC_BASE, L"Wasn't able to create D3D-Interface"));
    
    RECT temp;
    GetClientRect(window_, &temp);
    window_width_     = temp.right - temp.left;
    window_height_    = temp.bottom - temp.top;

    D3DPRESENT_PARAMETERS pp;
    ZeroMemory(&pp, sizeof(D3DPRESENT_PARAMETERS));
    pp.BackBufferWidth              = window_width_;
    pp.BackBufferHeight             = window_height_;
    pp.BackBufferFormat             = D3DFMT_A8R8G8B8;
    pp.BackBufferCount              = 1;
    pp.MultiSampleType              = D3DMULTISAMPLE_NONE;
    pp.MultiSampleQuality           = 0;
    pp.SwapEffect                   = D3DSWAPEFFECT_DISCARD;
    pp.hDeviceWindow                = window_;
    pp.Windowed                     = true;
    pp.EnableAutoDepthStencil       = TRUE;
    pp.AutoDepthStencilFormat       = D3DFMT_D24S8;
    pp.Flags                        = 0;
    pp.FullScreen_RefreshRateInHz   = D3DPRESENT_RATE_DEFAULT;
    pp.PresentationInterval         = D3DPRESENT_INTERVAL_ONE;

    if(FAILED(direct3d_->CreateDevice(0, D3DDEVTYPE_HAL, window_, D3DCREATE_HARDWARE_VERTEXPROCESSING, 
      &pp, &device_)))
      throw(Exception(EXC_BASE, L"failed to create a D3D-Device"));

    initialized_ = true;

    //Setup scene stuff

    Mat m;

    D3DXMATRIX mat;
    D3DXMatrixPerspectiveFovLH(&mat, deg_to_rad(100.0f), deg_to_rad(100.0f), 0.1f, 200.0f);
    device_->SetTransform(D3DTS_PROJECTION, &mat);

    device_->SetRenderState(D3DRS_LIGHTING, TRUE);
    device_->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    device_->SetRenderState(D3DRS_DITHERENABLE, TRUE);
    device_->SetRenderState(D3DRS_ZENABLE, TRUE);
    device_->SetRenderState(D3DRS_AMBIENT, 0x0);

    D3DLIGHT9 light;
    light.Type      = D3DLIGHT_POINT;
    light.Diffuse   = Color(.5f, .5f, .5f);
    light.Ambient   = Color(0.0f, 0.0f, 0.0f);
    light.Specular  = Color(0.0f, 0.0f, 0.0f);
    light.Position  = Vec3(0.0f, 0.0f, 0.0f);
    light.Range     = 100.0f;
    light.Attenuation0 = 0.0f;
    light.Attenuation1 = 0.1f;
    light.Attenuation2 = 0.0f;

    Material material(Color(0.0f, 0.0f, 0.0f), Color(.5f, .5f, .5f), 
      Color(0.0f, 0.0f, 0.0f), Color(0.0f, 0.0f, 0.0f), 0.0f);

    device_->SetMaterial(material.getD3D());

    device_->SetLight(0, &light);
    device_->LightEnable(0, TRUE);
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  void Renderer::render()
  {
    device_->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(128, 128, 128), 1.0f,
      0);

    device_->SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL);

    Mat mt;
    mt.translation(0, 0, 1.8);

    device_->SetTransform(D3DTS_WORLD, mt.getD3D());

    device_->BeginScene();

    //device_->SetRenderState(D3DRS_LIGHTING, TRUE);

    device_->DrawPrimitiveUP(D3DPT_TRIANGLELIST, test_.getTriangleCount(), 
      test_.getVertices(), sizeof(Vertex));
    //device_->DrawPrimitiveUP(D3DPT_LINESTRIP, test_.getVertexCount() - 1, test_.getVertices(),

    //  sizeof(Vertex));

    device_->EndScene();


    device_->Present(NULL, NULL, NULL, NULL);

  }

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

23.09.2006, 21:58

Zitat von »"Phil_GDM"«

C-/C++-Quelltext

1
2
3
    light.Attenuation0 = 0.0f;
    light.Attenuation1 = 0.1f;
    light.Attenuation2 = 0.0f;

Attenuation0 solltest du nicht auf null setzen!
Setz es mal auf 1.

In Wirklichkeit nimmt die Lichtintensität mit dem Quadrat der Entfernung ab.
Du solltest also Attenuation1 auf null setzen und dafür Attenuation2 verwenden.
Und wie gesagt Attenuation0 auf 1.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

23.09.2006, 22:24

Re: D3D Beleuchtunsproblem

Zitat von »"Phil_GDM"«

Die Kanten der Dreiecke sind immer ein wenig zu hell, sodass an den Kannten immer helle Steifen entstehen


Dieser Eindruck ist normal und ensteht im Kopf, welches gewissermassen einen "Kontrastverstärker" eingebaut hat damit Menschen besser überleben können:

http://de.wikipedia.org/wiki/Machsche_Streifen
"Games are algorithmic entertainment."

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

9

23.09.2006, 23:40

Zitat von »"David Scherfgen"«


Attenuation0 solltest du nicht auf null setzen!
Setz es mal auf 1.

Danke das wars. Den Fehler hätt ich die nächsten 2 Tage lang gesucht.
Warum schreibst du in deinem Buch aber auch: Normalerweise setzt man Att0 und Att2 auf 0 und Att1 auf eine konstanten kleinen Wert wie zum Beispiel 0.05 ;)

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

Werbeanzeige