【问题标题】:How do I draw a rotating prism in OpenGL?如何在 OpenGL 中绘制旋转棱镜?
【发布时间】:2011-09-25 20:46:08
【问题描述】:

我正在尝试绘制一个绕其轴旋转的简单晶体。我可以很容易地通过绘制一个金字塔然后再将它倒置来绘制正确的形状,但是我有两个问题。

首先,即使我用相同的颜色绘制所有内容,但其中两张脸的颜色与另外两张不同。

其次,它会在每个金字塔上放置一个“底部”,通过水晶的半透明壁可见,这会破坏效果。有什么办法可以摆脱吗?

这是我用来设置和绘制 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;

有人知道我做错了什么以及如何解决吗?

【问题讨论】:

标签: delphi opengl


【解决方案1】:

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

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

您将获得的最好的结果是在像 OpenGL 这样的光栅化器上进行某种程度的伪造。

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

【讨论】:

  • 谢谢,成功了。这是一个很棒的教程系列,顺便说一句。感谢您的链接。我不是要制作一个实际逼真的水晶或任何东西,只要把基本的形状和概念弄对就行了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多