gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:19:33 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

I'm trying to draw a simple crystal

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

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

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

关于delphi - 如何在 OpenGL 中绘制旋转棱镜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com