Hm... wüsste nicht, inwiefern ich das nutzen könnte, da ich ohnehin alles selbst code. Bin im Moment bei der schnellsten aller mir möglichen Varianten, wenn ich meine Shader weiterhin unterstützen will, also alles paletti.
@Thalius: Ist schon ok, bisher ist die Performance OK, es könnte mehr sein, aber bei ner hi-level-lang is da wohl nicht mehr drinn. Verflucht seien Grafikkarten, die geben mir fette Performance-Gewissensbisse

.
Im Moment sieht mein Code so aus: (wundert euch nicht wegen den ShaderProtos und den Prototyp-Aufrufen, das könnt ihr getrost ignorieren...
Code: Alles auswählen
Procedure HIRES_ShadedRect(x1.l, y1.l, x2.l, y2.l, c.l, *is.InitShaderProto)
Protected *db.rgba, *dbend.rgba
Protected *db2end.rgba, *db2.rgba
Protected w.l, h.l
Protected pitchw.l
Protected shstruc.ShaderStruc
; shaderstruktur füllen
shstruc\c = @c
shstruc\x = @x1
shstruc\y = @y1
; shader- prototyp
Protected *s.ShaderProto
; shader-funktion holen
*s = *is(@shstruc)
; rechteck -anfang und -ende ggf. tauschen
If x1 > x2
Swap x2, x1
EndIf
; w ausrechnen
w = x2 - x1
If y1 > y2
Swap y2, y1
EndIf
; h ausrechnen
h = y2 - y1
; start- und end- speicheradressen ausrechnen
*db = *dbuffer + y1 * dbpitch + x1 * dbbytes
*dbend = *db + h * dbpitch
pitchw = w * dbbytes
; bildschirmzeilen durchlaufen
While *db <= *dbend
; aktuelle spalte wieder auf den spaltenanfang zurücksetzen
*db2 = *db
*db2end = *db2 + pitchw
While *db2 <= *db2end
; shader aufrufen, schreibt den neuen farbwert
*s(*db2, shstruc)
x1 + 1
*db2 + dbbytes
Wend
y1 + 1
*db + dbpitch
Wend
EndProcedure
Es ist 0 Geschwindigkeitsunterschied zu der anderen Variante, aber zumindest kann ich mir so ein paar Variablen sparen (glaube das war so).