[英]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_RGBA32
是SDL_PIXELFORMAT_RGBA8888
或SDL_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.