我正试图在我的棋盘地板上添加墙壁,以便它们形成一个立方体,我已经有了底部,但是我很难画出背面或墙壁。
这是我的代码:
class Checkerboard {
int displayListId;
int width;
int depth;
public:
Checkerboard(int width, int depth): width(width), depth(depth) {}
double centerx() {return width / 2;}
double centerz() {return depth / 2;}
void create() {
displayListId = glGenLists(1);
glNewList(displayListId, GL_COMPILE);
GLfloat lightPosition[] = {4, 3, 7, 1};
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glBegin(GL_QUADS);
glNormal3d(0, 1, 0);
for (int x = 0; x < width - 1; x++) {
for (int z = 0; z < depth - 1; z++) {
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
(x + z) % 2 == 0 ? RED : WHITE);
glVertex3d(x, 0, z);
glVertex3d(x+1, 0, z);
glVertex3d(x+1, 0, z+1);
glVertex3d(x, 0, z+1);
}
}
glEnd();
glEndList();
}
void draw() {
glCallList(displayListId);
}
}
我正在尝试添加以下代码:
glColor3f(1.0f,1.0f,0.0f); // Color Yellow
glVertex3d( 1.0f,-1.0f,-1.0f); // Top Right Of The Quad (Back)
glVertex3d(-1.0f,-1.0f,-1.0f); // Top Left Of The Quad (Back)
glVertex3d(-1.0f, 1.0f,-1.0f); // Bottom Left Of The Quad (Back)
glVertex3d( 1.0f, 1.0f,-1.0f); // Bottom Right Of The Quad (Back)
有人可以指出我做错了吗?
答案 0 :(得分:1)
也许你正在有效地画出你想要添加的脸,但由于背面剔除你无法看到它。在绘制四边形之前尝试glDisable(GL_CULL_FACE);
,或尝试更改顶点的顺序。
注意:如果禁用背面剔除,请将其视为调试程序的临时解决方法。背面剔除是一项重要的优化,应该在大多数情况下启用。
答案 1 :(得分:0)
将代码更改为:
glColor3f(1.0f,1.0f,0.0f); // Color Yellow
glVertex3d( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Back)
glVertex3d( -1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Back)
glVertex3d( -1.0f, -1.0f,-1.0f); // Bottom Left Of The Quad (Back)
glVertex3d( 1.0f, -1.0f,-1.0f); // Bottom Right Of The Quad (Back)
注意你的评论是在正确的上弦顺序(CCW),但你的顶点不是(它们是时钟明智的)。默认情况下,OpenGL会剔除它们(不显示它们),因为如果启用了剔除,它会认为它们是背面。