【发布时间】:2015-03-14 17:31:20
【问题描述】:
我正在尝试创建一个类来描述我正在尝试渲染到屏幕的特定对象。我有一个在 main() 中运行的着色器、网格和纹理对象,它运行良好。它现在所做的只是将图像绘制到屏幕上。
但是当我将这些对象放在一个名为 Entity 的类中并尝试使用它进行渲染时,它不会绘制图像。
主要代码:
int main(int argc, char*argv[]) {
Display display;
display.init(); //Sets up SDL and glew
Shaders shaders("basicShader");
Mesh mesh(shaders.getProgram());
Texture texture("kitten.png");
Entity entity;
//Loop stuff
bool quit = false;
SDL_Event e;
double frameCounter = 0;
double time = SDL_GetTicks();
while (!quit) {
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
quit = true;
}
if (e.type == SDL_KEYDOWN) {
if (e.key.keysym.sym == SDLK_ESCAPE)
quit = true;
}
}
++frameCounter;
if (SDL_GetTicks() - time >= 500) {
std::cout << "FPS: " << frameCounter / ((SDL_GetTicks() - time) / 1000) << std::endl;
frameCounter = 0;
time = SDL_GetTicks();
}
// Clear the screen to black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
mesh.draw();
//entity.render();
// Swap buffers
display.render();
}
mesh.~Mesh();
entity.~Entity();
display.~Display();
return 0;
}
实体标题:
#pragma once
#include "Mesh.h"
#include "Shaders.h"
#include "Texture.h"
class Entity
{
public:
Entity();
void render();
~Entity();
private:
Mesh mesh;
Shaders shaders;
Texture texture;
};
实体类代码:
#include "Entity.h"
Entity::Entity() {
shaders = Shaders("basicShader");
mesh = Mesh(shaders.getProgram());
texture = Texture("kitten.png");
}
void Entity::render() {
mesh.draw();
}
Entity::~Entity() {
mesh.~Mesh();
}
当 mesh.draw() 未注释并且 entity.render() 在 main() 中被注释时,此代码有效,但反之则不行。如有必要,我可以从标题和其他类中发布代码。
【问题讨论】:
-
所有这些显式的析构函数调用是怎么回事?你确定你在那里做什么?
-
并非如此。过去,除非我把它们放在那里,否则我在退出时遇到程序挂起的问题。目前这似乎是你的权利,我不需要它们。我是这方面的新手,所以我还在努力。
-
请同时显示
Entity类的定义(标题中的内容)。另外,您是 C++ 新手,您可能想要获取good C++ book。 -
@Xerict:您必须绝对从更简单的示例开始,而不是从 OpenGL 开始。那不是初学者的东西!您在这里的析构函数调用是非常错误的。在 C++ 中,本地对象会自行销毁。您应该了解带有典型迷你示例的类,例如
Animal或Person... -
这与最近的问题非常相似:stackoverflow.com/questions/28929452。我的回答解释了在 C++ 类中包装 OpenGL 对象的一些缺陷,尤其是在使用容器时。如果你不小心的话,很容易打到自己的脚。