Apa itu perender SDL?

103

Saya mulai dengan SDL2 dan mengalami masalah saat mencoba memahami apa itu SDL_Renderer.

Apa itu? Apa fungsinya? Apa perbedaan antara SDL_Renderer, SDL_Window, SDL_Surface dan SDL_Texture dan bagaimana keterkaitannya?

Saya mengalami masalah dengan ini ketika mencoba memahami kode pengantar ini:

#include <iostream>
#include <SDL2/SDL.h>

int main()
{
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;
}

Saya menggunakan tutorial Twinklebear (disarankan di SDL Wiki) dan melihat juga di Dokumentasi Wiki SDL dan beberapa buku. Tetapi semuanya berasumsi bahwa saya mengetahui definisi ini.

prcastro
sumber

Jawaban:

196

SDL_Window

SDL_Window adalah struct yang menyimpan semua info tentang Jendela itu sendiri: ukuran, posisi, layar penuh, batas, dll.


SDL_Renderer

SDL_Rendereradalah struct yang menangani semua rendering. Ini terkait dengan SDL_Windowsehingga hanya dapat dirender di dalamnya SDL_Window. Itu juga melacak pengaturan yang terkait dengan rendering. Ada beberapa fungsi penting yang terkait dengan fileSDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Ini mengatur warna yang Anda bersihkan layar ke (lihat di bawah)

  • SDL_RenderClear(renderer);
    Ini membersihkan target rendering dengan set warna gambar di atas

  • SDL_RenderCopy(
    Ini mungkin fungsi yang paling sering Anda gunakan, ini digunakan untuk merender a SDL_Texturedan memiliki parameter berikut:

    • SDL_Renderer* renderer,
      Perender yang ingin Anda gunakan untuk rendering.
    • SDL_Texture* texture,
      Tekstur yang ingin Anda render.
    • const SDL_Rect* srcrect, Bagian dari tekstur yang ingin Anda render, NULL jika Anda ingin merender keseluruhan tekstur
    • const SDL_Rect* dstrect)
      Di mana Anda ingin merender tekstur di jendela. Jika lebar dan tinggi ini SDL_Rectlebih kecil atau lebih besar dari dimensi tekstur itu sendiri, tekstur akan melar sesuai dengan ini.SDL_Rect
  • SDL_RenderPresent(renderer);
    Fungsi SDL_Render * lainnya mengacu pada target tersembunyi. Fungsi ini akan mengambil semua itu dan menggambarnya di jendela yang terkait dengan penyaji.

SDL_Textures dan SDL_Surface

The SDL_Renderermerender SDL_Texture, yang menyimpan informasi pixel dari satu elemen. Ini adalah versi baru SDL_Surfaceyang hampir sama. Perbedaannya sebagian besar SDL_Surfaceadalah hanya structberisi informasi piksel, sedangkan SDL_Texturerepresentasi data piksel khusus driver yang efisien.

Anda dapat mengonversi SDL_Surface * ke SDL_Texture menggunakan

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Setelah ini, SDL_Surface harus dibebaskan menggunakan

SDL_FreeSurface( SDL_Surface* surface )

Perbedaan penting lainnya adalah yang SDL_Surfacemenggunakan rendering perangkat lunak (melalui CPU) sementara SDL_Texturemenggunakan rendering perangkat keras (melalui GPU).


SDL_Rect

Struct paling sederhana di SDL. Ini hanya berisi empat celana pendek. x, yyang menahan posisi dan w, hyang menahan lebar dan tinggi.

Penting untuk dicatat bahwa 0, 0ini adalah pojok kiri atas di SDL. Jadi nilai yang lebih tinggi yberarti lebih rendah, dan pojok kanan bawah akan memiliki koordinatx + w, y + h


Anda dapat membaca lebih lanjut tentang SDL2 di blog saya .

olevegard.dll
sumber
1
Jadi yang Anda sebut SDL_RenderPresent adalah mengambil penyaji itu dengan semua pengaturan dan teksturnya yang diunggah ke sana dan membuatnya membuat informasi ini di Jendela yang terkait dengannya?
prcastro
3
@olevegard, jawaban yang bagus. Hanya untuk memperjelas perbedaan antara SDL_Texture dan SDL_Surface, saya akan menekankan bahwa rendering SDL_Texture menggunakan GPU dan SDL_Surface menggunakan software redering, yang kurang efisien tetapi memungkinkan Anda memanipulasi informasi piksel secara bebas. Juga, blog yang bagus, saya pasti akan membacanya :)
Fabio Picchi
Pernyataan "Ini membersihkan target rendering dengan set warna gambar di atas" , saya yakin, benar tetapi saya tidak dapat memahami frasa "membersihkan" dalam pernyataan itu. The doc selalu menggunakan frase ini. Bisakah Anda menjelaskan apa sebenarnya arti "jelas" di sini? Apakah itu berarti "cat" (sort-of) dengan warna gambar perender saat ini?
Nawaz
Apakah ada alasan untuk menggunakan SDL_Surfacelebih dari itu SDL_Renderer?
Stevoisiak
Jawaban teratas memiliki beberapa ketidakakuratan, SDL_Renderer dapat diikat ke permukaan juga, tidak hanya ke jendela, silakan periksa tautan: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro
9

Anggap saja SDL_Windowsebagai piksel fisik, dan SDL_Renderertempat untuk menyimpan pengaturan / konteks.

Jadi Anda membuat sekumpulan sumber daya, dan menggantungnya dari perender; dan kemudian ketika sudah siap, Anda memberi tahu perender untuk menggabungkan semuanya dan mengirimkan hasilnya ke jendela.

woolstar
sumber