到目前为止,我有这段代码:
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);
但是当我在成功构建之后尝试运行它时,它只是说我的项目已“停止工作”。
答案 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个频道。