如果我有一个大小为(200 * 200 * 3)的PixelBuffer对象,其中每个像素有三个连续的RGB颜色点。我如何索引它们,以便我尝试实现DDA线条绘制算法。我在网上看到很多使用PutPixel(x,y)但我不知道如何访问此方法中的像素。
答案 0 :(得分:1)
像素将逐行排列,每个像素使用3个字节。要解决点(x, y)
,您基本上只需要将y
值乘以行的大小(宽度乘以3),将x
值乘以大小像素(3)。
有一些可读性常量,函数的代码可能如下所示:
const int IMG_WIDTH = 200;
const int IMG_HEIGHT = 200;
const int BYTES_PER_PIXEL = 3;
const int BYTES_PER_ROW = IMG_WIDTH * BYTES_PER_PIXEL;
void PutPixel(uint8_t* pImgData, int x, int y, const uint8_t color[3])
{
uint8_t pPixel = pImgData + y * BYTES_PER_ROW + x * BYTES_PER_PIXEL;
for (int iByte = 0; iByte < BYTES_PER_PIXEL; ++iByte)
{
pPixel[iByte] = color[iByte];
}
}
示例如何使用此功能:
// Allocate image data.
uint8_t* pImgData = new uint8_t[IMG_WIDTH * IMG_HEIGHT];
// Initialize image data, unless you are planning to set all pixels.
...
// Set pixel (50, 30) to yellow.
uint8_t yellow[3] = {255, 255, 0};
PutPixel(pImgData, 50, 30, yellow);
在内存中构建图像后,可以使用glBufferData()
将内容存储在像素缓冲区对象中:
GLuint bufId = 0;
glGenBuffers(1, &bufId);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bufId);
glBufferData(GL_PIXEL_UNPACK_BUFFER, IMG_HEIGHT * BYTES_PER_ROW,
pImgData, GL_STATIC_DRAW);