如何将.pgm纹理文件加载到openGL中

时间:2014-04-18 08:39:44

标签: c++ opengl

到目前为止,我有这段代码:

ifstream textureFile;
char* fileName="BasketBall.pgm";
textureFile.open(fileName, ios::in);
if (textureFile.fail()) {
    displayMessage(ERROR_MESSAGE, "initTexture(): could not open file %s",fileName);
}
skipLine(textureFile); // skip the "P2" line in the Net.pgm file.
textureFile >> textureWidth; // read in the width
textureFile >> textureHeight; // read in the height
int maxGrayScaleValue;
textureFile >> maxGrayScaleValue; // read in the maximum gray value (255 in this case)
texture = new GLubyte[textureWidth*textureHeight];

int grayScaleValue;
for (int k = 0; k < textureHeight; k++) {
    for(int l = 0; l < textureWidth; l++) {
        textureFile >> grayScaleValue;
        texture[k * textureWidth + l]=(GLubyte) grayScaleValue;
    }
}
textureFile.close();

glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 
            0, GL_RGBA, GL_UNSIGNED_BYTE, texture);

但是当我在成功构建之后尝试运行它时,它只是说我的项目已“停止工作”。

1 个答案:

答案 0 :(得分:1)

这很可能是因为您尝试将灰度图像加载到RGBA容器中。

我可以通过两种方式来尝试解决您的问题:

第一个是使texture大3倍,并将灰度值加载到3个连续的空格中。所以:

texture = new GLubyte[textureWidth*textureHeight*3];

for (int k = 0; k < textureHeight; k++) {
    for(int l = 0; l < textureWidth; l+=3) {
        textureFile >> grayScaleValue;
        texture[k * textureWidth + l]=(GLubyte) grayScaleValue;
        texture[k * textureWidth + l + 1]=(GLubyte) grayScaleValue;
        texture[k * textureWidth + l + 2]=(GLubyte) grayScaleValue;
    }
}

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 
        0, GL_RGB, GL_UNSIGNED_BYTE, texture);

第二种方法只用一个通道来尝试:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, textureWidth, textureHeight, 
        0, GL_RED, GL_UNSIGNED_BYTE, texture);

除此之外,我建议使用调试器和断点来逐步执行代码并找出崩溃的位置,但正如我上面提到的,可能是因为您将单个通道纹理传递到容器中期待4个频道。