【发布时间】:2011-12-30 02:08:15
【问题描述】:
我正在尝试将 jpg 图像映射到我的目标文件,但我的程序在 glmDraw 函数中崩溃了:
glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL );
正好在这一行:
if (mode & GLM_TEXTURE)
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]);
我不知道为什么,我只知道这与我的纹理有关。它在此行的第一次执行时崩溃,我的意思是 while(group) 循环的第一次迭代。 这就是我的 mtl 文件的样子:
newmtl mymtl
Ns -----
Ni -----
d -----
Tr -----
Tf ----- ----- -----
illum -----
Ka ----- ----- -----
Kd ----- ----- -----
Ks ----- ----- -----
Ke ----- ----- -----
map_Ka image.jpg
map_Kd image.jpg
//**Note: ----- represents a number
如果有人想看的话,这里是 glmDraw 函数的整体:
GLvoid
glmDraw(GLMmodel* model, GLuint mode)
{
static GLuint i;
static GLMgroup* group;
static GLMtriangle* triangle;
static GLMmaterial* material;
assert(model);
assert(model->vertices);
/* do a bit of warning */
if (mode & GLM_FLAT && !model->facetnorms) {
printf("glmDraw() warning: flat render mode requested "
"with no facet normals defined.\n");
mode &= ~GLM_FLAT;
}
if (mode & GLM_SMOOTH && !model->normals) {
printf("glmDraw() warning: smooth render mode requested "
"with no normals defined.\n");
mode &= ~GLM_SMOOTH;
}
if (mode & GLM_TEXTURE && !model->texcoords) {
printf("glmDraw() warning: texture render mode requested "
"with no texture coordinates defined.\n");
mode &= ~GLM_TEXTURE;
}
if (mode & GLM_FLAT && mode & GLM_SMOOTH) {
printf("glmDraw() warning: flat render mode requested "
"and smooth render mode requested (using smooth).\n");
mode &= ~GLM_FLAT;
}
if (mode & GLM_COLOR && !model->materials) {
printf("glmDraw() warning: color render mode requested "
"with no materials defined.\n");
mode &= ~GLM_COLOR;
}
if (mode & GLM_MATERIAL && !model->materials) {
printf("glmDraw() warning: material render mode requested "
"with no materials defined.\n");
mode &= ~GLM_MATERIAL;
}
if (mode & GLM_COLOR && mode & GLM_MATERIAL) {
printf("glmDraw() warning: color and material render mode requested "
"using only material mode.\n");
mode &= ~GLM_COLOR;
}
if (mode & GLM_COLOR)
glEnable(GL_COLOR_MATERIAL);
else if (mode & GLM_MATERIAL)
glDisable(GL_COLOR_MATERIAL);
/* perhaps this loop should be unrolled into material, color, flat,
smooth, etc. loops? since most cpu's have good branch prediction
schemes (and these branches will always go one way), probably
wouldn't gain too much? */
group = model->groups;
while (group) {
if (mode & GLM_MATERIAL) {
material = &model->materials[group->material];
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material->ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material->diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material->specular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, material->shininess);
}
if (mode & GLM_COLOR) {
glColor3fv(material->diffuse);
}
glBegin(GL_TRIANGLES);
for (i = 0; i < group->numtriangles; i++) {
triangle = &T(group->triangles[i]);
if (mode & GLM_FLAT)
glNormal3fv(&model->facetnorms[3 * triangle->findex]);
if (mode & GLM_SMOOTH)
glNormal3fv(&model->normals[3 * triangle->nindices[0]]);
if (mode & GLM_TEXTURE)
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]);
glVertex3fv(&model->vertices[3 * triangle->vindices[0]]);
if (mode & GLM_SMOOTH)
glNormal3fv(&model->normals[3 * triangle->nindices[1]]);
if (mode & GLM_TEXTURE)
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[1]]);
glVertex3fv(&model->vertices[3 * triangle->vindices[1]]);
if (mode & GLM_SMOOTH)
glNormal3fv(&model->normals[3 * triangle->nindices[2]]);
if (mode & GLM_TEXTURE)
glTexCoord2fv(&model->texcoords[2 * triangle->tindices[2]]);
glVertex3fv(&model->vertices[3 * triangle->vindices[2]]);
}
glEnd();
group = group->next;
}
}
当我调试我得到的错误是:
Unhandled exception at 0x695d1789 in programname.exe: 0xC0000005: Access violation reading location 0x75d46ea8.
另外,如果我改变:
glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL );
到:
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL );
它可以工作,但当然,没有我的纹理。
GLM 是否支持这种具有纹理映射的材质?如果我使用 .jpg 文件进行纹理映射可以吗?
如果没有,那你能告诉我怎么做吗?或者 GLM 支持什么类型的图像?或者有没有其他支持图片的加载器?
非常感谢您的帮助。 -W
【问题讨论】:
-
您的模型是否包含纹理坐标?好像没有。
-
@MatiasValdenegro 很好,确实如此。我没有发布我的目标文件,你怎么知道?
-
由于它在纹理坐标上崩溃,因此认为它们不是模型的一部分是明智的,因此指针为 NULL。
-
@MatiasValdenegro 现在我正在检查我的目标文件以确保我拥有它们并且我看到了很多'vt'。我还需要什么,是的,指针是NULL。抱歉,我对此很陌生。