glTexImage2D проблемы с нарезкой и выравниванием, появляющиеся в окне

Я работаю над созданием собственной топографической карты и использую файлы .hgt из НАСА.

Я загружаю файлы, используя

void MapImage::load_map_file(const char* filename) {
std::ifstream file(filename, std::ios::in | std::ios::binary);
if (!file) {
std::cout << "Error opening file!" << std::endl;
}
std::vector<short> tempHeight(TOTAL_SIZE);
unsigned char buffer[2];

int x, y;
for (int i = 0; i < TOTAL_SIZE; i++) {
if (!file.read(reinterpret_cast<char*>(buffer), sizeof(buffer))) {
std::cout << "Error reading file!" << std::endl;
}
tempHeight[i] = (buffer[0] << 8) | buffer[1];
}

height = tempHeight;
}

А затем добавить их в растровое изображение памяти, используя:

void MapImage::loadTextureImage() {
img_tex = 0;
glGenTextures(1, &img_tex);

int x, y, w, h;
w = h = SRTM_SIZE;
unsigned char* img;
img = (unsigned char *)malloc(3 * w * h);
memset(img, 0, sizeof(img));

int g = 0;
double height_color;

/*
for(int i = 0; i < TOTAL_SIZE; i++){
height_color = (float)height[i] / 10.0;
g = (height_color * 255);
if (g>255)g = 255;

img[i * 3 + 2] = (unsigned char)0;
img[i * 3 + 1] = (unsigned char)g;
img[i * 3 + 0]= (unsigned char)0;
}
*/

for (int i = 0; i < w; i++) {
for (int j = 0; j < h; ++j) {
x = i;
y = (h - 1) - j;

height_color = (float)height[j + (i * w)] / 10.0;
g = (height_color * 255);
if (g>255)g = 255;

img[(x + y*w) * 3 + 2] = (unsigned char)0;
img[(x + y*w) * 3 + 1] = (unsigned char)g;
img[(x + y*w) * 3]     = (unsigned char)0;
}
}glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, img_tex);

glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RGB,
w,
h,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
img
);
}

Однако это приводит к изображению с нарезанным углом, как это
Нарезанное изображение

Использование закомментированной версии в loadTextureImage () выглядит немного по-другому, но с одним и тем же углом.
Нарезанное изображение 2

У кого-нибудь есть подсказка, что происходит? Я пытался использовать изображение в качестве текстуры, загружая его с помощью библиотеки stbi, и это прекрасно работает, поэтому я не уверен, что это не так.

(координаты для изображения N10E099)

1

Решение

Это похоже на смещение строк, вызванное данными о цвете шириной 3. Попробуйте использовать следующий вызов непосредственно перед glTexImage2D:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

Это значение выравнивания, которое 4 по умолчанию используется glTexImage2D и друзья, когда данные текстуры читаются для отправки в графический процессор.

Нет подтверждения, что он соответствует тому, как на самом деле выглядят данные, поэтому в таких случаях, как ваш, где строка не заканчивается на 4-байтовой границе, первые несколько байтов следующей строки будут пропущены, что приведет к этому диагональному искажению ,

Передача текстурных данных в другом направлении (из графического процессора в клиентскую память) выравнивается с помощью glPixelStorei(GL_PACK_ALIGNMENT, 1);,

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]