【问题标题】:OpenGl glTexImage2D dataOpenGL glTexImage2D 数据
【发布时间】:2020-11-04 01:05:43
【问题描述】:

我正在尝试从包含预计算纹理的 CSV file 中读取浮点数,将其存储在一维数组中,然后将读取的数据放入二维纹理中。
我需要确保以下代码能够做到这一点,因为我在访问数据时遇到问题,而且我无法确定错误出在哪里:

// Allocate memory  
float * image = new float [width * height * 3 ];  
for( int i = 0; i < height; i++)  
    {  
        for( int j = 0; j < width-1; j++)  
            {  
                fscanf( fDataFile, "%f,", &fData );  
                image[ 4 * i * j + 0 ] = fData;  
                image[ 4 * i * j + 1 ] = fData;  
                image[ 4 * i * j + 2 ] = fData;  
            }  
        fscanf( fDataFile, "%f", &fData );  
        image[ 4 * i * width-1 + 0 ] = fData;  
        image[ 4 * i * width-1 + 1 ] = fData;  
        image[ 4 * i * width-1 + 2 ] = fData;  
     }   

这里应该没有问题,但困扰我的是以下几点:

// create the texture  
glGenTextures(1, &texHandle);  
glBindTexture(GL_TEXTURE_2D, texHandle);   
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]); 

只给glTexImage2D 指向我的一维数组的指针可以吗?
数组的大小是宽度*高度*3,纹理的格式应该是宽度*高度,有 3 个通道......所以我猜大小​​应该没问题?! 我的程序仍然无法按预期运行,这是一个潜在的错误来源。

【问题讨论】:

  • 事实上,将纹理指定为一维数组是最常见的将纹理传递到 OpenGL 的方法之一。您在指定宽度和高度以及像素格式(您的“3通道”声明)时也是正确的。与您在此处提供的内容相比,所有这些看起来都是正确的。是不是你的纹理没有出现在几何体上?您是否使用glTexParamter 指定了缩小过滤器?如果没有,请尝试使用GL_NEAREST 调用它以查看您的纹理是否出现。您可以从那里进行细化。
  • 嘿!感谢您的快速和令人鼓舞的回答!确实,我在阅读文件时发现了一个错误。在我也有一个 alpha 通道之前,所以我写了image[ 4 * i * width-1 + 1 ] = fData; 而不是image[ 3 * i * width-1 + 1 ] = fData;,我猜错误是在另一行代码。但我现在更有信心找到它!谢谢!

标签: opengl textures


【解决方案1】:

我解决了我搞砸的纹理阅读。我不知道发生了什么,但我的阵列的初始化纯属无稽之谈。这是我在尝试编写测试纹理时发现的更正代码:

// Allocate memory  
float * image = new float [width * height * 3 ];  
for( int i = 0; i < height; i++)  
{  
    for( int j = 0; j < width-1; j++)  
    {  
        fscanf( fDataFile, "%f,", &fData );  
        image[ 3 * (i * width + j) + 0 ] = fData;  
        image[ 3 * (i * width + j) + 1 ] = fData;  
        image[ 3 * (i * width + j) + 2 ] = fData;  
        //image[ 4 * i * j + 2 ] = 1.0f;  
    }  
    fscanf( fDataFile, "%f", &fData );  
    image[ 3 * (i * width + width-1) + 0 ] = fData;  
    image[ 3 * (i * width + width-1) + 1 ] = fData;  
    image[ 3 * (i * width + width-1) + 2 ] = fData;  
    //image[ 4 * i * width-1 + 2 ] = 1;  
}  

此外,它现在可以独立于内部格式工作。 GL_RGB, GL_RGBA, GL_RGB32F and GL_RGBA32F 一切正常,无需改变我阅读纹理的方式。

【讨论】:

    【解决方案2】:
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]);
    

    您应该使用floating-point internal format。例如,GL_RGB32F。那应该是第三个参数。

    【讨论】:

    • 这真的取决于; OpenGL 将转换像素类型,尤其是在这种通用的 RGB 情况下。由于 OP 没有指定他正在使用的版本,GL_RGB32F 可能不可用。同样,根据版本,虽然不太可能,但它可能是非二次幂纹理。但是,最可能的问题是 OP 未指定的缩小过滤器的选择。
    • 首先感谢您的帮助。问题是
    • 感谢两位的出色意见。它总是非常有帮助,即使使用放大滤镜和缩小滤镜现在没有起到作用,我想我以后会遇到问题。 ^^ GL_RGB32F 也无济于事,但至少我更有信心我的纹理输入现在很可能完美无缺,错误在其他地方。谢谢,如果我找到了,我会回复。
    猜你喜欢
    • 2018-07-12
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2012-12-15
    相关资源
    最近更新 更多