tetera sirve que primitivas para glfrustum funciones figuras ejemplos animacion opengl sdl

sirve - primitivas de opengl



Forma correcta de escalar una superficie SDL sin recorte? (3)

¿Cuál es la forma correcta de escalar una superficie SDL? Encontré una explicación en línea pero requirió volver a dibujar la Superficie píxel por píxel. Parece que debería haber alguna manera de hacerlo de forma nativa a través de SDL en lugar de volver a dibujar la imagen de esa manera. No he podido encontrar nada en la documentación de SDL que cubra esto. Puedo cambiar el tamaño de las superficies sin ningún problema modificando el ancho y la altura de las superficies, pero la superficie resultante se recorta.


SDL no admite blitting escalado. De acuerdo con la documentación de SDL_BlitSurface :

Nota: el blitter SDL no (todavía) tiene la capacidad de escalar las superficies blighted hacia arriba o hacia abajo como es el caso con otros mecanismos de blitting más sofisticados. Tienes que descubrir algo por ti mismo si quieres escalar imágenes (por ejemplo, usa SDL_gfx).

Puede encontrar SDL_gfx aquí . Escribir tu propia función de blitting no es tan malo, podría ser un experimento de aprendizaje útil y divertido (aunque estarías reinventando la rueda). Usar OpenGL también es una opción, ya que cosas como escalar y rotar se pueden hacer en una sola llamada a función.


Para completar, y dado que la pregunta no especifica la versión SDL, es posible escalar en SDL2 utilizando el método API SDL_RenderCopyEx . No se necesitan libs adicionales además de la lib básica SDL2.

int SDL_RenderCopyEx(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect, const double angle, const SDL_Point* center, const SDL_RendererFlip flip)

Al establecer el tamaño de dstrect uno puede escalar la textura a un número entero de píxeles. También es posible rotar y voltear la textura al mismo tiempo.

Técnicamente, esto no es escalar una superficie, sino escalar una textura. El procedimiento debe ser tan relevante, ya que las superficies casi siempre se convierten en texturas antes de que la representación se realice en aplicaciones basadas en SDL2.

Referencia: https://wiki.libsdl.org/SDL_RenderCopyEx

Crea tus texturas como de costumbre:

surface = IMG_Load(filePath); texture = SDL_CreateTextureFromSurface(renderer, surface);

Y cuando SDL_RenderCopyEx el momento de renderizarlo, llame a SDL_RenderCopyEx lugar de a SDL_RenderCopy


Sé que esta respuesta es demasiado tarde para ayudar a la persona que la solicitó, pero decidí escribir esto para ayudar a cualquier persona que tropiece con esta pregunta. En SDL 2.0, puede usar la función SDL_BlitScaled() para escalar una superficie en un SDL_Rect objetivo. Hay un tutorial de LazyFoo que describe esto o echa un vistazo a esta documentación .