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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

15.09.2013, 16:19

Probleme mit Alpha-Blending

Hallo! Ich habe vor längerer Zeit einen Alpha-Blending Versuch gestartet. Nun probiere ich, das selbe Objekt zwei mal additiv zu rendern. Doch aus irgendeinem Grund wird das zweite Objekt an der selben Position nie angezeigt. Es geht darum mit ForwardRendering, zwei Lichter zu rendern. Der erste Pass ist sichtbar. Der zweite Pass ist nur sichtbar, wenn ich das Objekt minimal verschiebe.
Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
float blendFactor[4];
blendFactor[0] = 0.0f;
blendFactor[1] = 0.0f;
blendFactor[2] = 0.0f;
blendFactor[3] = 0.0f;

D3D.GetDeviceContext()->OMSetBlendState(m_alphaBlendONEZERO, blendFactor, 0xffffffff);

pCam->SetRawValue(&Vector4(g_pCamera->GetPosition(), 0.0f), 0, sizeof(Vector4));
pWorld->SetRawValue(&MatrixTranspose(MatrixIdentity()), 0, sizeof(Matrix));
pVP->SetRawValue(&MatrixTranspose(mView * mProj), 0, sizeof(Matrix));
g_pGround->Draw();

D3D.GetDeviceContext()->OMSetBlendState(m_alphaBlendONEONE, blendFactor, 0xffffffff);

pCam->SetRawValue(&Vector4(g_pCamera->GetPosition(), 1.0f), 0, sizeof(Vector4));
pWorld->SetRawValue(&MatrixTranspose(MatrixIdentity()), 0, sizeof(Matrix));
pVP->SetRawValue(&MatrixTranspose(mView * mProj), 0, sizeof(Matrix));
g_pGround->Draw();


Blend states:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D3D11_BLEND_DESC blendStateDescription;
    ZeroMemory(&blendStateDescription, sizeof(D3D11_BLEND_DESC));
    blendStateDescription.RenderTarget[0].BlendEnable = TRUE;
    blendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
    blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_ONE;
    blendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
    blendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
    blendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
    blendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
    blendStateDescription.RenderTarget[0].RenderTargetWriteMask = 0x0f;

    Direct3D::Instance().GetDevice()->CreateBlendState(&blendStateDescription, &m_alphaBlendONEONE);
    
    blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO;

    Direct3D::Instance().GetDevice()->CreateBlendState(&blendStateDescription, &m_alphaBlendONEZERO);

Die vierte Komponente von der Kameraposition wird im Shader nicht beachtet.

Woran liegt es, dass ich den zweiten Pass nicht sehe?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

15.09.2013, 16:30

Wie sieht denn der Depthstate aus? Ist der Depthtest deaktiviert?
@D13_Dreinig

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

15.09.2013, 17:34

Depthstate:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
    ZeroMemory(&depthDisabledStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));

    depthDisabledStencilDesc.DepthEnable = TRUE;
    depthDisabledStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
    depthDisabledStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
    depthDisabledStencilDesc.StencilEnable = TRUE;
    depthDisabledStencilDesc.StencilReadMask = 0xFF;
    depthDisabledStencilDesc.StencilWriteMask = 0xFF;
    depthDisabledStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
    depthDisabledStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
    depthDisabledStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
    depthDisabledStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
    depthDisabledStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
    depthDisabledStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
    depthDisabledStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
    depthDisabledStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

Depthtest ist an.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

4

15.09.2013, 17:48

Wenn ich den DepthTest deaktiviere sehe ich beide Passes. Nur habe ich dann kein DepthTesting. :P

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

15.09.2013, 18:57

Wenn ich den DepthTest deaktiviere sehe ich beide Passes. Nur habe ich dann kein DepthTesting. :P


Eben, aber Depthtesting macht bei transparenten Materialien ja auch kein Sinn.

Edit: Korrektur, Depthwrite macht i.A. keinen Sinn... Testen gegen den Depthbuffer schon.
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (15.09.2013, 20:12)


FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

6

15.09.2013, 19:02

Also nur zum Verständnis: Ich soll beim ersten Pass alles normal lassen und beim zweiten D3D11_COMPARISON_NEVER benutzen?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (15.09.2013, 19:13)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

15.09.2013, 20:09

Kommt ein wenig darauf an was genau du tun willst. Normal werden opake Objekte zuerst 'normal' gerendert. Danach dann die transparenten Objekte mit Depthwrite aus und Depthtest an.
@D13_Dreinig

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

15.09.2013, 20:17

Habe ich ausprobiert. Selbes Ergebnis wie vorher. Ich sehe den zweiten Pass nicht.
Rendern:

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
D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
ZeroMemory(&depthStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));

depthStencilDesc.DepthEnable = TRUE;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilDesc.StencilEnable = TRUE;
depthStencilDesc.StencilReadMask = 0xFF;
depthStencilDesc.StencilWriteMask = 0xFF;
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

Direct3D::Instance().GetDevice()->CreateDepthStencilState(&depthStencilDesc, &m_depthNever);

// ...


g_pGround->Render();

D3D.GetDeviceContext()->OMSetDepthStencilState(m_depthNever, 1);
D3D.GetDeviceContext()->OMSetBlendState(m_alphaBlendONEONE, blendFactor, 0xffffffff);
g_pGround->Render();

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

15.09.2013, 20:25

Wie ist denn m_depthNever konfiguriert? Ich denke das Problem ist eher, das dein erster Pass in den Depthbuffer schreibt. Evtl kannst du ja genauer darauf eingehen, was du erreichen willst.
@D13_Dreinig

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

10

15.09.2013, 20:33

Jop, ich kann nur das von David bestätigen.

1. Alle opaken Objekte ganz normal rendern.
2. Schreiben in den Detphbuffer deaktivieren. Den Depthtest aktiviert lassen. Falls ein transparentes Objekt hinter einem opaken Objekt liegt, soll es ja verdeckt bleiben.
3. Nun per Painter's Algorithm alle transparenten Flächen von hinten nach vorne zeichnen.

Alternativ: Depth Peeling. Aber das ist aufwendig.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Werbeanzeige