OpenGL 纹理坐标没有影响
Posted
技术标签:
【中文标题】OpenGL 纹理坐标没有影响【英文标题】:OpenGL Texture Coordinates Have No Effect 【发布时间】:2019-06-13 12:14:33 【问题描述】:我无法让纹理坐标对屏幕上呈现的内容产生任何影响。我的纹理似乎不断地从 0,0 渲染到 1,1。
我使用的方法是发送如下缓冲区布局:x,y,u,v(xy:顶点位置和u,v纹理坐标)。
但是,更改 u 和 v 的值对渲染的纹理没有影响。
我已经删除了很多周围的代码以尝试使其更易于阅读,但如果问题对某人来说不是很明显,我可以将其完整发布。 顶点着色器:
#version 330 core
layout(location = 0) in vec2 position;
layout(location = 1) in vec2 mytextpos;
out vec2 v_TexCoord;
uniform mat4 u_Model;
void main()
gl_Position = u_Model * vec4(position, 0.0f, 1.0f);
v_TexCoord = mytextpos;
片段着色器:
#version 330 core
layout(location = 0) out vec4 color;
in vec2 v_TexCoord;
uniform sampler2D u_Texture;
void main()
color = texture(u_Texture, v_TexCoord);
我的 Rectangle 类构造函数:
// GENERATE BUFFERS
glGenVertexArrays(1, &VertexArrayObject);
glGenBuffers(1, &VertexBufferId);
glGenBuffers(1, &IndexBufferObjectId);
Indices =
0, 1, 2,
2, 3, 0
;
unsigned int numberOfVertices = Vertices.size();
unsigned int numberOfIndices = Indices.size();
glBindVertexArray(VertexArrayObject);
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferObjectId);
Vertices =
0.2f, 0.0f, 0.0f, 0.5f,
1.0f, 0.0f, 1.5f, 0.5f,
1.0f, 1.0f, 1.5f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f
;
// ADD BUFFER DATA
glBufferData( GL_ARRAY_BUFFER, Vertices.size() * sizeof(float), Vertices.data(), GL_STATIC_DRAW );
// ARRANGE ATTRIBUTES
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);
glEnableVertexAttribArray(1);
glBufferData( GL_ELEMENT_ARRAY_BUFFER, numberOfIndices * sizeof(unsigned int), Indices.data(), GL_STATIC_DRAW );`
渲染功能:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLint u_Texture = glGetUniformLocation( shader.getId(), "u_Texture" );
glUniform1i( u_Texture, 0 );
GLint u_Model = glGetUniformLocation( shader.getId(), "u_Model" );
glUniformMatrix4fv( u_Model, 1, GL_FALSE, glm::value_ptr( rect.TransformMatrix() ) );
glDrawElements(GL_TRIANGLES, rect.Indices.size(), GL_UNSIGNED_INT, nullptr);
// SWAP BUFFERS
glfwSwapBuffers( _window->WindowInstance );
glfwPollEvents();
我的程序运行,但无论我的顶点或 u,v 位置是什么,我的纹理都映射在 0,0 和 1,0 之间。我希望纹理在每个顶点的 u,v 坐标之间进行插值?
【问题讨论】:
您的数据不符合您的描述。每个顶点有 4 个浮点数,但声称你有一个x,y,z,u,v
布局。但这需要每个顶点 5 个浮点数。
糟糕...我的错误应该是 x,y,v,w。已更新。
【参考方案1】:
你的属性设置错误:
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);
这告诉 OpenGL 它应该将每个顶点的前两个浮点数附加到mytextpos
属性。但您实际上希望它读取第 3 和第 4 个浮点数。因此,您必须设置偏移量,使其跳过前两个浮点数:
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
【讨论】:
完美,非常感谢!在阅读文档时我完全错过了这个参数,我假设偏移量是使用位置计算的。再次感谢! @James 如果此答案解决了您的问题,那么您可以考虑接受它作为正确答案。以上是关于OpenGL 纹理坐标没有影响的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题