我目前正在参加一个C ++游戏库类,对于这个类来说,我们的长达四分之一的项目是构建一个支持各种事物的渲染器。对于当前的实验室,我们的讲师给了我们一个关于手动将bmp加载到OpenGL中并将其应用于我们的几何图形的教程。
教程:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/
在逐步完成本教程后,我的纹理有一些有趣的行为。我去过其他同学,高年级学生和多位导师。他们都不知道发生了什么。考虑到本实验室几乎每个人的代码都是相同的,而且我是唯一一个遇到这个问题的人,我不禁感到困惑。
我正在使用以下OBJ和纹理。我将OBJ转换为我自己构建的OBJ转换器中的二进制文件。我的渲染器接收这个二进制文件并将数据发送到OpenGL顶点缓冲区。
OBJ和纹理:http://www.models-resource.com/playstation_2/ratchetclank/model/6662/
我的朋友和我有相同的二进制文件结构,所以我给了他一份我的二进制文件来检查UV是否正确。他渲染出一只纹理完美的鸡肉,同时心灵呈现出看起来像纹理的鸡肉水平压扁到模型长度的1/16,然后重复了一堆。我会发布图片,但我是新来的,并没有足够的声誉这样做。在周末,我会尽力提高自己的声誉,因为我认为这有助于直观地看到我的问题。
我会发布我的源代码,但是这个项目接近大约16,000行代码,我怀疑是否有人愿意搜索它以找到陌生人的问题。
任何建议都会有所帮助,我主要是对使用OpenGL纹理或一般的.bmps时可能会遇到的常见错误感到好奇。
感谢Ya。
// -----编辑一个----- //
我朋友的结果
我的结果
我担心我不允许使用其他库。我可能应该在我最初的帖子中提到过。
这是我在bmp中加载的代码,我从我学校的一位上层人员那里听说我忽略了一些叫做位深度的东西。我知道这个教程非常糟糕,而且我宁愿学会做正确的事,而不是只是勉强学会。如果任何人有关于这个问题的良好资源,我将非常感谢被指向这个方向。
unsigned char header[54];
unsigned int dataPos;
unsigned int width, height;
unsigned int imageSize;
unsigned char * data;
FILE * file = fopen(filePath, "rb");
if (!file)
{
printf("\nImage could not be opened");
exit(1);
}
if (fread(header, 1, 54, file) != 54){
printf("\nNot a correct BMP file");
exit(1);
}
if (header[0] != 'B' || header[1] != 'M'){
printf("\nNot a correct BMP file");
exit(1);
}
dataPos = *(int*)&(header[0x0A]);
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);
if (imageSize == 0) imageSize = width * height * 3;
if (dataPos == 0) dataPos = 54;
data = new unsigned char[imageSize];
fread(data, 1, imageSize, file);
fclose(file);
glGenTextures(1, &m_textureID);
glBindTexture(GL_TEXTURE_2D, m_textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
我目前正在使用着色器。我有一个片段和一个顶点着色器,它们与本教程中描述的着色器相同。我正在验证每一个并确保它们正在编译。
// -----编辑两个----- //
所以我采取了durhass的建议,并将我的颜色设置为等于vec3(0.0,uv.x,uv.y),其中uv是一个保存纹理坐标的vec2,这就是我得到的。
所以我认为我可以看到问题的根源。我认为我没有正确地将我的uv存储在我的gl缓冲区中。考虑到我的朋友的引擎可以正常工作,我不认为二进制文件的UV存在问题。 Il看看这个,谢谢你的建议,这可能会导致修复!