我在理解纹理流和从原始像素数据数组加载2D纹理时遇到了一些麻烦。
这是我的代码:
#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;
}
它不是在我的程序中将前64个像素绘制为红色,而将其余的品红色绘制为红色,而是随机散发出红色和黄色像素。
我在理解SDL_CreateTexture和SDL_UpdateTexture时遇到问题。
答案 0 :(得分:0)
您的pitch
在UpdateTexture中是错误的。间距是一行的字节长度,而不是单个像素。在您的情况下,音高为64*4
。
像素格式SDL_PIXELFORMAT_RGBA32
是SDL_PIXELFORMAT_RGBA8888
或SDL_PIXELFORMAT_ABGR8888
的别名(您的情况是后者)。看https://wiki.libsdl.org/SDL_PixelFormatEnum。因此,您的0xFF00FFFF
是黄色的(R = 0xff,G = 0xff,B = 0,A = 0xff)。
最后,如果我们正在谈论纹理流传输(即更新每帧或非常频繁地更新),则应创建流传输纹理并使用LockTexture / UnlockTexture。 UpdateTexture用于静态纹理。