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

1

01.11.2009, 19:34

Alphawert aus einem Vertexbuffer.

Guten Tag,

ich versuche mich zur Zeit an der Übungsaufgabe 2.10.5 Teil 4.

Ich habe für jede vorhergegangene Teilaufgabe das Würfelprogramm übernommen, mit konstanten Booleans schalte ich Teilfunktionen an.

Wie dem auch sei.
Ich zeichne die Würfel aus einem Vertex-Buffer (ist nach Distanz sortiert). Ich verwende das Renderstate D3DBLEND_(INV)SRCALPHA, also wird der Alphawert aus dem Diffuse-Wert des Vertex genommen, ein MAterial ist nicht gesetzt.

Jeder Vertex bekommt am Anfang folgenden Farbwert:

Quellcode

1
if (g_bAlpha) bVertex[iVertex].dwColor = tbColorRandom(tbFloatRandom(0.0f, 1.0f)) * 2.0f;


Dennoch hat das Blending nicht funktioniert.
Mit Alpha-Testing habe ich herausgefunden, dass der Alphawert bei den Würfeln immer noch bei 255 liegt. Mit dem Renderstate D3DBLEND_BLENDFACTOR funktioniert das Alpha-Blending nun aber.
Die Vertexstruktur sieht wie folgt aus:

Quellcode

1
2
3
4
5
6
7
8
9
struct Vertex
{
    tbVector3     vPosition;    //Positionsvektor
    tbVector3     vNormal;      //Vertexnormalen
    DWORD         dwColor;      //Farbe
    tbVector2     vTexture;     //Texturkoordinaten
    static const  DWORD dwFVF;  //Vertexormat
};
const DWORD Vertex::dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1;


Als Schlussfolgerung sehe ich nur vielleicht das Problem, dass aus einem Vertexbuffer gezeichnet wird, aber das dürfte doch eigentlich kein Problem sein.

Würde mich auf Antworten freuen, kann auch auf Bedarf den ganzen QUelltext posten, wird nur sehr unübersichtlich, da wie gehabt alle Übungsaufgaben darin implementiert sind.

EDIT: Problem gefunden. Sobald ich die Textureinstellungen auskommentiere, klappt es. Doch damit ergibt sich eine andere Frage: Muss es nicht trotz Textur möglich sein, den Alphawert aus dem Vertex direkt ohne Textursampling zu übernehmen?

2

01.11.2009, 20:25

Ich glaub bei tbColorRandom ist der AlphaWert immer = 1.0f sprich 256

EDIT: Versuch mal tbColorRandom (-1.0f)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

01.11.2009, 20:31

warum verdoppeln? das geht eh nur bis 1.0^^.

ansonsetn was hast du für samplerstates/renderstates gesetzt?

edit: ja ansonsten logge mal deine vektorwerte, vllt ist wirklich der alphawert immer o, dann solltest du de explizit mit random versehen.

4

02.11.2009, 16:35

Das Verdoppeln dient nur dazu, die Farben kräftiger erscheinen zu lassen. Ich hab dem Alphawert nun auch einen zufälligen Float-Wert zwischen 0 und 0.5f zugewiesen, damit wird das *2 aufgehoben ;)

Beim Loggen habe ich auch vernünftige Ergebnisse rausbekommen

Farbe: a = 0.980, r = 0.690, g = 1.000, b = 1.000, Hexadezimal: 0xfab0ffff, Probetext
Farbe: a = 0.431, r = 1.000, g = 0.875, b = 1.000, Hexadezimal: 0x6effdfff, Probetext
Farbe: a = 0.129, r = 0.949, g = 0.180, b = 0.741, Hexadezimal: 0x21f22ebd, Probetext

Dennoch bleibt das Grundproblem bestehen:

Die States:

Quellcode

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
    //Beleuchtung ausstellen, Dithering und Culling aktivieren
    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);
if(g_bAlpha)
    {
        //Falls Alpha-Blending erwünscht ist
        g_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
        g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
        g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
        g_pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

        if (g_ucAlphaValue > 0)
        {
            g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
            g_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_LESSEQUAL);
            g_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, g_ucAlphaValue);
        }
    }

    //Samplerstates für die Texturen setzen
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, g_Direct3DParameters.DeviceCaps.MaxAnisotropy);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ANISOTROPIC);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);

    //Textur laden
    if (FAILED(hResult = D3DXCreateTextureFromFileEx(g_pD3DDevice,       //Direct3DDevice Schnittstelle
                                                     "textur.jpg",       //Dateiname
                                                     D3DX_DEFAULT,       //Bildweite übernehmen
                                                     D3DX_DEFAULT,       //Bildhöhe übernehmen
                                                     0,                  //Max. Anzahl an MIP-Maps erstellen
                                                     0,                  //Zweck
                                                     D3DFMT_UNKNOWN,     //Format beibehalten
                                                     D3DPOOL_MANAGED,    //Speicherklasse
                                                     D3DX_FILTER_NONE,   //Filter
                                                     D3DX_DEFAULT,       //MIP-Map-Filter
                                                     0,                  //Color-Keying (Transparenz)
                                                     NULL,               //Bildinformationen
                                                     NULL,               //nur für 8-bit-Farben relevant
                                                     &g_pTexture         //Texturschnittstelle
                                                     )))              
    {
        //Fehler
        TB_ERROR_DIRECTX("D3DXCreateTextureFromFileEx", hResult, TB_ERROR);
        MessageBox(NULL, "\"textur.jpg\" nicht gefunden!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        return TB_ERROR;
    }

    //Textur einsetzen
    g_pD3DDevice->SetTexture(0, g_pTexture);


Das renderstate für Alpha-Testing hat vorerst keine Bedeutung, da es auf LESSEQUAL 255 gesetzt ist (Maxwert von Alpha), bei 254 wird schon jeder Würfel gefiltert, also sieht man nichts mehr.

EDIT: Problem gefunden. Sobald ich die Textureinstellungen auskommentiere, klappt es. Doch damit ergibt sich eine andere Frage: Muss es nicht trotz Textur möglich sein, den Alphawert aus dem Vertex direkt ohne Textursampling zu übernehmen?

5

02.11.2009, 19:12

du musst dann auch die colorarg, colorop, alphaarg und alphaop-samplerstates (oder wars Texturschicht?) so setzen, das er eben die farbe aus der textur und das Alpha aus dem Vertex nimmt ;)

6

02.11.2009, 19:46

Ah, ich glaube ich weiß was du meinst. Das müssten die Texturschicht-States sein, bin gerade bei dem Kapitel des Buches. Ich denke, das müsste auch auf eine Textur übertragbar sein. Nur bin ich halt von "Multi-Texturing" (dort wurden die States behandelt) ausgegangen. Ich versuchs mal damit, vielen Dank.

EDIT: Klappt, ihr habt mir sehr geholfen.

Werbeanzeige