如何实现opengl中的遮挡

wayne7773 2017-03-12 11:17:18
两个六面体紧靠在一起,但是近处的六面体没办法挡住后面的六面体,背面消除已经开启glCullFace,以下四个函数也用了。glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);有关绘图的代码如下:

void polygon(GLfloat *a, GLfloat *b, GLfloat *c, GLfloat *d)
{
glBegin(GL_POLYGON);
glVertex3fv(a);
glVertex3fv(b);
glVertex3fv(c);
glVertex3fv(d);
glEnd();
}

void cube(struct Data_Link d_p)
{
double *pNodxy = d_p.pNodxy;
int *pEle=d_p.pEle;
int Ne = d_p.Ne;int Nn = d_p.Nn;
int i,j,k=0;

GLfloat (*pN)[3] = (GLfloat(*)[3])malloc(3 * Nn * sizeof(GLfloat));//将节点坐标导入二维数组
GLint(*pE)[8] = (GLint(*)[8])malloc( 8 * Ne * sizeof(GLint));

for (i = 0;i < Nn;i++)
{
for (j = 0;j < 3;j++)
{
pN[i][j] =pNodxy[k];
k++;
}
}
k = 0;
for (i = 0;i < Ne;i++)
{
for (j = 0;j < 8;j++)
{
if (k % 9 != 0)
{
pE[i][j] = pEle[k];printf("%d\t", pEle[k]);
k++;
}
else
{
k++;
j--;
}
}
}
for(i=0;i<2;i++)//Ne
{
polygon(pN[pE[i][0]], pN[pE[i][3]], pN[pE[i][2]], pN[pE[i][1]]);
polygon(pN[pE[i][2]], pN[pE[i][3]], pN[pE[i][7]], pN[pE[i][6]]);
polygon(pN[pE[i][3]], pN[pE[i][0]], pN[pE[i][4]], pN[pE[i][7]]);
polygon(pN[pE[i][1]], pN[pE[i][2]], pN[pE[i][6]], pN[pE[i][5]]);
polygon(pN[pE[i][4]], pN[pE[i][5]], pN[pE[i][6]], pN[pE[i][7]]);
polygon(pN[pE[i][5]], pN[pE[i][4]], pN[pE[i][0]], pN[pE[i][1]]);
}
}


void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glClearDepth(1.0F);
//glDepthFunc(GL_LESS);
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1, 1, 1, 0, 0, 0, 0, 1, 0);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
cube(m_data_link);
glutSwapBuffers();
}

void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-4, 4, -4, 4, -4, 4);
}

void init()
{
glClearColor(1, 1, 1, 1);

glColor3f(1, 0, 0);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}


int main(int argc, char**argv)
{

struct Data_Link_KgFg m_KF;
//FEM_Link_Read("FEM_TEST.txt", &m_data_link);
//FEM_Link_Print(m_data_link);
//getchar();
//FEM_Link_KgYH(m_data_link,&m_KF);

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("FEM_TEST");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
init();
glutMainLoop();
}

效果如图
...全文
300 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

456

社区成员

发帖
与我相关
我的任务
社区描述
其它游戏引擎
社区管理员
  • 其它游戏引擎社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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