Hat jemand spontan eine schnelle Procedure um Bilder (keine Sprites) zu drehen ?
Also nicht so etwas langsames wie:
Code: Alles auswählen
Procedure RotiereEinBild(bild, richtung)
Protected i.i, k.i
Protected rbild.i
Protected w.i = ImageWidth(bild)
Protected h.i = ImageHeight(bild)
Protected Dim p(w,h)
If IsImage(bild)
;Lese die Pixel
StartDrawing( ImageOutput(bild) )
For k=0 To h-1
For i=0 To w-1
p(i,k)=Point(i,k)
Next
Next
StopDrawing()
;Drehrichtung
If richtung = 0 ;"90° oder Pi/2"
If w<>h
Swap w,h
rbild = CreateImage(#PB_Any,w+1,h+1)
If IsImage(rbild)
FreeImage(bild)
EndIf
EndIf
StartDrawing( ImageOutput(rbild) )
For k=0 To h
For i=0 To w
Plot(i,k, p(k,w-i))
Next
Next
StopDrawing()
ElseIf richtung = 1 ;"180° oder Pi"
rbild = CreateImage(#PB_Any,w+1,h+1)
If IsImage(rbild)
FreeImage(bild)
EndIf
StartDrawing( ImageOutput(rbild) )
For k=0 To h-1
For i=0 To w-1
kk = (h-1)-k
ii = (w-1)-i
Plot(i,k, p(ii,kk))
Next
Next
StopDrawing()
ElseIf richtung = 2 ;"270° oder 3/2 * Pi"
If w<>h
Swap w,h
rbild = CreateImage(#PB_Any,w+1,h+1)
If IsImage(rbild)
FreeImage(bild)
EndIf
EndIf
StartDrawing( ImageOutput(rbild) )
For k=0 To h
For i=0 To w
kk = (h)-k
ii = (w)-i
Plot(i,k, p(kk,ii))
Next
Next
StopDrawing()
EndIf
ProcedureReturn rbild
EndIf
EndProcedure
Code: Alles auswählen
uniform sampler2D color_texture;
uniform vec2 resolution;
void main(){
float angle = 1.570796327; //270°
vec2 pos = gl_FragCoord.xy/resolution;
pos.x = 1.0 - pos.x;
float sin_factor = sin(angle);
float cos_factor = cos(angle);
pos = (-pos - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);
pos += 0.5;
gl_FragColor = texture2D(color_texture, -pos);
}
Die Procedure sollte nicht nur mit 32bit Farbtiefe klarkommen, sondern auch mit anderen Farbtiefen (24bit).
Und die Procedure sollte mit hohen Auflösungen (> 20 Megapixel) klarkommen.