球体で GL_STENCIL を使用する OpenGL
-
08-10-2019 - |
質問
私は 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 を使うのが初めてだったので、それが単なる小さなことなのか、それともその反射角を検出するためにもっと多くのことを行う必要があるのかわかりませんでした。
解決
使用を検討しましたか 反射/環境マッピング?
主に 2 つの形式があります。 球状環境マッピング 通常、事前に計算された環境マップを使用することで機能します。ただし、動的に実行することもできます。その主な欠点は、ビューに依存することです。
もう一つのシステムは、 立方体環境マッピング. 。Cubic はセットアップが非常に簡単で、シーンを 6 つの異なる方向 (つまり、立方体の各面) に 6 回レンダリングするだけです。キュービック環境マッピングはビューに依存しません。
球面と立方体の間に位置する別の系があります。それは呼ばれています 二重放物面環境マッピング. 。二重放物面の生成は (球面のように) 非常に複雑ですが、(立方体のように) ビューに依存しないという欠点があります。
所属していません StackOverflow