OpenGl Разница в результатах в Xcode и visual studio - PullRequest
1 голос
/ 14 июня 2019

Я написал простой код OpenGL, и он работал нормально в Visual Studio. Но когда это было перемещено в Xcode. это был успех компиляции, но результаты были другими. Там нет ничего.

Я только изменил OpenGL, GLUT заголовочный файл.

Я подозреваю, что диапазон gluPerspective отличается в XCode, но я не знаю точную причину.

Как это работает?

Вот мой код в xcode

#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/glu.h>
#include <math.h>
#include <stdio.h>

double RotAngle = 0.0;  
void OctPyramid(void)
{
    int N = 8;
    double angle = 2 * 3.1415 / N;
    int i;
    glBegin(GL_LINE_LOOP);
    for (i = 0; i < N; i++)
        glVertex3f(cos(i * angle), -1.0, sin(i * angle));
    glEnd();
    glBegin(GL_LINES);
    for (i = 0; i < N; i++)
    {
        glVertex3f(0.0, 1.0, 0.0);
        glVertex3f(cos(i * angle), -1.0, sin(i * angle));
    }
    glEnd();
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0, 0.0, -6.0);
    glRotatef(RotAngle, 0, 1, 0);
    glTranslatef(2.0, 0.0, 0.0);

    OctPyramid();

    glFlush();
}


void IncAngle(void)
{
    RotAngle = RotAngle + 0.08;
    if (RotAngle > 360.0)
        RotAngle = RotAngle - 360.0;
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitWindowPosition(0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGBA);
    glutCreateWindow("main");
    glClearColor(0.0, 0.0, 0.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1.0, 0.0, 10.0);


    glutDisplayFunc(display);

    glutIdleFunc(IncAngle);
    glutMainLoop();
}

1 Ответ

3 голосов
/ 14 июня 2019

Расстояние до ближней плоскости zNear и расстояние до дальней плоскости zFar должны быть больше 0:

Набор zNear больше 0.0 :

gluPerspective(45, 1.0, 0.0, 10.0);
gluPerspective(45, 1.0, 0.1, 10.0);

Примечание. gluPerspective устанавливает матрицу проекции следующим образом:

ta = tan(fovy / 2)
a  = aspect
n  = zNear
f  = zFar

x:    1/(ta*a)  0     0              0
y:    0         1/ta  0              0
z:    0         0    -(f+n)/(f-n)   -1
t:    0         0    -2*f*n/(f-n)    0

Если zNear = 0, то это приводит к:

x:    1/(ta*a)  0     0    0
y:    0         1/ta  0    0
z:    0         0    -1   -1
t:    0         0     0    0

Если Однородные координаты преобразованы такой матрицей, то компонент z результата всегда будет равен компоненту w.
После Перспективного деления компонент z нормализованной координаты устройства равен 1, независимо от координаты.
Это означает, что все координаты вершины геометрии «проецируются» на одну и ту же глубину, максимальная глубина всей геометрии равна 1,0.
Из-за этого zNear должно быть больше 0,0, иначе поведение не указано и зависит от внутренней реализации библиотеки.

...