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

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

1

10.07.2008, 17:47

asm-Shader fehlerhafte Vertextransformation

Was passieren soll: die Shader sollen zwischen mehreren Texturen (4) über eine Alphamap in den Vertizen interpolieren. (Dies ist Teil meiner Terrainengine)

Ohne diese Shader wird das Terrain vollständig ordnungsgemäß gerendert (, mal abgesehen davon, dass es natürlich nur eine Textur hat).
Die Vertexdaten und Matrizen sind also richtig.

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
ps_1_4
texld r0, t0 
texld r1, t0 
texld r2, t0 
texld r3, t0 
mul r0, r0, v1.r 
lrp r1, v1.g, r1, r0 
lrp r2, v1.b, r2, r1 
lrp r0, v1.a, r3, r2 

vs_1_1
dcl_position v0 
dcl_normal v1 
dcl_color v2 
dcl_texcoord v3 
m3x3 r0.xyz, v1, c29 
dp3 r0, r0, -c1 
mov r3, c0 
mul r1, c46, r3 
mov r3, c1 
mad r0, c45, r0, r3 
add oD0, r0, c48 
mov oD1, v2 
mov oT0, v3 
dp4 oPos.x, v0, c25 
dp4 oPos.y, v0, c26 
dp4 oPos.z, v0, c27 
dp4 oPos.w, v0, c28


Die Shader werden mit D3DXAssembleShader und Device.CreatePixelShader(pdwShader, pCompiledEffect) erzeugt.

Beim Renderen werden sämtliche benutzten Konstantenregister mit
Device.SetVertexShaderConstantF(45, (float*)pmMatrix, 4),... gesetzt (Aufruf überprüft). Außerdem setze ich FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1
und die Vertizen haben das Format:

C-/C++-Quelltext

1
2
3
4
5
6
7
struct ORKTECK_API OrMapVertex
{
    OrVector3           vPosition;  // Position

    OrVector3           vNormal;    // Normalvektor

    DWORD               dwColor;    // RGB: Alphawerte der Texturschichten, A: Specularmap

    OrVector2           vTexture;   // 2D-Texturkoordinaten

};


Das Ergebnis ist ernüchternd falsch, als ob die Daten nicht zusammenpassen würden.


(Link)


Ich habe leider keine Idee, was schief läuft und auch keine, wo ich mit dem Suchen anfangen soll.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.07.2008, 19:23

transponierst du deine matritzen auch bevor du sie in die shaderkonstanten packst?
du multiplizierst im shader ja vektor mit zeile. korrekt wäre aber vektor mit spalte. damits wieder stimmt musst du deine matritzen vorher transponieren (zeilen und spalten vertauschen) ;)

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

3

10.07.2008, 21:26

Genial, so ein schön einfach zu behebendes Problem, jetzt läufts.

Aber auf so etwas kommt man nicht, wenn DX das sonst automatisch erledigt (in HLSL).

Ich Danke :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.07.2008, 22:24

vor laaaanger langer zeit saß mal ein gewisser jemand vor recht ähnlichen bildern.
bis sich dieser jemand mal gefragt hat warum die in all den samples im dx sdk ihre matritzen immer transponieren... ;)

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

5

21.07.2008, 08:54

Ich muss diesen Thread leider noch einmal aufwärmen.
Wahrscheinlich ist der Fehler genau so banal wie der andere.

Von den Texturen die ich setze wird immer nur die 1. verwendet,
auch wenn ich für den Pixelshader
texld r1, t0
mov r0, r1
einsetze. Nach meiner Überprüfung setze ich für die Stages aber wirklich unterschiedliche Texturen ein.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

21.07.2008, 23:12

hm komisch. also imo sieht das eigentlich recht gut aus. eigentlich sollte er die texture stage ja anhand des index des destination registers auswählen, aber was is wenn du deine texcoords mal testweise in t1 speicherst!?

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

7

22.07.2008, 10:13

Nein, das hat leider keine Wirkung. Ich hab das Gefühl, etwas mit den Texturstages selbst stimmt nicht.

Werbeanzeige