两个三角形纹理正方形的正确方法?

时间:2014-01-05 20:19:24

标签: opengl textures texture-mapping

我使用的是OpenGL 4.1和GLSL 410.我试图使用以下坐标对我制作的正方形进行纹理处理:

float points[] = {
    -0.5,  0.5,
    -0.5, -0.5,
     0.5, -0.5,
    -0.5,  0.5,
     0.5, -0.5,
     0.5,  0.5
};

我画这样的广场:

glDrawArrays (GL_TRIANGLES, 0, 6);

在我读过的所有教程中,作者使用元素缓冲区绘制正方形或只有四个顶点。这意味着我读过的所有教程都有与每个顶点对齐的纹理坐标。对我来说,我使用6个顶点,所以我不确定如何排列纹理坐标。

这样的坐标是否适合我的情况:

float texcoords[] = {
    0.0, 1.0,
    0.0, 0.0,
    1.0, 0.0,
    0.0, 1.0,
    1.0, 0.0,
    1.0, 1.0
};

我已经做了很多阅读,但没有遇到过像我一样使用六个顶点的其他人。

我的纹理坐标是否有效,如果没有,那么提出纹理坐标的最佳方法是什么。

1 个答案:

答案 0 :(得分:4)

是的,那会有效。您已将sqaure划分为2个三角形,并将tex coords映射到三角形的顶点。你有什么结果?

question。代码使用一个顶点数组(尽管每个顶点都有xyz值)和另一个纹理坐标数组。

定义顶点属性时需要小心。

E.g。设置顶点数据uisng 2 buffers

glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

glGenBuffers(1, &texbuffer);
glBindBuffer(GL_ARRAY_BUFFER, texbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);

glVertexAttribPointer(0,        // attribute 0
                      2,        // 2 floats per vertex
                      GL_FLOAT, // type
                      GL_FALSE, // normalized?
                      0,        // stride -> tightly packed so make it zero
                      0);       // array buffer offset

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, texbuffer);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);

glDrawArrays(GL_TRIANGLES, 0, 6);  

加载纹理(更新并设置采样器,请参阅注释)

glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
GLuint TextureID = glGetUniformLocation(programID, "texture");
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);

顶点着色器

#version 410 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texcoord;    
out vec2 texture_coordinates;    
uniform mat4 MVP;

void main() {
    gl_Position = position;
    texture_coordinates = texcoord;
}

片段着色器

in vec2 texture_coordinates;
uniform sampler2D texture;
out vec4 colour;

void main() {
    colour = texture2D(basic_texture, texture_coordinates);
}