Я нарисовал текстурированную трапецию, однако результат не появляется так, как я предполагал.
Вместо того, чтобы появляться в виде единого непрерывного четырехугольника, разрыв происходит на диагональной линии, где встречаются два ее треугольника.
Эта иллюстрация демонстрирует проблему:
(Примечание: последнее изображение не должно быть 100% -ным верным представлением, но оно должно получить точку.)
Трапеция рисуется с помощью GL_TRIANGLE_STRIP
в OpenGL ES 2.0 (на iPhone). Он полностью обращается к экрану и не наклонен (т.е. Это не 3D-эскиз, который вы видите!)
Я понял, что мне нужно выполнить "коррекцию перспективы", по-видимому, в моих вершинных и/или фрагментарных шейдерах, но я не понимаю, как это сделать.
Мой код включает в себя некоторую простую математическую модель Matrix Model/View/Projection, но ни одна из них в настоящее время не влияет на мои значения координат текстуры. Обновление: Предыдущее утверждение неверно, согласно комментарию пользователя 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);
}