c++ - OpenGL 纹理坐标无效

标签 c++ opengl glsl

我无法让纹理坐标对屏幕上呈现的内容产生任何影响。我的纹理似乎一直在从 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 坐标之间进行插值?

最佳答案

你的属性设置错误:

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);

这告诉 OpenGL 它应该将每个顶点的前两个 float 附加到 mytextpos 属性。但是您实际上希望它读取第 3 个和第 4 个 float 。因此,您必须设置偏移量,使其跳过前两个 float :

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));

关于c++ - OpenGL 纹理坐标无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56580269/

相关文章:

c++ - Qt。所有功能都在发布文件夹中工作,但在 Program Files 中不起作用

c++ - 将 ruby​​ 解决方案移植到 C++

c++ - 为什么 std::function 模板构造函数不使用通用引用?

c++ - 对 GLShaderManager 和 GLBatch 的 undefined reference

c++ - OpenGL 3.1 照明搞砸了,使用 phong 着色

c++ - 非常基本的 C++ 问题(预期表达式)?

java - LWJGL OpenGL glGenVertexArrays() 错误 : This Function is not available

c++ - OpenGL 4 和 ES 3.0 与 packHalf2x16/unpackHalf2x16 的差异

c++ - 纹理渲染和 VBO 的 [OpenGL/SDL/C++]

GLSL - 将 2D 纹理用于 3D Perlin 噪声而不是程序 3D 噪声