[Irrlicht] Mit Shadern arbeiten?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Kernle 32DLL

Betreff: [Irrlicht] Mit Shadern arbeiten?

BeitragSo, Jan 23, 2011 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Ich versuche derzeit Shader mit Irrlicht ans Laufen zu bekommen. Leider klappt das nicht so wie ich es will, da u.A. die Dokumentation des BMax Ports von GMan reichlich dürftig ist, bzw. das Shader Beispiel äußerst Rudimentär ist. Ich versuche konkret folgenden Shader ans Laufen zu bekommen (letzte Seite).

Mein bisheriger Code sieht so aus, funktioniert aber in keinster Weise. Ist aus dem Code auf Seite 1 des Threads, und dem Shader Beispiel von Irrlicht zusammengebastelt.

Code: [AUSKLAPPEN]
Type MyShaderCallBack Extends IShaderConstantSetCallBack
    Field fLightStrength1:Float
    Field fLightStrength2:Float
    Field fLightStrength3:Float
    Field fLightStrength4:Float
   
    Field fvLightPosition1:Float[3]
    Field fvLightPosition2:Float[3]
    Field fvLightPosition3:Float[3]
    Field fvLightPosition4:Float[3]
   
    Field fvLightColor1:Float[4]
    Field fvLightColor2:Float[4]
    Field fvLightColor3:Float[4]
    Field fvLightColor4:Float[4]
   
    Field fvAmbientColor:Float[4]
   
    Field fSpecularPower:Float = 0.0        'S=pow(fDiffuseIntensity,fSpecularPower)*fSpecularStrength;
    Field fSpecularStrength:Float = 0.0    'will result in less glossing surfaces
    Field fBumpStrength:Float = 0.8        'strength of the bumpmapping.. higher values will result in more "bumpy" surfaces
   
    Method OnSetConstants(services:IMaterialRendererServices,userdata:Int)
        Local driver:IVideoDriver = services.getVideoDriver()
       
        Local var0:Float = 0
        Local var1:Float = 1
       
        services.setPixelShaderConstantFromName("baseMap", Varptr var0, 1)
        services.setPixelShaderConstantFromName("bumpMap", Varptr var1, 1)
       
        Local invWorld:matrix4 = driver.getTransform(ETS_WORLD)
        invWorld.makeInverse()
        services.setPixelShaderConstantFromName("matWorldInverse", invWorld.pointer(), 16)
       
        services.setPixelShaderConstantFromName("fLightStrength1", Varptr(fLightStrength1), 1)
        services.setPixelShaderConstantFromName("fLightStrength2", Varptr(fLightStrength2), 1)
        services.setPixelShaderConstantFromName("fLightStrength3", Varptr(fLightStrength3), 1)
        services.setPixelShaderConstantFromName("fLightStrength4", Varptr(fLightStrength4), 1)
       
        services.setPixelShaderConstantFromName("fvLightPosition1", Varptr(fvLightPosition1)[0], 3)
        services.setPixelShaderConstantFromName("fvLightPosition2", Varptr(fvLightPosition2)[0], 3)
        services.setPixelShaderConstantFromName("fvLightPosition3", Varptr(fvLightPosition3)[0], 3)
        services.setPixelShaderConstantFromName("fvLightPosition4", Varptr(fvLightPosition4)[0], 3)
       
        services.setPixelShaderConstantFromName("fvAmbient", Varptr(fvAmbientColor)[0], 4)
        services.setPixelShaderConstantFromName("fvLight1Color", Varptr(fvLightColor1)[0], 4)
        services.setPixelShaderConstantFromName("fvLight2Color", Varptr(fvLightColor2)[0], 4)
        services.setPixelShaderConstantFromName("fvLight3Color", Varptr(fvLightColor3)[0], 4)
        services.setPixelShaderConstantFromName("fvLight4Color", Varptr(fvLightColor4)[0], 4)
       
        services.setPixelShaderConstantFromName("fSpecularPower", Varptr(fSpecularPower), 1)
        services.setPixelShaderConstantFromName("fSpecularStrength", Varptr(fSpecularStrength), 1)
        services.setPixelShaderConstantFromName("fBumpStrength", Varptr(fBumpStrength), 1)
    EndMethod

    ' we must override the generate function in order for instantiation to work properly
    Function generate:IShaderConstantSetCallBack()
        Return New MyShaderCallBack
    EndFunction
EndType


Mein Material das zum Shader gehört erstelle ich wiefolgt. Komischerweise liefert mir die Funktion immer -1 zurück...

Code: [AUSKLAPPEN]
Local gpu:IGPUProgrammingServices = gIrrlichtDriver.getGPUProgrammingServices()
Local newMaterialType1:Int = 0

If (gpu)
    Local mc:IShaderConstantSetCallBack = ..
        IShaderConstantSetCallBack.Create(MyShaderCallback.generate)

        newMaterialType1 = gpu.addHighLevelShaderMaterialFromFilesNoGeometryShaders( ..
            "./Media/Shader/animNormal.vert", "vertexMain", EVST_VS_1_1, ..
            "./Media/Shader/animNormal.frag", "pixelMain", EPST_PS_1_1, ..
            mc, EMT_SOLID)
    mc.drop()
EndIf


Da ich die -1 als Rückgabewert nicht genug interpretieren kann, würde ich sagen das entweder die Funktion die das Material später benutzt einfach ein Standardmaterial (z.b. EMT_SOLID) als Fallback Material nimmt weil es mit der -1 nichts anzufangen weiß, oder die -1 steht tatsächlich für ein Material, das aber Aufgrund eines Fehlers auf das Fallback Material EMT_SOLID zurück fällt.

Vorschläge? Ich muss zugeben, dass ich absolut keine Ahnung von der Materie bisher habe, da ich mich weder ausgiebig mit Shadern beschäftigt habe, noch deren Anbindung an Irrlicht (ob nun C++ oder BMax).

So long,
Kernle

Edit:
Weitere Informationen:

Arrow Das -1 zurückgegeben wird ist natürlich nicht richtig
Arrow -1 als Material zu benutzen führt zu meinen Grafikfehlern
Arrow Wenn ich den Shader aus dem Example lade gehts (Material ID 24)
Arrow Ergo, ist irgendwas an einem der beiden Shader verkehrt :/ Ideen?

Edit2:
Okay, ich bin eine totale Tomate! Der Shader auf der letzten Seite ist natürlich kein OpenGL, sondern ein DirectX Shader >.< Ich probiere morgen noch mal den Shader auf der 1. Seite aus...
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group