2013-03-05 45 views
4

我想从CSV file中读取包含预计算纹理的浮点数,将其存储在1维数组中,然后将读取的数据放入2维纹理中。
我需要确保下面的代码这样做,因为我有访问数据的问题,我不能找出错误所在:OpenGl glTexImage2D数据

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

+1

实际上,将纹理指定为一维数组是您将纹理传递给OpenGL的最常用方法之一。在指定宽度和高度以及像素格式(您的“3通道”语句)时,您也是正确的。所有这些与你在这里提供的内容看起来是正确的。您的纹理是否在几何图形上不显示?你有没有使用'glTexParamter'指定缩小过滤器?如果没有,请尝试用'GL_NEAREST'调用它来查看你的纹理是否出现。你可以从那里改进。 – radical7 2013-03-06 05:36:36

+0

嘿!感谢您的快速和鼓励的答案!在阅读文件时,我发现有一个错误。之前我也有一个alpha通道,所以我写了'image [4 * i * width-1 + 1] = fData;'而不是'image [3 * i * width-1 + 1] = fData;'我想该错误在另一行代码中。但我现在更有信心找到它!谢谢! – molostil 2013-03-06 12:41:22

回答

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

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

+1

这真的取决于; OpenGL将转换像素类型,特别是在这个通用的_RGB_案例中。由于OP没有指定他正在使用的版本,所以'GL_RGB32F'可能不可用。同样,取决于版本,尽管不太可能,但它可以是非二次幂的纹理。然而,最可能的问题是选择微量过滤器,OP没有说明。 – radical7 2013-03-06 05:33:11

+0

首先感谢您的有益回复。事情是 – molostil 2013-03-06 12:16:16

+0

谢谢您的宝贵意见。它总是非常非常有用,即使使用放大倍数滤波器和微滤滤波器现在没有做到这一点,我以后会遇到问题。 ^^'GL_RGB32F'也没有帮助,但至少我更加确信我的纹理输入现在很可能完美无瑕,而且错误在其他地方。谢谢,我会回应,如果我找到它。 – molostil 2013-03-06 12:47:00

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所有工作正常,而不改变我阅读我的纹理的方式。

谢谢大家!

相关问题