Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从SDL 1.2中的RGB值数组渲染像素?_C++_Rendering_Sdl_Pixel - Fatal编程技术网

C++ 从SDL 1.2中的RGB值数组渲染像素?

C++ 从SDL 1.2中的RGB值数组渲染像素?,c++,rendering,sdl,pixel,C++,Rendering,Sdl,Pixel,我现在正在开发一个NES模拟器,我很难弄清楚如何渲染像素。我使用一个三维数组来保存每个像素的RGB值。对于256 x 224屏幕大小,阵列定义如下所示: byte screenData[224][256][3]; 例如,[0][0][0]保存蓝色值,[0][0][1]保存绿色值,[0][0][2]保存屏幕位置处像素的红色值[0][0] 当vblank标志变高时,我需要渲染屏幕。当SDL去渲染屏幕时,screenData数组将充满每个像素的RGB值。我从中找到了一个名为SDL_CreateRGB

我现在正在开发一个NES模拟器,我很难弄清楚如何渲染像素。我使用一个三维数组来保存每个像素的RGB值。对于256 x 224屏幕大小,阵列定义如下所示:

byte screenData[224][256][3];
例如,
[0][0][0]
保存蓝色值,
[0][0][1]
保存绿色值,
[0][0][2]
保存屏幕位置处像素的红色值
[0][0]

当vblank标志变高时,我需要渲染屏幕。当SDL去渲染屏幕时,screenData数组将充满每个像素的RGB值。我从中找到了一个名为SDL_CreateRGBSurfaceFrom>的函数,看起来它可以实现我想要的功能。但是,我看到的所有示例都使用一维数组来表示RGB值,而不是三维数组


对我来说,渲染像素的最佳方式是什么?如果该函数允许我以某种方式调整曲面的大小,这样我就不必使用256 x 224的窗口大小,那就太好了

您需要将数据存储为一维
字符
数组

int channels = 3; // for a RGB image
char* pixels = new char[img_width * img_height * channels];

// populate pixels with real data ...

SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)pixels,
                img_width,
                img_height,
                channels * 8,          // bits per pixel = 24
                img_width * channels,  // pitch
                0x0000FF,              // red mask
                0x00FF00,              // green mask
                0xFF0000,              // blue mask
                0);                    // alpha mask (none)

在2.0中,使用
SDL_纹理
+
SDL_纹理访问流
+
SDL_渲染复制
,它比
SDL_渲染点
更快

见:

  • 官方示例:
  • 我的派生示例不需要blob数据,并比较了两种方法:

相关:

我有一个窗口和一个曲面,如何更新窗口以使用我的曲面?没有setSurface()或updateSurface()函数。