Stencil буфер
Всем привет.
Сталкнулся с такой траблой: не хочет работать stencil. Вроде все правильно делаю.
Инициализация
private void InitGL()
{
float[] pos = { 3, 3, 3, 1 };
float[] dir = { -1, -1, -1 };
float[] mat_specular = { 1, 1, 1, 1 };
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, pos);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPOT_DIRECTION, dir);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, mat_specular);
Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 128.0f);
Glut.glutInit();
ResizeGL();
}
private void ResizeGL()
{
Gl.glViewport(0, 0, OGLC.Width, OGLC.Height);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glOrtho(-5, 5, -5, 5, 2, 12);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
}
private void Display()
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_STENCIL_BUFFER_BIT);
Gl.glLoadIdentity();
Glu.gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
// вращаем сцену
Gl.glRotated(45, 1, 0, 0);
Gl.glRotated(45, 0, 1, 0);
Gl.glRotated(45, 0, 0, 1);
// разрешаем тест трафарета
Gl.glEnable(Gl.GL_STENCIL_TEST);
// рисуем куб и заполняем буффер трафарета единицами
// в том месте, где рисуется куб
Gl.glStencilFunc(Gl.GL_ALWAYS, 1, 0);
Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_REPLACE);
Glut.glutSolidCube(2.5);
// заполняем буффер трафарета двойками
// в том месте, где сфера закрывает куб
Gl.glStencilFunc(Gl.GL_ALWAYS, 2, 0);
Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_REPLACE);
Glut.glutSolidSphere(1.5, 20, 20);
// очищаем буфферы цвета и глубины
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glStencilFunc(Gl.GL_EQUAL, 2, 255);
Gl.glColor3d(1, 1, 1);
Glut.glutSolidCube(2.5);
OGLC.Invalidate();
}
OGLC - сам элемент
Сталкнулся с такой траблой: не хочет работать stencil. Вроде все правильно делаю.
Инициализация
private void InitGL()
{
float[] pos = { 3, 3, 3, 1 };
float[] dir = { -1, -1, -1 };
float[] mat_specular = { 1, 1, 1, 1 };
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, pos);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPOT_DIRECTION, dir);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, mat_specular);
Gl.glMaterialf(Gl.GL_FRONT, Gl.GL_SHININESS, 128.0f);
Glut.glutInit();
ResizeGL();
}
private void ResizeGL()
{
Gl.glViewport(0, 0, OGLC.Width, OGLC.Height);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glOrtho(-5, 5, -5, 5, 2, 12);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
}
private void Display()
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_STENCIL_BUFFER_BIT);
Gl.glLoadIdentity();
Glu.gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
// вращаем сцену
Gl.glRotated(45, 1, 0, 0);
Gl.glRotated(45, 0, 1, 0);
Gl.glRotated(45, 0, 0, 1);
// разрешаем тест трафарета
Gl.glEnable(Gl.GL_STENCIL_TEST);
// рисуем куб и заполняем буффер трафарета единицами
// в том месте, где рисуется куб
Gl.glStencilFunc(Gl.GL_ALWAYS, 1, 0);
Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_REPLACE);
Glut.glutSolidCube(2.5);
// заполняем буффер трафарета двойками
// в том месте, где сфера закрывает куб
Gl.glStencilFunc(Gl.GL_ALWAYS, 2, 0);
Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_REPLACE);
Glut.glutSolidSphere(1.5, 20, 20);
// очищаем буфферы цвета и глубины
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glStencilFunc(Gl.GL_EQUAL, 2, 255);
Gl.glColor3d(1, 1, 1);
Glut.glutSolidCube(2.5);
OGLC.Invalidate();
}
OGLC - сам элемент
09.07.2011 00:00:00
Скинь весь проект на файлообменик и кинь сюда ссылку, а то с c# давно не работаю в падлу проект создавать.
15.09.2011 00:00:00
Дело скорее всего не в коде, а в компоненте simpleOpenGlControl. Нужно в настройках инструмента (категория OpenGL Properties) Stencil Bits переправить с 0 на 8 бит.