OpenGl glTexImage2D数据

时间:2013-03-05 23:33:57

标签: opengl textures

我正在尝试从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个通道...所以大小应该没问题我猜? 我的程序仍然无法按预期工作,这是错误的一个潜在来源。

2 个答案:

答案 0 :(得分:5)

嘿,伙计们,我解决了我乱糟糟的纹理阅读......我不知道是什么进入了我,但我的阵列的启动是纯粹的无意义。这是更正的代码,我在尝试编写测试纹理时发现:

// 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一切正常,而不会改变我阅读纹理的方式。

谢谢大家!

答案 1 :(得分:2)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, &image[0]);

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