Aar*_*ron 3 c++ opengl sdl culling
我正在尝试创建一个简单的单元着色器效果,它涉及背面和正面剔除。但到目前为止,我的剔除结果相当奇怪。
设置OpenGL源代码:
// init matrices
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 800 / 600, 0.01f, 150);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// enable opengl caps
glEnable(GL_NORMALIZE);
glEnable(GL_CULL_FACE);
// cell shading effects
glLineWidth(3.5f);
// setup display list
pDList = glGenLists(1);
glNewList(pDList, GL_COMPILE);
glBegin(GL_QUADS);
// front
glNormal3f(0, 0, 1);
glVertex3f(-0.25f, -0.5f, -3);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(0.25f, -1, -3);
glVertex3f(-0.25f, -1, -3);
// back
glNormal3f(0, 0, -1);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(-0.25f, -1, -3.5f);
// top
glNormal3f(0, 1, 0);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(-0.25f, -0.5f, -3);
// bottom
glNormal3f(0, -1, 0);
glVertex3f(-0.25f, -1, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(0.25f, -1, -3);
glVertex3f(-0.25f, -1, -3);
// right
glNormal3f(1, 0, 0);
glVertex3f(0.25f, -0.5f, -3);
glVertex3f(0.25f, -0.5f, -3.5f);
glVertex3f(0.25f, -1, -3.5f);
glVertex3f(0.25f, -1, -3);
// left
glNormal3f(-1, 0, 0);
glVertex3f(-0.25f, -0.5f, -3);
glVertex3f(-0.25f, -0.5f, -3.5f);
glVertex3f(-0.25f, -1, -3.5f);
glVertex3f(-0.25f, -1, -3);
glEnd();
glEndList();
Run Code Online (Sandbox Code Playgroud)
渲染源代码:
// clear
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.75f, 0.75f, 0.75f, 1);
// reset matrix
glLoadIdentity();
// draw cube
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glCullFace(GL_BACK);
glColor3i(0, 0, 0);
glCallList(pDList);
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
由于某种原因,它只绘制立方体的右侧。诡异的。我改变了 glCullFace(GL_BACK); 到 glCullFace(GL_FRONT); 在我的渲染函数中。我懂了:
现在它正在绘制每一面?似乎认为立方体的右侧既朝后又朝前,而立方体的其余部分朝后。当我禁用剔除功能时,我也会得到与上图所示相同的结果。
我能想到的任何其他相关信息是我正在使用 SDL,并且我确信这不是显卡问题,因为我在两台不同的计算机上运行了它,每台计算机都产生相同的结果。
我刚刚开始学习如何为基元设置法线,所以这很可能是一个大错误,或者是一些愚蠢的错误。如果每次我犯下最不经意的明显错误并且坚持了几个小时都能得到一分钱,我就会成为百万富翁。
那么,简而言之,我做错了什么,以及如何以正确的方式获得正确的侧面来剔除或不剔除?
如果您从其负法线向量查看每个三角形,您可以定义指定顶点的顺序(称为winding
):顺时针或逆时针。
您必须与其保持一致,并指定任一CW
或CCW
缠绕中的所有顶点,以使剔除正确工作。
归档时间: |
|
查看次数: |
1538 次 |
最近记录: |