Trình kết xuất SDL là gì?


103

Tôi đang bắt đầu với SDL2 và gặp một số khó khăn khi cố gắng hiểu SDL_Renderer là gì.

Nó là gì? Nó làm gì? Sự khác biệt giữa SDL_Renderer, SDL_Window, SDL_Surface và SDL_Texture là gì và chúng có liên quan như thế nào?

Tôi đã gặp vấn đề với điều này khi cố gắng hiểu mã giới thiệu này:

#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;
}

Tôi đang sử dụng hướng dẫn Twinklebear (được đề xuất trên SDL Wiki) và cũng đã xem trên Tài liệu SDL Wiki và một số sách. Nhưng tất cả họ đều cho rằng tôi biết những định nghĩa này.

Câu trả lời:


196

SDL_Window

SDL_Window là cấu trúc chứa tất cả thông tin về chính Cửa sổ: kích thước, vị trí, toàn màn hình, đường viền, v.v.


SDL_Renderer

SDL_Rendererlà một cấu trúc xử lý tất cả các kết xuất. Nó được gắn với a SDL_Windowđể nó chỉ có thể hiển thị trong đó SDL_Window. Nó cũng theo dõi các cài đặt liên quan đến kết xuất. Có một số chức năng quan trọng gắn liền vớiSDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Điều này đặt màu bạn xóa màn hình thành (xem bên dưới)

  • SDL_RenderClear(renderer);
    Thao tác này sẽ xóa mục tiêu kết xuất với màu vẽ được đặt ở trên

  • SDL_RenderCopy(
    Đây có lẽ là hàm bạn sẽ sử dụng nhiều nhất, nó được sử dụng để hiển thị a SDL_Texturevà có các tham số sau:

    • SDL_Renderer* renderer,
      Trình kết xuất bạn muốn sử dụng để kết xuất.
    • SDL_Texture* texture,
      Kết cấu bạn muốn kết xuất.
    • const SDL_Rect* srcrect, Phần kết cấu bạn muốn kết xuất, NULL nếu bạn muốn kết xuất toàn bộ kết cấu
    • const SDL_Rect* dstrect)
      Nơi bạn muốn hiển thị kết cấu trong cửa sổ. Nếu chiều rộng và chiều cao của SDL_Rectkích thước này nhỏ hơn hoặc lớn hơn kích thước của chính kết cấu, thì kết cấu sẽ được kéo dài theo điều nàySDL_Rect
  • SDL_RenderPresent(renderer);
    Các hàm SDL_Render * khác kéo đến một mục tiêu ẩn. Hàm này sẽ lấy tất cả những thứ đó và vẽ nó trong cửa sổ gắn với trình kết xuất.

SDL_Textures và SDL_Surface

Kết SDL_Rendererxuất SDL_Texture, lưu trữ thông tin pixel của một phần tử. Đó là phiên bản mới của SDL_Surfacenó cũng giống như vậy. Sự khác biệt chủ yếu SDL_Surfacelà chỉ structchứa thông tin pixel, trong khi đó SDL_Texturelà sự trình bày hiệu quả, cụ thể cho trình điều khiển của dữ liệu pixel.

Bạn có thể chuyển đổi SDL_Surface * sang SDL_Texture bằng

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

Sau đó, SDL_Surface sẽ được giải phóng bằng cách sử dụng

SDL_FreeSurface( SDL_Surface* surface )

Một sự khác biệt quan trọng khác là SDL_Surfacesử dụng kết xuất phần mềm (thông qua CPU) trong khi SDL_Texturesử dụng kết xuất phần cứng (qua GPU).


SDL_Rect

Cấu trúc đơn giản nhất trong SDL. Nó chỉ chứa bốn chiếc quần đùi. x, ycái nào giữ vị trí và w, hcái nào giữ chiều rộng và chiều cao.

Điều quan trọng cần lưu ý 0, 0là góc trên bên trái trong SDL. Vì vậy, giá ytrị cao hơn có nghĩa là thấp hơn và góc dưới cùng bên phải sẽ có tọa độx + w, y + h


Bạn có thể đọc thêm về SDL2 trên blog của tôi .


1
Vì vậy, những gì bạn khi bạn gọi SDL_RenderPresent là sử dụng trình kết xuất đó với tất cả cài đặt và kết cấu của nó đã được tải lên nó và làm cho nó hiển thị thông tin này trên Window mà nó được liên kết?
prcastro

3
@olevegard, câu trả lời tuyệt vời. Chỉ để làm rõ sự khác biệt giữa SDL_Texture và SDL_Surface, tôi muốn nhấn mạnh rằng SDL_Texture kết xuất bằng GPU và SDL_Surface sử dụng phần mềm đặt hàng, kém hiệu quả hơn nhưng cho phép bạn thao tác tự do thông tin pixel. Ngoài ra, blog tuyệt vời, tôi chắc chắn sẽ đọc nó :)
Fabio Picchi

Tôi tin rằng tuyên bố "Điều này xóa mục tiêu hiển thị với màu vẽ được đặt ở trên" , tôi tin là đúng nhưng tôi không thể hiểu cụm từ "xóa" trong câu lệnh. Tài liệu luôn sử dụng cụm từ này. Bạn có thể vui lòng giải thích chính xác "rõ ràng" ở đây có nghĩa là gì? Nó có nghĩa là "sơn" (sắp xếp) với màu vẽ hiện tại của trình kết xuất?
Nawaz

Có lý do gì để sử dụng SDL_Surfacehơn SDL_Rendererkhông?
Stevoisiak

Đầu câu trả lời có một số thiếu chính xác, SDL_Renderer có thể gắn liền với bề mặt quá, không chỉ để cửa sổ, hãy kiểm tra các liên kết: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

Hãy SDL_Windowcoi đó là pixel vật lý SDL_Renderervà là nơi lưu trữ cài đặt / ngữ cảnh.

Vì vậy, bạn tạo ra một loạt các tài nguyên và treo chúng khỏi trình kết xuất; và sau đó khi nó sẵn sàng, bạn yêu cầu trình kết xuất tổng hợp tất cả lại với nhau và gửi kết quả đến cửa sổ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.