OpenGL渲染导致图形故障
代码如下。当程序运行时,它会生成一个大致正确的图像,但存在一些图形故障。以下是一些图片:。你知道是什么导致了这一切吗?最奇怪的是,这个问题似乎是在三角形上形成的,即使图像是用多边形(四边形)绘制的OpenGL渲染导致图形故障,opengl,graphics,3d,sfml,immediate-mode,Opengl,Graphics,3d,Sfml,Immediate Mode,代码如下。当程序运行时,它会生成一个大致正确的图像,但存在一些图形故障。以下是一些图片:。你知道是什么导致了这一切吗?最奇怪的是,这个问题似乎是在三角形上形成的,即使图像是用多边形(四边形)绘制的 编辑:因此,将GL_POLYGONS语句更改为GL_QUADS似乎可以解决问题,但我仍然有点好奇为什么。您的第一个glBegin没有匹配的glEnd,这会导致所有其他glBegin被忽略,直到下一个glEnd。这意味着正面泄漏到背面 也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶
编辑:因此,将GL_POLYGONS语句更改为GL_QUADS似乎可以解决问题,但我仍然有点好奇为什么。您的第一个
glBegin
没有匹配的glEnd
,这会导致所有其他glBegin
被忽略,直到下一个glEnd
。这意味着正面泄漏到背面
也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶点数据。您的第一个
glBegin
没有匹配的glEnd
,这会导致所有其他glBegin
被忽略,直到下一个glEnd
。这意味着正面泄漏到背面
也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶点数据。您的第一个
glBegin
没有匹配的glEnd
,这会导致所有其他glBegin
被忽略,直到下一个glEnd
。这意味着正面泄漏到背面
也就是说,立即模式和相关的显示列表不推荐使用,而是查看VBO来存储顶点数据。您的第一个
glBegin
没有匹配的glEnd
,这会导致所有其他glBegin
被忽略,直到下一个glEnd
。这意味着正面泄漏到背面
也就是说,立即模式和相关的显示列表已被弃用,相反,请查看VBO以存储顶点数据。为什么您的
多色侧面板的glBegin()
没有相应的glEnd()
?这不是可选的。@genpfault它们都有,除了第一个。为什么您的多色侧前的glBegin()
没有相应的glEnd()
?这不是可选的。@genpfault它们都有,除了第一个。为什么您的多色侧前的glBegin()
没有相应的glEnd()
?这不是可选的。@genpfault它们都有,除了第一个。为什么您的多色侧前的glBegin()
没有相应的glEnd()
?这不是可选的。@genpfault他们有,除了第一个。
void buildList() {
cubelist = glGenLists(1);
glNewList(cubelist,GL_COMPILE);
// Multi-colored side - FRONT
glBegin(GL_POLYGON);
glColor3b(0,0,0);
glVertex3f( -0.5, -0.5, -0.5);
glVertex3f( -0.5, 0.5, -0.5);
glVertex3f( 0.5, 0.5, -0.5);
glVertex3f( 0.5, -0.5, -0.5);
// Black side - BACK
glBegin(GL_POLYGON);
glColor3b(0,0,0);
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glEnd();
// Purple side - RIGHT
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 1.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glEnd();
// Green side - LEFT
glBegin(GL_POLYGON);
glColor3f( 0.0, 1.0, 0.0 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
// Blue side - TOP
glBegin(GL_POLYGON);
glColor3f( 0.0, 0.0, 1.0 );
glVertex3f( 0.5, 0.5, 0.5 );
glVertex3f( 0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, -0.5 );
glVertex3f( -0.5, 0.5, 0.5 );
glEnd();
// Red side - BOTTOM
glBegin(GL_POLYGON);
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( 0.5, -0.5, -0.5 );
glVertex3f( 0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, 0.5 );
glVertex3f( -0.5, -0.5, -0.5 );
glEnd();
glEndList();
}
void setupGL() {
glClearColor(1, 1, 1, 0);
glEnable(GL_DEPTH_CLAMP);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glCullFace(GL_FRONT_AND_BACK);
}
int main(int, char const**)
{
sf::Window window(sf::VideoMode(1600, 1200), "OpenGL", sf::Style::Default, sf::ContextSettings(32));
window.setVerticalSyncEnabled(true);
//initWorld();
setupGL();
buildList();
while (running)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Process events
sf::Event event;
handleInput(window);
while (window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed) {
running = false;
}
// Escape pressed: exit
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
running = false;
}
}
glCallList(cubelist);
// Update the window (c is a "Camera" object that just sets the perspective. I can provide code if necessary)
c.draw();
window.display();
}
return EXIT_SUCCESS;
}