GLBasic Benutzerhandbuch

Main sections

X_SETCELSHADES

X_SETCELSHADES schatten#[]



Legt fest, in welchen Helligkeitsstufen bei CelShading abgestuft werden soll. schatten#[] ist ein Feld von Helligkeitswerten von 0.0 (schwarz) bis 1.0 (sehr hell), das von der Schattenseite zur Lichtseite die Helligkeit je nach Reflektionswinkel ist.
Diese Funktion sollte nur am Anfang vom Program verwendet werden, da alle Texturen neu berechnet werden müssen und damit eine Verzögerung beim nächsten Zeichnen auftritt.

Prinzipielle Vorgehensweise:
DIMDATA sh[], 0.1, 0.3, 1.0
X_SETCELSHADES sh[]
WHILE TRUE
Render()
WEND



Beispiel zum Verdeutlichen des Ergebnisses
// --------------------------------- //
// Project: ToonShading
    CreateTorus(1, 5, 10, 22, 22, 2, 2)
    // Bild-Daten
    LOADSPRITE "image.bmp", 0

    DIMDATA cheap[], .5, 1
    DIMDATA nice[], .3, .6, .6, .6, .6, .6, .6, .7, 1, 1, 1, 1, 1, 1, 1, 1

    WHILE TRUE
    // Hauptschleife
        DRAWRECT 0,0,640,480,RGB(0,0,200)
        phi=phi+GETTIMER()/30


        VIEWPORT 0,0,320,480
        // wahlweise - setzt cel-shading Abstufungen
        X_SETCELSHADES cheap[]
        Render(phi)


        VIEWPORT 320,0,320,480
        X_SETCELSHADES nice[]
        Render(phi)


        dtime = GETTIMER()
        fps = ((1000.0/dtime)+fps)/2
        delay=delay+dtime
        IF delay>1000 // 1/2 sec
            delay=0
            showfps=fps
        ENDIF
        X_MAKE2D
        PRINT "FPS: "+FORMAT$(0,1,showfps), 100, 0 // + dtime, 0,0

        SHOWSCREEN
    WEND


// ------------------------------------------------------------- //
// Zeichnet einen Donut
// ------------------------------------------------------------- //
FUNCTION Render: phi
    X_MAKE3D 1, 250, 45
    X_CAMERA 0, 10, 50, 0,0,0
    // Licht Nr. -2 is Cel-Shading Postition / Light no -1 is cel shading position
    X_SPOT_LT -2, 0, 0,0,100, 0,0,0,90
    X_CULLMODE 1 // niemals 0 verwenden bei toons / Never use 0 with toon shading
    X_SETTEXTURE 0, -1 // 0=Tex
    X_ROTATION 80, 1,0,0
    X_ROTATION phi, 0, 1, 0.1
    X_DRAWOBJ 1, 0
ENDFUNCTION


// ------------------------------------------------------------- //
// -=# CREATETORUS #=-
// Donut Objekt machen / Make a donut object
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r

    X_AUTONORMALS 2 // smooth
    X_OBJSTART num
    FOR di=0 TO NumWraps-1
        FOR j=0 TO NumPerWrap
            FOR i=di+1 TO di STEP -1
                wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
                wrapFracTex = j/NumPerWrap
                phi = 360*wrapFrac
                thetaFrac = (MOD(i, NumWraps)+wrapFracTex)/NumWraps
                thetaFracTex = (i+wrapFracTex)/NumWraps
                theta = 360*thetaFrac
                r = MajorRadius + MinorRadius*COS(phi)
                x = SIN(theta)*r
                z = COS(theta)*r
                y = MinorRadius*SIN(phi)
                X_OBJADDVERTEX x,y,z, thetaFracTex*TextureWrapVert, 1-wrapFracTex*TextureWrapHoriz, _
                                RGB(0xff,0xff,0xff)
            NEXT
        NEXT
        X_OBJNEWGROUP
    NEXT
    X_OBJEND
ENDFUNCTION // y

See also...