简体   繁体   English

如何从十六进制值的缓冲区渲染矩形SDL2纹理?

[英]How to render a rectangle SDL2 texture from a buffer of hex values?

I'm having some trouble understanding texture streaming and loading a 2D texture from an array of raw pixel data. 我在理解纹理流和从原始像素数据数组加载2D纹理时遇到一些麻烦。

Here is my code: 这是我的代码:

#include <stdio.h>
#include <stdlib.h>

#include <SDL2/SDL.h>

#define WINDOW_W 640
#define WINDOW_H 320

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING))
        exit(1);

    /* Set up main window. */
    SDL_Window *window = SDL_CreateWindow(
        "Texture Streaming",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        WINDOW_W,
        WINDOW_H,
        SDL_WINDOW_SHOWN
    );
    if (window == NULL)
        exit(2);

    /* Set up renderer. */
    SDL_Renderer *renderer = SDL_CreateRenderer(
        window,
        -1,
        SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
    );
    if (renderer == NULL)
        exit(3);

    SDL_Event   ev;
    int         window_running = 1;

    SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, 64, 32);
    Uint32 pixels[64 * 32];
    for (int i = 0; i < (64 * 32); i++)
        pixels[i] = 0xFF00FFFF;
    for (int i = 0; i < 64; i++)
        pixels[i] = 0xFF0000FF;
    SDL_UpdateTexture(texture, NULL, pixels, 4);

    while (window_running)
    {
        while (SDL_PollEvent(&ev) != 0)
        {
            if (ev.type == SDL_QUIT)
                window_running = 0;
        }
        SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

Instead of my program drawing the first 64 pixels red and the rest magenta, it just spits out a random chunk of red and yellow pixels. 而不是我的程序将前64个像素绘制为红色,将其余的品红色绘制为红色,而是仅散发出随机的红色和黄色像素块。

I'm having trouble understanding SDL_CreateTexture and SDL_UpdateTexture. 我在理解SDL_CreateTexture和SDL_UpdateTexture时遇到问题。

Your pitch in UpdateTexture is wrong. 您的pitch在UpdateTexture是错误的。 Pitch is byte length of a row, not single pixel. 间距是一行的字节长度,而不是单个像素。 In your case pitch is 64*4 . 在您的情况下,间距为64*4

Pixel format SDL_PIXELFORMAT_RGBA32 is alias to either SDL_PIXELFORMAT_RGBA8888 or SDL_PIXELFORMAT_ABGR8888 (latter in your case). 像素格式SDL_PIXELFORMAT_RGBA32SDL_PIXELFORMAT_RGBA8888SDL_PIXELFORMAT_ABGR8888 (在您的情况下为后者)的别名。 Look at https://wiki.libsdl.org/SDL_PixelFormatEnum . 查看https://wiki.libsdl.org/SDL_PixelFormatEnum So your 0xFF00FFFF is yellow (R=0xff, G=0xff, B=0, A=0xff). 因此您的0xFF00FFFF为黄色(R = 0xff,G = 0xff,B = 0,A = 0xff)。

Finally, if we're talking about texture streaming (ie updating every frame or otherwise very often), you should create streaming texture and use LockTexture/UnlockTexture. 最后,如果我们谈论的是纹理流传输(即更新每帧或非常频繁地更新),则应创建流传输纹理并使用LockTexture / UnlockTexture。 UpdateTexture is for static textures. UpdateTexture用于静态纹理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM