Opengl,类内的VAO创建
Opengl, VAO creation within a class
在main.cpp文件中初始化vao并呈现它们按预期工作。然而,当我移动完全相同的初始化代码到一个单独的类,导致我的制服不被发现(优化出来?)
在main.cpp文件中初始化数组对象时(正常工作):
GLuint createCube(){
GLuint VBO;
GLuint VAO;
GLuint EAO;
GLfloat vertexData[] = {
0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
};
GLuint elementData[] = {
2-1, 3-1, 4-1,
8-1, 7-1, 6-1,
5-1, 6-1, 2-1,
6-1, 7-1, 3-1,
3-1, 7-1, 8-1,
1-1, 4-1, 8-1,
1-1, 2-1, 4-1,
5-1, 8-1, 6-1,
1-1, 5-1, 2-1,
2-1, 6-1, 3-1,
4-1, 3-1, 8-1,
5-1, 1-1, 8-1,
};
// make and bind the VAO
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// make and bind the VBO
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// make and bind the eao
glGenBuffers(1, &EAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EAO);
//put data into VBO and EAO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementData), elementData, GL_STATIC_DRAW);
// connect the xyz to the "vert" attribute of the vertex shader
glEnableVertexAttribArray(render.get_shader()->attrib("vert"));
glVertexAttribPointer(render.get_shader()->attrib("vert"), 3, GL_FLOAT, GL_FALSE, 0, NULL);
// unbind the VAO, EAO, VBO
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
return VAO;
}
int main()
{
GLuint VAO = createCube();
glm::mat4 MVP = createMVP();
bool running = true;
while(running){
running = eventHandler();
render.draw(VAO,36,MVP);
ui.swapBuffer();
}
return 0;
}
在类中初始化数组对象时(在我的着色器中找不到MVP制服,可能优化了吗?)
class cube{
public:
cube(Render rendrer)
{
GLuint VBO;
GLuint EAO;
GLfloat vertexData[] = {
0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
};
GLuint elementData[] = {
2-1, 3-1, 4-1,
8-1, 7-1, 6-1,
5-1, 6-1, 2-1,
6-1, 7-1, 3-1,
3-1, 7-1, 8-1,
1-1, 4-1, 8-1,
1-1, 2-1, 4-1,
5-1, 8-1, 6-1,
1-1, 5-1, 2-1,
2-1, 6-1, 3-1,
4-1, 3-1, 8-1,
5-1, 1-1, 8-1,
};
// make and bind the VAO
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// make and bind the VBO
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// make and bind the eao
glGenBuffers(1, &EAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EAO);
//put data into VBO and EAO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementData), elementData, GL_STATIC_DRAW);
// connect the xyz to the "vert" attribute of the vertex shader
glEnableVertexAttribArray(rendrer.get_shader()->attrib("vert"));
glVertexAttribPointer(rendrer.get_shader()->attrib("vert"), 3, GL_FLOAT, GL_FALSE, 0, NULL);
// unbind the VAO, EAO, VBO
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
GLuint get_VAO() const
{
return VAO;
}
private:
GLuint VAO;
};
int main()
{
cube cube_object(render);
GLuint VAO = cube_object.get_VAO();
glm::mat4 MVP = createMVP();
bool running = true;
while(running){
running = eventHandler();
render.draw(VAO,36,MVP);
ui.swapBuffer();
}
return 0;
}
这是我的顶点着色器:
#version 430
in vec3 vert;
uniform mat4 MVP;
out vec3 vertout;
void main(void)
{
vertout = vert;
gl_Position = MVP*vec4(vert, 1.0);
}
这是我的片段着色器:
#version 430
in vec3 vertout;
out vec4 outcolor;
void main(void)
{
outcolor = mix(vec4(1,0,0,1),vec4(0,1,0,1),dot(vertout, vertout));
}
在类中创建VAO是否会导致MVP制服被删除,或者是其他东西?
编辑:我应该澄清:对象仍然呈现,但它呈现白色和MVP制服缺失。
对于OpenGL操作的工作,必须有一个OpenGL上下文,并使其在线程上当前。如果你的"其他"类在没有OpenGL上下文可用的情况下被实例化,就好像没有创建任何东西一样。更糟糕的是,如果周围没有上下文,glGetError可能会返回GL_NO_ERROR,因此仅使用它检查错误可能不会显示该问题。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- glGenVertexArrays在主循环中不创建唯一的VAO,但在其他情况下有效
- 为什么我不能单独创建和初始化 OpenGl VAO?
- Opengl,类内的VAO创建
- OpenGL -正确分离VAO定义从VBO和其他缓冲区的创建
- 当使用IBO/EBO时,只有当我在创建VAO之后调用glBindBuffer来绑定IBO/EB0时,程序才能工作