我正在尝试学习如何在OpenGL中使用纹理。我开始阅读OpenGL红皮书中关于纹理映射的章节。我不明白所以我用Google搜索并找到了this tutorial。我按照说明操作,但仍然无法使其工作。 This是代码。
This是我的纹理图像。我用Photoshop将其转换为this。文件大小为175KB,大小合适(200x300x3 = 180000)。
我尝试在另一个程序中读取该文件,看看内容是否正确。似乎我只能读取大约221个像素(大约是图像的第一行)并且它达到了eof()。在我的程序中,我尽可能多地阅读,但是当我调试时,我注意到在一些点之后字节归零。
现在我很困惑。我的程序有问题吗?纹理有问题吗?我有问题吗?我究竟做错了什么?我该如何解决?
答案 0 :(得分:1)
问题是你的代码。您尝试使用文本模式读取二进制文件。而是使用以下代码:
ifstream tex("ace.raw", ios::in | ios::binary);
if(tex.is_open())
for(int j=0; j<imH; ++j)
for(int i=0; i<imW; ++i)
for(int k=0; k<3; ++k)
{
face[j][i][k] = tex.get();
}
tex.close();
或更短且等效的代码:
ifstream tex("ace.raw", ios::in | ios::binary);
if (tex.is_open())
tex.read((char*)face, sizeof(face));
tex.close();
两个代码都经过测试,“face”变量与“ace.raw”完全相同。
答案 1 :(得分:-1)
纹理如何显示?这是垃圾吗?它只是纯白色(即没有纹理)?根据您的图形卡,您的纹理可能需要2的幂作为宽度/高度和/或您的纹理必须是正方形。没有使用mipmap会有效吗?
即使没有能够读取完整的文件或在那里有一些损坏的数据,如果阅读文件变得疯狂,你至少应该看到一些垃圾作为纹理。
答案 2 :(得分:-2)
不,没有问题。图像可以包含许多零字节,在不遗漏任何内容的情况下读取所有内容,请确保统计其大小。