我画了一个带纹理的梯形,但是结果并没有像我预期的那样出现。
不是显示为一个完整的四边形,而是在其两个组成三角形相交的对角线上出现不连续性。
这张插图说明了这个问题:(
注意:最后一张图片并不是要 100% 忠实地表示,但它应该能说明问题。)
梯形是GL_TRIANGLE_STRIP
在 OpenGL ES 2.0(在 iPhone 上)中绘制的。它完全面向屏幕绘制,并且没有倾斜(即,这不是您看到的 3D 草图!)
我已经明白我需要执行“透视校正”,大概是在我的顶点和/或片段着色器中,但我不清楚如何做到这一点。
我的代码包括一些简单的模型/视图/投影矩阵数学,但目前没有一个会影响我的纹理坐标值。更新:根据用户 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);
}