Как текстурировать случайный выпуклый четырехугольник в openGL

Хорошо, поэтому я начал искать учебные пособия по openGL ради создания мода для майнкрафта. Я до сих пор не слишком много знаю об этом, потому что решил, что мне действительно не нужно этого делать, когда дело доходит до внесения небольших изменений, которые я хочу, но это вызывает у меня такую ​​головную боль. Все, что я хочу сделать, это иметь возможность правильно сопоставить текстуру с неправильным вогнутым четырехугольником.

Нравится:

введите описание изображения здесь

Я вошел в openGL, чтобы понять, как это сделать, прежде чем попытаться запустить код в игре. Я читал, что мне нужно выполнить преобразование с правильной перспективой, и я заставил его работать для трапеций, но, хоть убей, я не могу понять, как это сделать, если обе пары кромок не работают. параллельно. Я посмотрел на это: http://www.imagemagick.org/Usage/scripts/perspective_transform, но я понятия не имею, откуда взялись «8 констант», о которых говорит этот парень, и поможет ли мне это вообще. Мне также сказали выполнить вычисления с матрицами, но я понятия не имел, сколько из этого openGL заботится или не заботится.

Я просмотрел несколько сообщений по этому поводу, и ответ, который мне нужен, есть где-то в них, но я не могу понять их. Я никогда не могу найти сообщение, в котором рассказывается, какие аргументы я должен использовать в методе glTexCoord4f (), чтобы получить преобразование с правильной перспективой.

Если вы думаете о странице «Знакомство с координатой Q» как о решении моей проблемы, боюсь, я уже смотрел на нее, и она меня подвела.

Что-то мне не хватает? Я чувствую, что это должно быть намного проще. Мне трудно поверить, что openGL со всеми его прибамбасами не сможет создать ничего, кроме прямоугольника.

Итак, я надеюсь, что не слишком рассердил вас своей невежественностью, и заранее спасибо.

РЕДАКТИРОВАТЬ: Я думаю, мне нужно прояснить, что я знаю, что openGL выполняет преобразование перспективы для вас, когда ваше представление о квадроцикле не ортогонально. Я бы знал, что нужно просто изменить координаты z или мой угол обзора. Я хочу плавно текстурировать непрямоугольный четырехугольник, а не помещать прямоугольную форму в определенное поле зрения.


person Ben Denison    schedule 03.08.2014    source источник
comment
Вот дерьмо. Забыл упомянуть, что это майнкрафт, так что это на Java, и у меня тоже есть LWJGL.   -  person Ben Denison    schedule 04.08.2014
comment
›Мне трудно поверить, что openGL со всеми его прибамбасами не сможет создать ничего, кроме прямоугольника. Поверь в это. В нем нет ничего, кроме треугольников. :)   -  person jheriko    schedule 07.04.2015


Ответы (2)


OpenGL выполнит для вас правильное преобразование перспективы. Я считаю, что вы просто столкнулись с проблемой интерполяции квадратов против треугольников. Разница между аффинным преобразованием и преобразованием с правильной перспективой связано с тем, что геометрия находится в 3D, где интерполяция в пространстве изображения является нелинейной. Подумайте о том, чтобы посмотреть на дорогу: равномерно расположенные линии чаще появляются на расстоянии. Во всяком случае, вернемся к треугольникам и квадроциклам ...

введите описание изображения здесь

Вот несколько связанных сообщений:

person jozxyqk    schedule 04.08.2014
comment
Барицентрическая интерполяция. Хорошо, я разберусь. Спасибо чувак. Думаю, я видел это раньше, но я не видел, что у него была такая же проблема, как и у меня. Я увидел слово «шейдеры» и подумал: «Совершенно другая головоломка». У меня есть несколько терминов, которые нужно найти ... не трудитесь объяснять мне это, я уверен, что это несложно, и я выясню в свое время. - person Ben Denison; 04.08.2014
comment
Я смотрел на этот непростой ответ и как бы слежу за ним, но я понятия не имею, что такое out, layout и in. Я предполагаю, что это следствие того, что это не java, но, как я уже сказал, я неопытен. - person Ben Denison; 05.08.2014
comment
@BenDenison Они введены в OpenGL 3 (я думаю), но это все еще возможно с ‹3. _1 _ / _ 2_ - это новый способ написания varying. layout используется здесь для указания места привязки массивов (возможно, важно для памяти localty, но одна из причин - здесь) и принудительно значение, которое вы иначе получили бы с glGetAttribLocation. Вместо этого вы можете использовать glBindAttribLocation перед связыванием. - person jozxyqk; 05.08.2014

Первое, что вам следует знать, это то, что ничто не дается легко с OpenGL. Это очень сложный конечный автомат с множеством причуд и плохим интерфейсом для разработчиков.

Тем не менее, я думаю, вы путаете много разных вещей. Чтобы нарисовать текстурированный прямоугольник с коррекцией перспективы, вы просто рисуете текстурированный прямоугольник в трехмерном пространстве после соответствующей настройки матрицы проекции.

Во-первых, вам нужно настроить желаемую проекцию. По вашему описанию вам нужно создать перспективную проекцию. В OpenGL у вас обычно есть две основные матрицы, которые вас интересуют - проекция и модель-вид. Матрица проекции - это что-то вроде вашей «камеры».

То, как вы это делаете, зависит от того, используете ли вы Legacy OpenGL (ниже версии 3.0) или Core Profile (современный, 3.0 или выше) OpenGL. На этой странице описаны 2 способа сделать это в зависимости от на котором вы используете.

void BuildPerspProjMat(float *m, float fov, float aspect, float znear, float zfar)
{
    float xymax = znear * tan(fov * PI_OVER_360);
    float ymin = -xymax;
    float xmin = -xymax;

    float width = xymax - xmin;
    float height = xymax - ymin;

    float depth = zfar - znear;
    float q = -(zfar + znear) / depth;
    float qn = -2 * (zfar * znear) / depth;

    float w = 2 * znear / width;
    w = w / aspect;
    float h = 2 * znear / height;

    m[0]  = w;
    m[1]  = 0;
    m[2]  = 0;
    m[3]  = 0;

    m[4]  = 0;
    m[5]  = h;
    m[6]  = 0;
    m[7]  = 0;

    m[8]  = 0;
    m[9]  = 0;
    m[10] = q;
    m[11] = -1;

    m[12] = 0;
    m[13] = 0;
    m[14] = qn;
    m[15] = 0;
}

и вот как использовать его в коде OpenGL 1 / OpenGL 2:

float m[16] = {0};
float fov=60.0f; // in degrees
float aspect=1.3333f;
float znear=1.0f;
float zfar=1000.0f;
BuildPerspProjMat(m, fov, aspect, znear, zfar);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(m);

// okay we can switch back to modelview mode
// for all other matrices
glMatrixMode(GL_MODELVIEW);

С реальным кодом OpenGL 3.0 мы должны использовать шейдеры GLSL и универсальные переменные для передачи и использования матриц преобразования:

float m[16] = {0};
float fov=60.0f; // in degrees
float aspect=1.3333f;
float znear=1.0f;
float zfar=1000.0f;
BuildPerspProjMat(m, fov, aspect, znear, zfar);
glUseProgram(shaderId);
glUniformMatrix4fv("projMat", 1, GL_FALSE, m);
RenderObject();
glUseProgram(0);

Поскольку я не использовал Minecraft, я не знаю, дает ли он вам матрицу проекции для использования или у вас есть другая информация для ее построения.

person user1118321    schedule 04.08.2014