OpenGL 3.2 设置矩阵的麻烦

Posted

技术标签:

【中文标题】OpenGL 3.2 设置矩阵的麻烦【英文标题】:OpenGL 3.2 trouble setting up matrices 【发布时间】:2013-02-21 00:29:00 【问题描述】:

我正在使用 GLM 来管理我的矩阵,但我遇到了一些对我来说毫无意义的问题。当我将投影矩阵设置为单位矩阵以外的任何东西时,我看不到我要绘制的正方形。如果它是一个身份,它将起作用。我的视图矩阵发生了类似的事情。如果我尝试翻译过去 -1 或 +1,方块将会消失,否则它似乎没有任何效果。

没有 OpenGL 错误、GLSL 链接器/编译器错误,并且 glGetUniformLocation 返回一个有效位置。着色器程序也被正确使用。

我还测试了着色器以查看它是否将正确的值传递给每个矩阵(如果值正确,则通过更改正方形的颜色)。

我是这样设置投影矩阵的:

projectionMatrix = glm::perspective(60.0f, (float)windowWidth / (float)windowHeight, 0.1f, 100.0f);

这是我的绘图功能:

void OpenGLContext::render(void)   
glViewport(0, 0, windowWidth, windowHeight); // Set the viewport size to fill the window  
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Clear required buffers  

//Set up matrices
viewMatrix  = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.0f));
modelMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(.5f));  

shader->bind();

int projectionMatrixLocation = glGetUniformLocation(shader->id(), "projectionMatrix");
int viewMatrixLocation = glGetUniformLocation(shader->id(), "viewMatrix");
int modelMatrixLocation = glGetUniformLocation(shader->id(), "modelMatrix");

glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &projectionMatrix[0][0]);
glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, &viewMatrix[0][0]);
glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, &modelMatrix[0][0]);

glBindVertexArray(vaoID[0]);
glDrawArrays(GL_TRIANGLES, 0, 6);   
glBindVertexArray(0);

shader->unbind();

SwapBuffers(hdc); 

这里是 shader.vert

#version 150 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

in vec3 in_Position;
in vec3 in_Color;
out vec3 pass_Color;

void main(void)

    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);
    pass_Color = in_Color;

这里是shader.frag

#version 150 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

in vec3 pass_Color;
out vec4 out_Color;

void main(void)

    out_Color = vec4(pass_Color, 1.0);

抱歉忘了我在画什么:

void OpenGLContext::createSquare(void)

float* vertices = new float[18];

vertices[0] = -0.5; vertices[1] = -0.5; vertices[2] = 0.0; // Bottom left corner  
vertices[3] = -0.5; vertices[4] = 0.5; vertices[5] = 0.0; // Top left corner  
vertices[6] = 0.5; vertices[7] = 0.5; vertices[8] = 0.0; // Top Right corner  

vertices[9] = 0.5; vertices[10] = -0.5; vertices[11] = 0.0; // Bottom right corner  
vertices[12] = -0.5; vertices[13] = -0.5; vertices[14] = 0.0; // Bottom left corner  
vertices[15] = 0.5; vertices[16] = 0.5; vertices[17] = 0.0; // Top Right corner  

glGenVertexArrays(1, &vaoID[0]);
glBindVertexArray(vaoID[0]);

glGenBuffers(1, vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID[0]);
glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);

glVertexAttribPointer((GLuint) 0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glEnableVertexAttribArray(0); // Disable our Vertex Array Object  
glBindVertexArray(0);

delete [] vertices;

像这样设置我的矩阵不会在屏幕上绘制任何内容。就像我说的,如果我将投影和视图矩阵设置为一个身份,它将起作用。 modelMatrix 上的缩放似乎也总是有效。

【问题讨论】:

在不知道您实际要渲染的内容的情况下,很难回答这个问题。 你能描述一下你是如何改变投影矩阵的,你期望发生什么,以及实际发生了什么?图片会有很大帮助。 哇,我不知道怎么做,但是当我去截屏给你们看时,它才开始正常工作?我不是在抱怨只是困惑哈哈。一定是我调试的时候不小心把它修好了? 您应该将问题标记为已回答。 【参考方案1】:

位置 1 (in_Color) 上没有属性。如果您只是将其排除在这个问题之外,那么问题在于您没有在着色器中定义的位置。我从来没有在没有位置部分的情况下实际测试过它,但我认为这是必要的,至少对于多个​​值:你应该使用例如layout(location = 0) in in_Position.

【讨论】:

步幅为 0 表示紧密打包的数据,绝对没问题。 什么?我一直认为 0 意味着每个组件的大小为 0,而 sizeof(float) * 3 则意味着它们是三个浮点宽 不,0 是一个特殊值。见the documentation。

以上是关于OpenGL 3.2 设置矩阵的麻烦的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

OPENGL之矩阵

Opengl 未使用着色器正确绘制 - 矩阵设置/初始化问题?

opengl如何在MFC中设置双缓冲

OpenGL - 正交投影矩阵,glViewport

opengl 的投影和正交矩阵