Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OpenGL中使用GLM?_C++_Opengl_Glfw_Glew_Glm Math - Fatal编程技术网

C++ 如何在OpenGL中使用GLM?

C++ 如何在OpenGL中使用GLM?,c++,opengl,glfw,glew,glm-math,C++,Opengl,Glfw,Glew,Glm Math,我正在尝试使用GLM为矩阵变换渲染对象,但我得到以下结果: 编辑:忘记提到我试图渲染的对象是一个简单的圆环体 我做了大量的挖掘,我注意到一件事是glGetUniformLocation(程序,“mvp”)返回-1。文档称,如果着色器中未使用统一变量,即使声明了统一变量,它也将返回-1。正如您在下面所看到的,它已经声明并正在顶点着色器中使用。我已经检查了程序,以确保它是有效的,等等 因此,我的问题是: 问题1: 为什么glGetUniformLocation(程序,“mvp”)返回-1,即使它已

我正在尝试使用GLM为矩阵变换渲染对象,但我得到以下结果:

编辑:忘记提到我试图渲染的对象是一个简单的圆环体

我做了大量的挖掘,我注意到一件事是
glGetUniformLocation(程序,“mvp”)
返回
-1
。文档称,如果着色器中未使用统一变量,即使声明了统一变量,它也将返回
-1
。正如您在下面所看到的,它已经声明并正在顶点着色器中使用。我已经检查了
程序
,以确保它是有效的,等等

因此,我的问题是:

问题1: 为什么
glGetUniformLocation(程序,“mvp”)
返回
-1
,即使它已声明并正在顶点着色器中使用

问题2:(我认为可能与第一季度有关) 还有一件事我不是特别清楚。我的GameObject类有一个名为Mesh的结构,其中包含变量
GLuint vao
GLuint[4]vbo
(顶点数组对象)和(顶点缓冲区对象)。我使用的是ASIMP,我的GameObject类基于。网格的渲染方式与教程相同,使用:

glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, elementCount, GL_UNSIGNED_INT, NULL);
我不确定VAO和VBO是如何工作的。我发现,如果您想在整个程序中访问顶点数组,可以使用VAO,如果您只想将其发送到图形卡,而不想再次触摸它,则可以使用VBO(如果我在这里出错,请纠正我)。那么,教程为什么要混合使用它们呢?在网格的构造函数中,它创建并绑定VAO,然后在构造函数的其余部分不接触它(除非创建和绑定VBO对当前绑定的VAO有影响)。然后,它继续为顶点缓冲区、法线缓冲区、纹理坐标缓冲区和索引缓冲区创建并绑定VBO。为了呈现对象,它绑定VAO并调用
glDraweElements
。我所困惑的是OpenGL如何/在哪里访问VBO,如果它不能使用教程中的设置(我很确定它可以),需要更改什么

来源 片段着色器:

#version 330 core
in vec3 vertColor;
out vec3 color;

void main(void) {
    color = vertColor;
}
问题1

你自己已经回答了这个问题
glGetUniformLocation(程序,名称)
获取制服
在着色器程序
程序中的“mvp”
位置,如果未声明制服(或未使用制服:如果未使用制服,则不会编译制服),则返回-1。您的着色器确实声明并使用mvp,这强烈表明编译程序时存在问题。您确定要在程序中使用此着色器吗

问题2

VBO存储GPU将使用的数据值。这些可以是颜色值,法线,纹理坐标,任何你喜欢的。 VAO用于表示VBO的布局—将其视为地图,指示程序在VBO中查找数据的位置

示例程序在调用时会触碰VAO,例如


这与缺少的制服无关。

如果得到-1,可能是因为着色器未编译/链接。这一步行得通吗?是的,我检查了着色器编译和程序链接。如果是这样的话,我就被难倒了。我只能在代码的加载/编译/链接部分看到一个问题来解释这一点(你确定你将正确的着色器传递给了程序吗?
program
变量设置是否正确?等等?)检查你是否加载了正确的着色器,iirc“blank”着色器仍将正确编译/链接,当然,当您尝试设置制服时会中断。我检查了我是否在所有地方使用了正确的着色器。OpenGL上下文有什么奇怪的地方吗?(参见我对foundry回答的评论)好的,我检查了
program
everywhere的值-当我创建着色器对象(附带程序ID)时,当我创建材质对象(附带着色器)时,当我在游戏对象的渲染函数中使用
material->shader->program
获得
program
时。它们都报告
program=3
。如果我在创建OpenGL上下文的调用函数(main)之外创建着色器程序,那么OpenGL上下文会有什么奇怪的地方吗?着色器程序是作为着色器的静态实例的成员创建的。
#version 330 core
layout(location = 0) in vec3 position;
uniform mat4 mvp;

out vec3 vertColor;

void main(void) {
    gl_Position = mvp * vec4(position, 1);
    vertColor = vec3(1, 0, 0);
}
#version 330 core
in vec3 vertColor;
out vec3 color;

void main(void) {
    color = vertColor;
}
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);