ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 什么是SDL渲染器?

2019-09-26 16:07:19  阅读:158  来源: 互联网

标签:sdl-2 c sdl terminology


我从SDL2开始,在尝试理解SDL_Renderer是什么时遇到了一些麻烦.

它是什么?它有什么作用? SDL_Renderer,SDL_Window,SDL_Surface和SDL_Texture之间有什么区别?它们是如何相关的?

在尝试理解这个介绍性代码时,我遇到了这个问题:

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

我正在使用Twinklebear教程(在SDL Wiki上建议),并查看了SDL Wiki文档和一些书籍.但他们都认为我知道这些定义.

解决方法:

SDL_Window

SDL_Window是保存有关Window本身的所有信息的结构:大小,位置,全屏,边框等.

SDL_Renderer

SDL_Renderer是一个处理所有渲染的结构.它绑定到SDL_Window,因此它只能在SDL_Window内呈现.它还会跟踪与渲染相关的设置.有几个重要的功能绑定到SDL_Renderer

> SDL_SetRenderDrawColor(渲染器,r,g,b,a);
 这会将您清除屏幕的颜色设置为(见下文)
> SDL_RenderClear(渲染器);
这将使用上面设置的绘制颜色清除渲染目标
> SDL_RenderCopy(
这可能是您将使用最多的函数,它用于渲染SDL_Texture并具有以下参数:

> SDL_Renderer *渲染器,
要用于渲染的渲染器.
> SDL_Texture *纹理,
要渲染的纹理.
> const SDL_Rect * srcrect,
要渲染的纹理部分,如果要渲染整个纹理,则为NULL
> const SDL_Rect * dstrect)
您想在窗口中渲染纹理的位置.如果此SDL_Rect的宽度和高度小于或大于纹理本身的尺寸,则将根据此SDL_Rect拉伸纹理

> SDL_RenderPresent(渲染器);
其他SDL_Render *函数绘制到隐藏目标.此函数将采用所有这些并在与渲染器关联的窗口中绘制它.

SDL_Textures和SDL_Surface

SDL_Renderer呈现SDL_Texture,其存储一个元素的像素信息.这是SDL_Surface的新版本,它大致相同.差异主要在于SDL_Surface只是一个包含像素信息的结构,而SDL_Texture是一种有效的,特定于驱动程序的像素数据表示.

您可以使用将SDL_Surface *转换为SDL_Texture

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

在此之后,应使用释放SDL_Surface

SDL_FreeSurface( SDL_Surface* surface )

另一个重要的区别是SDL_Surface使用软件渲染(通过CPU),而SDL_Texture使用硬件渲染(通过GPU).

SDL_Rect

SDL中最简单的结构.它只包含四个短裤. x,y保持位置,w,h保持宽度和高度.

重要的是要注意0,0是SDL的左上角.因此,较高的y值表示较低,而右下角的坐标为x w,y h

您可以在我的blog.上阅读有关SDL2的更多信息

标签:sdl-2,c,sdl,terminology
来源: https://codeday.me/bug/20190926/1820737.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有