Встроенная обрезка полигонов в 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 в форме теста глубины.

Итак, наконец, я получил ответ на это. Требовалось добавить несколько строк кода.

  1. Добавление ниже 3 строк на этапе инициализации

    glClearDepth(1.0f); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);

  2. Инициализация режима отображения для добавления информации о глубине (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;
}
Другие вопросы по тегам