Tôi đã vẽ hình thang kết cấu, tuy nhiên kết quả không xuất hiện như tôi đã dự định.Phối cảnh kết cấu chính xác của hình thang trong OpenGL ES 2.0
Thay vì xuất hiện dưới dạng tứ giác đơn không gián đoạn, sự gián đoạn xảy ra ở đường chéo nơi hai hình tam giác của nó gặp nhau.
minh họa này cho thấy vấn đề này:
(Lưu ý:. Hình ảnh cuối cùng không có ý định trở thành một 100% đại diện trung thành, nhưng nó phải được những điểm trên)
Các hình thang đã được rút ra sử dụng GL_TRIANGLE_STRIP
trong OpenGL ES 2.0 (trên iPhone). Nó đang được vẽ hoàn toàn đối diện với màn hình, và không bị nghiêng (tức là đó không phải là một bản phác họa 3D mà bạn đang thấy!)
Tôi đã hiểu rằng tôi cần phải thực hiện "hiệu chỉnh phối cảnh", có lẽ là ở đỉnh của tôi và/hoặc shaders fragment, nhưng tôi không rõ làm thế nào để làm điều này.
Mã của tôi bao gồm một số phép toán ma trận Model/View/Projection đơn giản, nhưng không có phép toán nào trong số đó ảnh hưởng đến giá trị tọa độ kết cấu của tôi. Cập nhật: Câu lệnh trước không chính xác, theo nhận xét của người dùng.
Hơn nữa, tôi đã tìm thấy miếng ngon này trong spec ES 2.0, nhưng không hiểu ý nghĩa của nó:
quan điểm SỬA CHỮA GỢI Ý không được hỗ trợ vì OpenGL ES 2.0 yêu cầu tất cả các thuộc tính được perspectively nội suy.
Làm cách nào để vẽ kết cấu chính xác?
Edit: Added mã bên dưới:
// 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);
}
Hình dạng có phải là hình tứ giác đã được biến đổi và chiếu, hay đây là hình dạng 2D tùy ý? Giải pháp đơn giản nhất là chỉ cần render một quad nghiêng trong 3D ... – JasonD
Bạn nên kiểm tra UV cho tam giác thứ hai.Looks như thay đổi kết cấu –
Hiển thị mã cho chúng tôi. Có vẻ hơi bị _backshortened _... –