使用GL_STENCIL和一个球体的OpenGL

4
我正在使用OpenGL,尝试创建一个具有反射表面的球体。我已经实现了反射,但是反射效果不正确。反射中的物体应该根据球面的曲线而弯曲和变形,但我只得到了一条直线的反射。我没有经常使用GL_STENCIL,所以非常需要帮助。我提供了一些代码片段,如球体的创建和绘制方法。如果有人需要更多,请告诉我。
创建:
sphere = gluNewQuadric();
gluQuadricDrawStyle(sphere,  GLU_FILL);
gluQuadricNormals(sphere, GLU_SMOOTH);
gluSphere(sphere, 1, 100, 100);
gluDeleteQuadric(sphere);

绘图:

glClearColor (0.0,0.0,0.0,1);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0, 0, -10);

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); //disable the color mask
glDepthMask(GL_FALSE); //disable the depth mask
glEnable(GL_STENCIL_TEST); //enable the stencil testing
glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); //set the stencil buffer to replace our data

sphereDraw(); //the mirror surface

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); //enable the color mask
glDepthMask(GL_TRUE); //enable the depth mask

glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); //set the stencil buffer to keep our next lot of data

glPushMatrix();
glScalef(1.0f, -1.0f, 1.0f); //flip the reflection vertically
glTranslatef(0,2,-20); //translate the reflection onto the drawing plane
glRotatef(angle,0,1,0); //rotate the reflection
//draw object as our reflection
glPopMatrix();

glDisable(GL_STENCIL_TEST); //disable the stencil testing

glEnable(GL_BLEND); //enable alpha blending
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //set the blending function
sphereDraw(); //draw our bench
glDisable(GL_BLEND); //disable alpha blending

//draw object

因为我刚开始使用GL_STENCIL,所以不确定它只是一些小东西还是需要做更多工作来检测反射角度。


顺便说一句,如果你首先开始使用着色器,你的生活可能会变得更容易。模板反射本质上不会“弯曲”。 - Kos
1个回答

2

你考虑过使用反射/环境贴图吗?

主要有两种形式。 球面环境贴图通常通过预先计算环境贴图来实现,但也可以动态进行。它的主要缺点是视角相关。

另一个系统是立方体环境贴图。 立方体非常容易设置,只需在六个不同方向上渲染您的场景(即在每个立方体面上)。立方体环境贴图是视角无关的。

还有一种系统介于球面和立方体之间,称为双抛物面环境贴图。它的缺点是生成双抛物面相当复杂(像球面),但(像立方体)是视角无关的。


我已经看过立方体映射,但那似乎有点过了。我问这个问题的原因是因为反射和这个<a href="http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=27">NeHe教程</a>,但我宁愿有镜像而不是阴影。谢谢你的评论,如果我更深入地研究它,它将值得探索。 - ars265
@Anthony:立方体环境映射非常容易实现。你遇到的问题是由于你的反射系统只适用于平面。你可以使用上述方法之一...否则你将无法获得准确(或近似)的反射效果。 - Goz
@Anthony:同样的阴影非常容易实现,学习立方体贴图对于全向光源来说非常有用。 - Goz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接