OpenGL-模型显示线框模式但场景也变为线框模型了

一滴水永宏 2014-08-03 11:05:03
OpenGL-模型显示线框模式但场景也变为线框模型了 如何只让模型为线框 场景为面显示
具体代码
void CMFCnewView::RenderScene()
{
glMatrixMode(GL_PROJECTION); // 设置modelview 和 projection
glLoadIdentity(); // 此处尤其不能少glLoadIdentity()
gluPerspective(tFovy, 1, 0.1, 1000); // 注意zNear,zFar的取值
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//隔开
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(tEyeX, tEyeY, tEyeZ, tCenterX, tCenterY, tCenterZ, tUpX, tUpY, tUpZ);
abc.update_camera();
abc.draw_all();

glPushMatrix();
drawmodel_box();
abc.get(210, 360, 26);
glRotatef(ypoz, 0, 1, 0);
glRotatef(zpoz, 0, 0, 1);
glmDraw(pmodel1, GLM_SMOOTH | GLM_TEXTURE, 0);
glPopMatrix();

}

void Draw::draw_all()
{
setLook(camera);//放置摄像机
if (screen == 1)
{
render(terrain_model);// 渲染地形
createSkey(texTure_Sky, 6, 0, 0, 0, 1.0, 0.5, 1.0);// 绘制天空
}
else if (screen == 0)
{
draw_grid(210, 360);//网格
}
else
{
MessageBox(NULL, TEXT("您操作失误,无法实现渲染,可能的原因是在场景的情况下,不能实现点、线渲染!"), TEXT("ERROR"), MB_OK);
}
}

其中selection为0时是面显示 1为线显示 -1为点显示
GLvoid glmDraw(GLMmodel* model, GLuint mode,int selection)
{
glmDraw(model, mode, 0, selection);
}
GLvoid glmDraw(GLMmodel* model, GLuint mode, char *drawonly, int selection)
{
static GLuint i;
static GLMgroup* group;
static GLMtriangle* triangle;
static GLMmaterial* material;
GLuint IDTextura;

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);
if (mode & GLM_TEXTURE) {
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
/* 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? */

IDTextura = -1;
group = model->groups;
while (group)
{
if (drawonly)
if (strcmp(group->name,drawonly))
{
group=group->next;
continue;
}

material = &model->materials[group->material];
if (material)
IDTextura = material->IDTextura;
else IDTextura=-1;

if (mode & GLM_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);*/
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,
model->materials[group->material].ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,
model->materials[group->material].diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,
model->materials[group->material].specular);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS,
model->materials[group->material].shininess);
}

if (mode & GLM_TEXTURE)
{
if (IDTextura == -1)
{
glBindTexture(GL_TEXTURE_2D, 0);
}
else
{
glBindTexture(GL_TEXTURE_2D, model->textures[IDTextura].id);

//贴图更清晰
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

//修复贴图接缝
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
}
}

if (mode & GLM_COLOR) {
glColor3fv(material->diffuse);
}

if (selection == 0)
{
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_MODELVIEW);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLES);
}
if (selection == -1)
{
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_MODELVIEW);
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
glBegin(GL_POINTS);
}
if (selection == 1)
{
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_MODELVIEW);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLES);
}
for (i = 0; i < group->numtriangles; i++) {
triangle = &T(group->triangles[i]);
#ifdef DebugVisibleSurfaces
if (!triangle->visible) continue;
#endif
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)
{
//if (IDTextura==-1) printf("Warning: GLM_TEXTURE este on dar nu este setata nici o textura in material!");
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;
}
}
...全文
271 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧