Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在OpenGL中绘制旋转棱镜?_Delphi_Opengl - Fatal编程技术网

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

Delphi 如何在OpenGL中绘制旋转棱镜?,delphi,opengl,Delphi,Opengl,我想画一个简单的晶体,它绕着轴旋转。我可以很容易地画出一个金字塔,然后再把它倒过来画,但是我有两个问题 首先,尽管我用相同的颜色画所有的东西,但其中两张脸的颜色和另外两张不同 其次,它在每个金字塔上放置一个“底部”,通过水晶的半透明壁可以看到,这破坏了效果。有办法摆脱它吗 下面是我用来设置和绘制GL场景的代码。当然,OpenGL代码比这多得多,但这是相关的部分 procedure Initialize; begin glShadeModel(GL_SMOOTH); glClearColo

我想画一个简单的晶体,它绕着轴旋转。我可以很容易地画出一个金字塔,然后再把它倒过来画,但是我有两个问题

首先,尽管我用相同的颜色画所有的东西,但其中两张脸的颜色和另外两张不同

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

下面是我用来设置和绘制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;
有人知道我做错了什么以及如何修复吗

我想画一个简单的水晶

停下来。水晶是半透明的,当你开始画半透明的物体时,你基本上可以放弃任何“简单”效果的概念。渲染真实的棱镜(不同波长的光线折射不同)需要某种形式的光线跟踪才能正确。还有许多光线跟踪器甚至无法正确地跟踪,因为它们只跟踪R、G和B波长,而你需要跟踪许多波长来近似棱镜的折射和分光模式

最好的办法就是使用像OpenGL这样的光栅化器——某种程度的伪造


我无法解释这些面是怎么回事,但看穿其他多边形的问题很简单:你没有使用。除非您希望看到透明对象的背面,否则需要确保背面消隐处于活动状态。

我认为您必须定义棱镜上的每个面。执行此操作时,请将面颜色设置为合适的颜色。请参阅本教程,该教程首先绘制二维形状,然后在下一页绘制三维形状。谢谢,成功了。顺便说一句,这是一个很棒的教程系列。谢谢你的链接。我不是想制作一个真实的照片级水晶或者其他东西,只是想把基本的形状和概念弄对。