Opengl 对由两个三角形组成的正方形进行纹理处理的正确方法?

Opengl 对由两个三角形组成的正方形进行纹理处理的正确方法?,opengl,textures,texture-mapping,Opengl,Textures,Texture Mapping,我使用OpenGL4.1和GLSL410。我正在尝试对使用以下坐标制作的正方形进行纹理处理: 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); 从我读过的所有教程中,作者使用元素缓冲区绘制正方形,或者只有四个顶点。这意味着我

我使用OpenGL4.1和GLSL410。我正在尝试对使用以下坐标制作的正方形进行纹理处理:

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
};
我读了很多书,但是没有遇到像我这样使用六个顶点的人


我的纹理坐标行得通吗?如果不行,最好的纹理坐标生成方法是什么。

行,行得通。您已经将sqaure划分为2个三角形,并将tex坐标映射到三角形的顶点。你的结果是什么

看这个。代码将一个数组用于顶点(尽管每个顶点都有xyz值),另一个数组用于纹理坐标

定义顶点属性时需要小心

例如,使用2个缓冲区设置顶点数据

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);  
要加载纹理(更新并设置采样器,请参见注释)

顶点着色器

#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);
}

“我读了很多书”,可能没有,在我的第一次谷歌搜索中发现了一篇文章。。。虽然你基本上也是这么做的!我做了完全相同的事情,除了在片段着色器中,我使用了texture()而不是texture2D(),因为它被删除了。我得到的似乎只是我图像中的一小部分。(我的图像是白色和红色的,但我只是得到一个白色的正方形。)我也在使用它:glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);是的,您需要一个采样器(或设置采样器设置)。
in vec2 texture_coordinates;
uniform sampler2D texture;
out vec4 colour;

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