【问题标题】:Deforming a shape when resizing an OpenGL window调整 OpenGL 窗口大小时使形状变形
【发布时间】:2021-04-27 23:32:56
【问题描述】:

我使用着色器程序和 VAO 绘制对象
但是当我变形窗户时,我的身材也变形了。 我的顶点着色器没有做任何事情,片段着色器只将颜色设置为橙色。

vertshader.vert

#version 330 core
layout (location = 0) in vec3 aPos;
 
void main()
{
    gl_Position = vec4(aPos, 1.0);
}

gl 初始化函数

float vertexes_normalized[12] =
                 {-0.5, 0.5, 0,
                   0.5, 0.5, 0,
                   0.5, -0.5, 0,
                  -0.5, -0.5, 0};

glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-this->width() / 2, this->width() / 2, -this->height() / 2, this->height() / 2);
glViewport(0, 0, this->width(), this->height());

//Compile shader program
unsigned int shaderProgram = makeShaderProgram(":/glshaders/vertshader.vert", ":/glshaders/fragshader.frag");
if(!shaderProgram) {
    qDebug("[ERROR]initializeGL: makeShaderProgram failed!");
    return;
}
gShaderProgram = shaderProgram;

//Vertex buffer object
unsigned int VBO = 0;
//Allocate 1 buffer
glGenBuffers(1, &VBO);
//Linking a buffer object to an OpenGL buffer
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//Copying vertex data from the array to VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes_normalized), vertexes_normalized, GL_STATIC_DRAW);
gVBO = VBO;

//Configuring the interpretation of the vertex buffer data
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

glUseProgram(shaderProgram);

在绘图功能中,我只是这样做:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_POLYGON, 0, 4);

我还有一个在调整窗口大小时调用的函数

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-newW / 2, newW / 2, -newH / 2, newH / 2);
glViewport(0, 0, newW, newH);

这是我第一次运行程序时得到的结果

但是如果我调整窗口大小会发生什么

如果我在没有着色器程序的情况下使用glBegin(); glVertex(); glEnd(); 进行常规渲染,则一切正常,并且在窗口更改时形状不会变形。

如何使用 VBO 和 VAO 实现相同的效果?

【问题讨论】:

  • gluOrtho2D 在使用着色器程序时无效。您必须使用矩阵Uniform
  • @Rabbid76,我明白了。那么我必须在顶点着色器中执行的对象的所有操作(缩放、旋转、更改位置)?
  • 是的。对投影、视图和模型矩阵使用制服。

标签: c++ opengl glsl shader


【解决方案1】:

您将弃用的 OpenGL 矩阵与“现代”OpenGL 混合在一起。 gluOrtho2D 在您使用着色器程序时无效。您必须使用矩阵Uniform 变量。


mat4 类型的Uniform 变量添加到着色器程序中,并将顶点坐标乘以矩阵:

#version 330 core
layout (location = 0) in vec3 aPos;
 
uniform mat4 projection;

void main()
{
    gl_Position = projection * vec4(aPos, 1.0);
}

获取shader程序与glGetUniformLocation链接后(glLinkProgram后)uniform的位置索引:

GLint projection_loc = glGetUniformLocation(shaderProgram, "projection");

指定和Orthographic projection 矩阵。一个选项是使用OpenGL Mathematics (GLM) 库并使用glm::ortho 设置正交投影:

glm::mat4 projection = glm::ortho(-this->width() / 2, this->width() / 2, -this->height() / 2, this->height() / 2);

安装程序后(glUseProgram之后)用glUniformMatrix4fv设置uniform变量的值:

glUniformMatrix4fv(projection_loc , 1, GL_FALE, glm::value_ptr(projection));

【讨论】:

    猜你喜欢
    • 2017-03-25
    • 2015-05-23
    • 2011-09-16
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2015-03-03
    • 2016-03-19
    • 2021-01-10
    相关资源
    最近更新 更多