Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
波前OBJ模型未渲染-OpenGL C++; 我不能用C++中的 GDReleWrices < /Stult>渲染Objo模型。_C++_Opengl_Rendering_Vbo - Fatal编程技术网

波前OBJ模型未渲染-OpenGL C++; 我不能用C++中的 GDReleWrices < /Stult>渲染Objo模型。

波前OBJ模型未渲染-OpenGL C++; 我不能用C++中的 GDReleWrices < /Stult>渲染Objo模型。,c++,opengl,rendering,vbo,C++,Opengl,Rendering,Vbo,这是我的密码: #包括 #包括 #包括 #包括 #包括“Object.h” #定义缓冲区偏移量(i)((字符*)NULL+(i)) 类模型:公共对象 { 私人: 结构顶点 { cbv1、v2、v3; CBfloat vn1、vn2、vn3; CBVT1、vt2; 顶点(vec3\u位置、vec3\u法线、vec2\u texCoord) { v1=_位置[0]; v2=_位置[1]; v3=_位置[2]; vn1=_正常[0]; vn2=_正常[1]; vn3=_正常[2]; vt1=_texC

这是我的密码:

#包括
#包括
#包括
#包括
#包括“Object.h”
#定义缓冲区偏移量(i)((字符*)NULL+(i))
类模型:公共对象
{
私人:
结构顶点
{
cbv1、v2、v3;
CBfloat vn1、vn2、vn3;
CBVT1、vt2;
顶点(vec3\u位置、vec3\u法线、vec2\u texCoord)
{
v1=_位置[0];
v2=_位置[1];
v3=_位置[2];
vn1=_正常[0];
vn2=_正常[1];
vn3=_正常[2];
vt1=_texCoord[0];
vt2=_texCoord[1];
}
};
结构面
{
CBuint v[3];
c单元vt[3];
CBuint-vn[3];
C单元材料id;
面(CBuint v1、CBuint vt1、CBuint vn1、CBuint v2、CBuint vt2、CBuint vn2、CBuint v3、CBuint vn3):材质id(-1)
{
v[0]=v1;
vt[0]=vt1;
vn[0]=vn1;
v[1]=v2;
vt[1]=vt2;
vn[1]=vn2;
v[2]=v3;
vt[2]=vt3;
vn[2]=vn3;
}
};
结构网格
{
CBuint vbo;
CBuint-ebo;
网格(){}
网格(标准::向量&v,标准::向量&i)
{
//产生
glGenBuffers(1,&vbo);
glGenBuffers(1和ebo);
//束缚
glBindBuffer(GL_数组_BUFFER,vbo);
glBindBuffer(GLU元素数组缓冲区,ebo);
//缓冲区
glBufferData(GL_数组_缓冲区,v.size()*sizeof(顶点)和v[0],GL_静态_绘制);
glBufferData(GL_元素数组缓冲区,sizeof(CBuint)*3,&i[0],GL_静态图);
//设置属性
glvertexattributepointer(0,3,GL_浮点,GL_假,sizeof(顶点),BUFFER_偏移(0));
glvertexattributepointer(1,3,GL_FLOAT,GL_FALSE,sizeof(顶点),BUFFER_OFFSET(sizeof(v)*3));
glvertexattributepointer(2,2,GL_FLOAT,GL_FALSE,sizeof(顶点),BUFFER_OFFSET(sizeof(v)*5));
//启用属性
GlenableVertexAttributeArray(0);
GlenableVertexAttributeArray(1);
GlenableVertexAttributeArray(2);
//清理
glBindVertexArray(0);
}
~Mesh()
{
glDeleteBuffers(1和vbo);
glDeleteBuffers(1和ebo);
}
};
//局部变量
CBuint_vao;
布尔实现了;
std::string\u obj\u url;
std::string\u mtl\u url;
std::向量_材料_元素;
std::向量_顶点;
std::向量指数;
std::矢量网格;
std::矢量材料;
公众:
模型(着色器*着色器):_物质化(假){}
模型(着色器*着色器,常量字符*对象文件):\u物质化(假)
{
//加载OBJ文件
if(loadOBJ(obj_文件)!=1)

std::cout您发布了大量代码,因此可能会出现比下面指出的错误更多的错误。此外,即使您正确加载和渲染对象,由于各种原因,它仍然无法显示,例如,因为坐标在视图体积之外

通过快速查看,我在代码中看到了两个错误,即将几何体加载到缓冲区并设置顶点属性:

glBufferData(GL_ARRAY_BUFFER, v.size() * sizeof(Vertex), &v[0], GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(CBuint) * 3, &i[0], GL_STATIC_DRAW);
在第二次调用中,您只将3个索引加载到索引缓冲区中。您必须根据相应向量的大小计算所有索引的大小,就像在第一次调用中一样:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, i.size() * sizeof(CBuint), &i[0], GL_STATIC_DRAW);
顶点设置中的偏移也不正确:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(v) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(v) * 5));
v
是一个向量,因此
sizeof(v)
是向量对象的大小,这与此处无关。您需要顶点对象内字段的偏移量:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(CBfloat) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(CBfloat) * 6));

你忘记顶点法线了吗?这不是你当前的问题,但可能是你的下一个问题。顶点法线?你的确切意思是什么?记住我使用的是值(0.0f,0.0f,0.0f)目前。剔除功能已禁用。您能简化此代码吗?删除所有纹理、材质等对您的问题不起作用的内容。至少我希望您不要尝试在有多个材质的情况下使用此代码,因为这看起来不可能工作。通过快速扫描代码,有一个有几个明显的错误,但要在这么多的代码中找到所有可能的问题需要很多时间。如果您通读代码,并删除尚未使用的部分,您可能会自己发现这些错误。我还没有对多种材质进行优化。谢谢,我简化了代码。^非常好!这解决了渲染问题问题!:D非常感谢你,先生!!你知道为什么三角形会相互交叉吗?可能与着色器代码有关。我刚刚发布了上面的屏幕截图,再次感谢!看到了吗?这很奇怪,因为有时法线或/和纹理坐标的数量会因位置(v、vt和vn)的不同而不同在.obj文件中,如何拟合顶点向量列表中的确切数量?请参见如何处理法线和纹理坐标。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(v) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(v) * 5));
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(CBfloat) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(CBfloat) * 6));