如何在OpenGL中绘制旋转棱镜?

时间:2011-09-25 20:46:08

标签: delphi 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;

任何人都知道我做错了什么以及如何解决它?

1 个答案:

答案 0 :(得分:6)

  

我正在尝试绘制一个简单的水晶

停止。水晶是半透明的,当你开始绘制半透明物体的那一刻,你基本上可以放弃任何“简单”效果的概念。渲染真正的棱镜(以不同的方式折射不同波长的光)是需要对某种形式进行光线追踪才能正确的。并且有许多光线跟踪器甚至无法正确,因为它们只跟踪R,G和B波长,而您需要跟踪许多波长以近似折射和光分裂模式棱镜。

你要获得的最好的就是像OpenGL这样的光栅化器。某种程度的伪造。

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