Встроенная обрезка полигонов в OpenGL
Может ли кто-нибудь помочь мне понять, почему приведенный ниже код показывает треугольник перед Quad? За gluLookAt(10, 10, 60, 0, 0, 0, 0, 1, 0)
а такжеglOrtho(-30, 30, -30, 30, 0, 90)
?
Ожидаемый результат: поскольку значение "z" треугольника меньше, чем квад, а наблюдатель находится на 60 единиц по оси +ive "z". Таким образом, прямоугольник должен был быть виден как единое целое, и были бы видны только несколько его частей.
glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glVertex3f(10, 10, 15); glVertex3f(20, 10, 15); glVertex3f(20, 20, 15); glVertex3f(10, 20, 15);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(0, 1, 0);
glVertex3f(0, 0, 0);
glVertex3f(22, 14, 0);
glVertex3f(16, 22, 0);
glEnd();
2 ответа
Прежде всего, ваш вопрос совершенно не связан с отсечением - отсечение означает вычисление пересечения примитивов относительно некоторой области клипа или объема клипа.
Треугольник появляется, потому что вы рисуете его после четырехугольника. По умолчанию OpenGL не будет применять какие-либо алгоритмы видимости. Тем не менее, OpenGL поддерживает алгоритм буфера Z в форме теста глубины.
Итак, наконец, я получил ответ на это. Требовалось добавить несколько строк кода.
Добавление ниже 3 строк на этапе инициализации
glClearDepth(1.0f); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);
Инициализация режима отображения для добавления информации о глубине (GLUT_DEPTH), как показано ниже
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
Ниже приведен полный код для отображения прямоугольника, за которым расположен трейлинг.
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>
using namespace std;
void FPS(void);
GLint gFramesPerSecond = 0;
int TIMER_SPEED = 10000;
float i = 40;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(10, 10, i-=.2, 10, 10, -10, 0, 1, 0);
glBegin(GL_LINES);
glColor3f(1, 0, 0);
glVertex3f(0, 0, 0); glVertex3f(20, 0, 0);
glColor3f(0, 1, 0);
glVertex3f(0, 0, 0); glVertex3f(0, 20, 0);
glColor3f(0, 0, 1);
glVertex3f(0, 0, 0); glVertex3f(0, 0, 50);
glEnd();
glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glVertex3f(10, 10, 10); glVertex3f(20, 10, 15); glVertex3f(20, 20, 15); glVertex3f(10, 20, 15);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(0, 1, 0);
glVertex3f(12, 12, 20);
glVertex3f(22, 14, 12);
glVertex3f(16, 22, 12);
glEnd();
glutSwapBuffers();
}
void timer(int v)
{
static GLfloat u = 0.0;
u += 0.01;
glutTimerFunc(TIMER_SPEED/60.0, timer, ++v);
display();
}
void Init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0f);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void Resize(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-15, 30, -15, 30, 15, 40);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(200, 200);
glutCreateWindow("3D Object in OpenGL");
glutKeyboardFunc(myKeyboard);
Init();
glutDisplayFunc(display);
glutReshapeFunc(Resize);
glutTimerFunc(100, timer, 0);
glutMainLoop();
return 0;
}