Perspectiva texturização correta de trapézio no OpenGL ES 2.0

Eu desenhei um trapézio texturizado, mas o resultado não aparece como eu pretendia.

Em vez de aparecer como um único quadrilátero contínuo, ocorre uma descontinuidade na linha diagonal onde seus dois triângulos formados se encontram.

Esta ilustração demonstra o problema:

(Nota: a última imagem não tem a intenção de ser uma representação 100% fiel, mas deve mostrar o ponto.)

O trapézio está sendo desenhado usandoGL_TRIANGLE_STRIP no OpenGL ES 2.0 (em um iPhone). Ele está sendo desenhado completamente de frente para a tela e não está sendo inclinado (isto é, não é um esboço 3D que você está vendo!)

Cheguei a entender que preciso executar "correção de perspectiva", presumivelmente em meus shaders de vértice e / ou fragmento, mas não estou claro como fazer isso.

Meu código inclui alguma matemática matricial simples de Model / View / Projection, mas nenhuma delas influencia atualmente meus valores de coordenadas de textura.Atualizar: A declaração anterior está incorreta, de acordo com o comentário do usuário.

Além disso, encontrei este detalhe na especificação do ES 2.0, mas não entendo o que isso significa:

A DICA DE CORREÇÃO PERSPECTIVA não é suportada porqueO OpenGL ES 2.0 requer que todos os atributos sejam interpolados de forma prospectiva.

Como posso fazer a textura desenhar corretamente?

Editar: Adicionado código abaixo:

// 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);

}

questionAnswers(3)

yourAnswerToTheQuestion