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