OpenGL, используя GL_STENCIL со сферой - PullRequest
4 голосов
/ 04 декабря 2010

Я работаю с 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, я не был уверенэто просто что-то маленькое или нужно сделать гораздо больше, чтобы обнаружить этот угол отражения.

1 Ответ

2 голосов
/ 05 декабря 2010

Рассматривали ли вы использование отображения отражения / окружающей среды ?

Есть 2 основных формы. Отображение сферической среды обычно работает с заранее рассчитанной картой среды. Однако это можно сделать динамически. Его главный недостаток в том, что он зависит от вида.

Другая система Отображение кубической среды . Cubic очень прост в настройке и включает в себя просто рендеринг вашей сцены 6 раз в 6 различных направлениях (т.е. на каждой грани куба). Кубическое отображение env не зависит от вида.

Существует другая система, которая находится между сферической и кубической. Его называют двойное параболоидное картографирование среды . Недостатком является то, что генерация двойных параболоидов довольно сложна (как сферическая), но (как кубическая) не зависит от вида.

...