OpenGL 2D投影矩阵问题
OpenGL 2D projection matrix issue
我有一个简单的顶点数组,可以在屏幕上绘制一个四边形。
glViewport(0, 0, screenWidth, screenHeight);
// Load shaders
...
GLfloat vertices[] = {
0.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
GLuint vao, vbo;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
...
glUseProgram(program);
glUniform3f(glGetUniformLocation(program, "spriteColour"), colour.x, colour.y, colour.z);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
使用下面的简单顶点和片段着色器。
#version 330 core
layout (location = 0) in vec2 vertex;
void main()
{
gl_Position = vec4(vertex.xy, 0.0, 1.0);
}
#version 330 core
out vec4 color;
uniform vec3 spriteColour;
void main()
{
color = vec4(spriteColour, 1.0);
}
这完全符合我的预期。它在 window.
的右上角呈现一个矩形。
现在我想添加一个简单的模型和投影矩阵。我正在使用正交投影矩阵,我的模型矩阵只是将四边形缩放到 100 x 100。
glm::mat4 projection = glm::ortho(0.0f, (GLfloat)screenWidth, (GLfloat)screenHeight, 0.0f, -1.0f, 1.0f);
glUniformMatrix4fv(glGetUniformLocation(shader, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
...
glm::mat4 model;
model = glm::scale(model, glm::vec3(100.0f, 100.0f, 1.0f));
glUniformMatrix4fv(glGetUniformLocation(program, "model"), 1, GL_FALSE, glm::value_ptr(model));
...
// Update vertex shader
#version 330 core
layout (location = 0) in vec2 vertex;
uniform mat4 model;
uniform mat4 projection;
void main()
{
gl_Position = projection * model * vec4(vertex.xy, 0.0, 1.0);
}
我希望这会在屏幕左上角呈现一个 100 x 100 的四边形,但是我什么也没看到。
我只能假设我的变换以某种方式导致四边形被绘制出屏幕并被剪裁?我是 Open GL 的新手,所以我不完全确定这里出了什么问题。我已经看过很多次了,根据我正在使用的教程 (http://learnopengl.com/),它似乎是正确的。
有人知道我做错了什么吗?
原来你需要在设置制服之前激活程序。
Can't set uniform value in OpenGL shader
我有一个简单的顶点数组,可以在屏幕上绘制一个四边形。
glViewport(0, 0, screenWidth, screenHeight);
// Load shaders
...
GLfloat vertices[] = {
0.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
GLuint vao, vbo;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
...
glUseProgram(program);
glUniform3f(glGetUniformLocation(program, "spriteColour"), colour.x, colour.y, colour.z);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
使用下面的简单顶点和片段着色器。
#version 330 core
layout (location = 0) in vec2 vertex;
void main()
{
gl_Position = vec4(vertex.xy, 0.0, 1.0);
}
#version 330 core
out vec4 color;
uniform vec3 spriteColour;
void main()
{
color = vec4(spriteColour, 1.0);
}
这完全符合我的预期。它在 window.
的右上角呈现一个矩形。现在我想添加一个简单的模型和投影矩阵。我正在使用正交投影矩阵,我的模型矩阵只是将四边形缩放到 100 x 100。
glm::mat4 projection = glm::ortho(0.0f, (GLfloat)screenWidth, (GLfloat)screenHeight, 0.0f, -1.0f, 1.0f);
glUniformMatrix4fv(glGetUniformLocation(shader, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
...
glm::mat4 model;
model = glm::scale(model, glm::vec3(100.0f, 100.0f, 1.0f));
glUniformMatrix4fv(glGetUniformLocation(program, "model"), 1, GL_FALSE, glm::value_ptr(model));
...
// Update vertex shader
#version 330 core
layout (location = 0) in vec2 vertex;
uniform mat4 model;
uniform mat4 projection;
void main()
{
gl_Position = projection * model * vec4(vertex.xy, 0.0, 1.0);
}
我希望这会在屏幕左上角呈现一个 100 x 100 的四边形,但是我什么也没看到。
我只能假设我的变换以某种方式导致四边形被绘制出屏幕并被剪裁?我是 Open GL 的新手,所以我不完全确定这里出了什么问题。我已经看过很多次了,根据我正在使用的教程 (http://learnopengl.com/),它似乎是正确的。
有人知道我做错了什么吗?
原来你需要在设置制服之前激活程序。
Can't set uniform value in OpenGL shader