2011-09-25 39 views
2

我想绘制一个简单的水晶,它的轴上旋转。我可以通过绘制一个金字塔然后再次绘制它来轻松地获得该形状,但是我遇到了两个问题。如何在OpenGL中绘制旋转棱镜?

首先,即使我画出所有颜色相同的颜色,其中两个面的颜色与其他颜色不同。第二,它在每个金字塔上放置一个“底部”,通过晶体的半透明墙壁可以看到,这会破坏效果。有什么办法摆脱它吗?

下面是我用来设置和绘制GL场景的代码。当然,还有更多的OpenGL代码,但这是相关的部分。

procedure Initialize; 
begin 
    glShadeModel(GL_SMOOTH); 
    glClearColor(0.0, 0.0, 0.0, 0.5); 
    glClearDepth(1.0); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 
end; 

procedure Draw; //gets called in a loop 
begin 
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(-1.5,-0.5,-6.0); 
    glRotatef(rotation,0.0,1.0,0.0); 
    glBegin(GL_TRIANGLE_FAN); 
    glColor4f(0, 0, 1, 0.2); 
    glVertex3f(0, 3.4, 0); 
    glVertex3f(-1, 0, -1); 
    glVertex3f(-1, 0, 1); 
    glVertex3f(1, 0, 1); 
    glVertex3f(1, 0, -1); 
    glVertex3f(-1, 0, -1); 
    glEnd; 
    glBegin(GL_TRIANGLE_FAN); 
    glVertex3f(0, -3.4, 0); 
    glVertex3f(-1, 0, -1); 
    glVertex3f(-1, 0, 1); 
    glVertex3f(1, 0, 1); 
    glVertex3f(1, 0, -1); 
    glVertex3f(-1, 0, -1); 
    glEnd; 
    rotation := rotation + 0.02; 
end; 

任何人都知道我在做什么错,如何解决它?

+0

我认为你必须定义棱镜上的每个面。这样做时,将面的颜色设置为适当的。请参阅本教程,该教程首先绘制2D形状,然后在下一页绘制3D形状。 http://www.euclideanspace.com/software/games/setup/openglcpp/shapes/index.htm –

回答

6

我想画一个简单的水晶

停止。晶体是半透明的,当你开始绘制半透明物体的时候,你基本上可以放弃任何“简单”效应的概念。渲染一个真正的棱镜(不同波长折射不同波长的光)是需要某种形式的光线追踪才能正确的。还有许多光线追踪器甚至无法正确识别,因为它们仅追踪R,G和B波长,而您需要追踪许多波长以近似棱镜的折射和光分裂图案。

你会得到最好的是像OpenGL光栅器的某种程度的fakery。

我无法解释脸部正在发生什么,但看到其他多边形的问题很简单:您没有使用backface culling。除非您想查看透明对象的背面,否则您需要确保背面剔除处于活动状态。

+0

谢谢,这工作。这是一个很棒的教程系列,BTW。感谢您的链接。我并没有试图制作出真实的真实感水晶或其他任何东西,只是基本的形状和概念是正确的。 –