为什么我的三角形对象没有被绘制?
Why isn't my Triangle object being drawn?
我正在创建一个OpenGL程序,该程序只需创建一个三角形并将其绘制在屏幕上。我创建了一个名为Drawable的类,它包含draw函数以及VAO&使用的VBO对象。我还创建了一个继承自Drawable类的Triangle类。在Triangle类中,我有一个构造函数,它接受一个点数组和一个包含颜色的单个数组,并初始化VAO&VBO(继承自Drawable)使用此数据。
在我的主函数中,我使用点和颜色数据初始化三角形,然后在三角形对象上调用draw函数(这个draw函数在Drawable中)。但最终,窗口打开,三角形没有绘制出来。我在Drawable类中有一个简单的构造函数,如果我使用这个构造函数初始化对象并调用draw函数,它将显示该对象,所以我不认为它是我的draw函数。我唯一能想到的是,因为我是如何访问VAO&VBO对象可能实际上并没有被初始化为任何东西,但我不知道如何检查。
可绘制.h
class Drawable
{
public:
Drawable();
void draw();
GLuint objBuffer, VAO, program;
std::string vShaderName, fShaderName;
bool isUniform = false;
int numVertices = 0;
vec4 uniformColorVec;
};
可绘制.cpp
Drawable::Drawable()
{}
void Drawable::draw()
{
GLuint program = InitShader(vShaderName.c_str(), fShaderName.c_str());
glUseProgram(program);
GLuint color_loc = glGetUniformLocation(program, "color");
glBindVertexArray(VAO);
glUniform4fv(color_loc, 1, uniformColorVec);
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices);
}
三角形.cpp
Triangle::Triangle(vec4 triPoints[3], vec4 color)
{
uniformColorVec = color;
vShaderName = "vshader00_v150.glsl";
fShaderName = "fshader00_v150.glsl";
numVertices = 3;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &objBuffer);
glBindBuffer(GL_ARRAY_BUFFER, objBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(triPoints), triPoints, GL_STATIC_DRAW);
program = InitShader(vShaderName.c_str(), fShaderName.c_str());
glUseProgram(program);
GLuint vPosition = glGetAttribLocation(program, "vPosition");
GLuint color_loc = glGetUniformLocation(program, "color");
glEnableVertexAttribArray(vPosition);
glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glUniform4fv(color_loc, 1, uniformColorVec);
}
主文件
/* All the OpenGL windowing is intialized but I won't
include that since I know it's fine due to other objects being drawn
correctly */
vec4 triPoints2[3] = {
vec4(0.0, 0.0, 1.0, 1.0),
vec4(-0.75, -0.75, 1.0, 1.0),
vec4(0.0, -0.75, 1.0, 1.0)
};
vec4 blue_opaque = vec4(0.0, 0.0, 1.0, 1.0);
Triangle t;
t = Triangle(triPoints2, blue_opaque);
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
t.draw();
glFlush();
您的函数有一个vec4 triPoints[3]
参数,但根据C++规则,它等效于vec4 *triPoints
作为函数参数。结果sizeof(triPoints)
不是数据的大小,而是指针本身的大小(4或8)。改为:
glBufferData(GL_ARRAY_BUFFER, sizeof(*triPoints)*numVertices, triPoints, GL_STATIC_DRAW);
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 为什么在GLFW窗口中没有用这个代码在我的屏幕上绘制立方体
- 如何在我的子类控件paint方法中在默认的paint结果之上绘制一些东西
- 为什么我的三角形对象没有被绘制?
- FreeGrot(类似于OpenGL)正在拍摄我的桌面而不是绘制形状
- 在 OpenGL 中,为什么除非我再次重新指定顶点属性,否则我的缓冲区对象不会绘制?
- c++ Glut 显示需要调用我的绘制函数,但我无法传递任何参数
- 为什么我的 openGL 顶点缓冲区对象不会绘制任何内容?
- OpenGL 批处理:为什么我的绘制调用超出了数组缓冲区边界
- 为什么我的 OpenGL 对象相对于最后一个绘制的对象绘制
- 为什么当我添加绘制三角形的代码时形状变得隐藏
- 我的窗口未在调试器中运行时无法正确绘制
- OpenGL没有绘制我的纹理精灵
- 为什么我的OpenGL 3.3应用程序没有绘制任何内容
- 为什么我的非所有者绘制的列表框在添加字符串后会出现绘图问题
- 我的绘制方法不工作
- 绘制瓷砖地图正在将我的 fps 降低到爬行