Перспективное правильное текстурирование трапеции в OpenGL ES 2.0

Я нарисовал текстурированную трапецию, но результат получился не таким, как я планировал.

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

Эта иллюстрация демонстрирует проблему:

(Примечание: последнее изображение не предназначено для 100% точного представления, но оно должно понять суть.)

Трапеция рисуется с использованиемGL_TRIANGLE_STRIP в OpenGL ES 2.0 (на iPhone). Он рисуется полностью лицом к экрану и не наклоняется (т.е. это не трехмерный эскиз, который вы видите!)

Я понял, что мне нужно выполнить «коррекцию перспективы», вероятно, в моих вершинных и / или фрагментных шейдерах, но мне неясно, как это сделать.

Мой код включает в себя несколько простых математических матриц Модель / Вид / Проекция, но в настоящее время ни один из них не влияет на мои значения координат текстуры.Обновить: Предыдущее утверждение неверно, согласно комментарию пользователя Infact.

Кроме того, я нашел этот кусок в спецификации ES 2.0, но не понимаю, что это значит:

ПЕРСПЕКТИВНАЯ КОРРЕКЦИЯ СОВЕТ не поддерживается, потому чтоOpenGL ES 2.0 требует, чтобы все атрибуты были интерполированы в перспективе.

Как я могу заставить текстуру правильно рисовать?

Редактировать: Добавлен код ниже:

// Vertex shader
attribute vec4 position;
attribute vec2 textureCoordinate;

varying vec2 texCoord;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    texCoord = textureCoordinate;
}
// Fragment shader
uniform sampler2D texture;
varying mediump vec2 texCoord;

void main()
{
    gl_FragColor = texture2D(texture, texCoord);
}
// Update and Drawing code (uses GLKit helpers from iOS)

- (void)update
{
    float fov = GLKMathDegreesToRadians(65.0f);
    float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
    projectionMatrix = GLKMatrix4MakePerspective(fov, aspect, 0.1f, 50.0f);
    viewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); // zoom out
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(shaders[SHADER_DEFAULT]);

    GLKMatrix4 modelMatrix = GLKMatrix4MakeScale(0.795, 0.795, 0.795); // arbitrary scale

    GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(viewMatrix, modelMatrix);

    GLKMatrix4 modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);
    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, GL_FALSE, modelViewProjectionMatrix.m);

    glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_WALLS]);
    glUniform1i(uniforms[UNIFORM_TEXTURE], 0);

    glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, wall.vertexArray);
    glVertexAttribPointer(ATTRIB_TEXTURE_COORDINATE, 2, GL_FLOAT, GL_FALSE, 0, wall.texCoords);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, wall.vertexCount);

}

Ответы на вопрос(3)

Ваш ответ на вопрос