【问题标题】:glTexImage2D slicing and alignment issues appearing in window窗口中出现 glTexImage2D 切片和对齐问题
【发布时间】:2017-08-03 14:09:39
【问题描述】:

我正在制作自己的地形图,并且一直在使用来自 NASA 的 .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() 中使用注释版本看起来略有不同,但切角相同。

有没有人暗示发生了什么?我尝试使用图像作为纹理,使用 stbi 库加载,效果很好,所以我不确定哪里出错了。

(图片坐标为N10E099)

【问题讨论】:

    标签: c++ opengl gis topography


    【解决方案1】:

    这看起来像是由 3 宽颜色数据引起的行错位。尝试在 glTexImage2D 之前使用以下调用:

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    

    这个对齐值,默认是4,在读取纹理数据发送到GPU时被glTexImage2D和朋友使用。

    没有验证它是否与数据的实际外观相匹配,因此在像您这样的情况下,一行没有以 4 字节边界结束,下一行的前几个字节将被跳过,导致这种对角线扭曲。

    另一个方向(从 GPU 到客户端内存)的纹理数据传输通过 glPixelStorei(GL_PACK_ALIGNMENT, 1); 对齐。

    【讨论】:

    • @AlexVestin 所以...是哪一个?希望下次我会记住它:p
    • 我会的,需要几分钟。第一个,glPixelStorei(GL_UNPACK_ALIGNMENT, 1);!
    • @Quentin 你为什么要删除底部!
    • @snb 很好,因为那是为了从 GPU 检索 纹理数据,而不是发送它(这是实际问题)。我只是不记得哪个是哪个,所以我把两者都包括了。
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2011-11-26
    相关资源
    最近更新 更多