Я работал над загрузчиком растровых изображений с основной целью - не более, чем правильно анализировать данные и отображать их в OpenGL. Я нахожусь в той точке, где мне нужно рисовать пиксели на основе x / y (то есть пиксель за пикселем) (по крайней мере, это то, что я думаю, что мне нужно сделать, что касается рендеринга). Я уже связал объект текстуры и назвал glTexImage2D(...)
.
В настоящее время у меня проблемы с алгоритмом пиксель за пикселем.
Насколько я понимаю, файлы растровых изображений (также известные как DIB) хранят данные цвета в так называемом массиве пикселей. Каждая строка пикселей состоит из x
байтов, причем каждый пиксель содержит количество байтов, делимое на 4 (32 бита на пиксель), 3 (24 бита на пиксель), 2 (16 бит на пиксель) или 1 (8 битов). на пиксель).
Я думаю, что нужно перебрать пиксели, одновременно вычисляя правильное смещение в массиве пикселей, которое относительно его координаты x / y пикселя. Но правда ли это? Если нет, что мне делать? Честно говоря, я немного запутался, несмотря на то, что делал то, что было указано мне в этот вопрос я задал некоторое время назад, это правильный подход.
Я предполагаю, что подход к этому попиксельно - правильный подход, главным образом потому, что рендеринг четырехугольника с glVertex*
и glTexCoord*
не дал ничего, кроме затененного прямоугольника (в то время я думал, что OpenGL справится с этим сам по себе, поэтому почему пытаясь это сделать в первую очередь).
Я также должен отметить, что, хотя в моем вопросе отображаются шейдеры OpenGL 3.1, я перешел на SDL 1.2, чтобы я мог просто использовать немедленный режим, пока не реализованы правильные алгоритмы, а затем снова переключиться на современный GL.
Тестовое изображение, которое я разбираю:
Это выходные данные (вставленные из-за очень большой длины): http://pastebin.com/6RVhAVRq
И код:
void R_RenderTexture_PixByPix( texture_bmp_t* const data, const vec3 center )
{
glBindTexture( GL_TEXTURE_2D, data->texbuf_id );
glBegin( GL_POINTS );
{
const unsigned width = data->img_data->width + ( unsigned int ) center[ VEC_X ];
const unsigned height = data->img_data->height + ( unsigned int ) center[ VEC_Y ];
const unsigned bytecount = GetByteCount( data->img_data->bpp );
const unsigned char* pixels = data->img_data->pixels;
unsigned color_offset = 0;
unsigned x_pixel;
for ( x_pixel = center[ VEC_X ]; x_pixel < width; ++x_pixel )
{
unsigned y_pixel;
for ( y_pixel = center[ VEC_Y ]; y_pixel < height; ++y_pixel )
{
}
const bool do_color_update = true; //<--- replace true with a condition which checks to see if the color needs to be updated.
if ( do_color_update )
{
glColor3fv( pixels + color_offset );
}
color_offset += bytecount;
}
}
glEnd();
glBindTexture( GL_TEXTURE_2D, 0 );
}