Perspectiva correcta de la textura del trapezoide en OpenGL ES 2.0

Dibujé un trapezoide texturizado, sin embargo, el resultado no aparece como pretendía.

En lugar de aparecer como un solo cuadrilátero ininterrumpido, se produce una discontinuidad en la línea diagonal donde se encuentran sus dos triángulos que lo componen.

Esta ilustración demuestra el problema:

(Nota: la última imagen no pretende ser una representación fiel al 100%, pero debe mostrar el punto.)

El trapecio se está dibujando usandoGL_TRIANGLE_STRIP en OpenGL ES 2.0 (en un iPhone). Se está dibujando completamente frente a la pantalla y no se está inclinando (es decir, ¡no es un boceto 3D lo que estás viendo!)

Llegué a comprender que necesito realizar una "corrección de perspectiva", presumiblemente en mi sombreado de vértices y / o fragmentos, pero no tengo claro cómo hacerlo.

Mi código incluye algunas matrices simples de Modelo / Vista / Proyección, pero ninguna de ellas influye actualmente en mis valores de coordenadas de textura.Actualizar: La declaración anterior es incorrecta, según el comentario del usuario de hecho.

Además, he encontrado este dato en la especificación ES 2.0, pero no entiendo lo que significa:

La PUNTA DE CORRECCIÓN DE PERSPECTIVAS no es compatible porqueOpenGL ES 2.0 requiere que todos los atributos sean interpolados en perspectiva.

¿Cómo puedo hacer que la textura se dibuje correctamente?

Editar: Código añadido a continuación:

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

}

Respuestas a la pregunta(3)

Su respuesta a la pregunta