为啥我的三角形对象没有被绘制?
Posted
技术标签:
【中文标题】为啥我的三角形对象没有被绘制?【英文标题】:Why isn't my Triangle object being drawn?为什么我的三角形对象没有被绘制? 【发布时间】:2017-01-25 13:14:54 【问题描述】:我正在创建一个 OpenGL 程序,它只是创建一个三角形并将其绘制在屏幕上。我创建了一个名为 Drawable 的类,其中包含绘图函数,以及使用的 VAO 和 VBO 对象。我还创建了一个继承自 Drawable 类的 Triangle 类。在 Triangle 类中,我有一个构造函数,它接受一个点数组和一个包含颜色的单个数组,并使用这些数据初始化 VAO 和 VBO(从 Drawable 继承)。
在我的主函数中,我使用点和颜色数据初始化三角形,然后在三角形对象上调用绘图函数(这个绘图函数在 Drawable 中)。最终,窗口打开并且三角形没有被绘制。我在 Drawable 类中有一个简单的构造函数,如果我使用这个构造函数初始化对象并调用绘图函数,它将显示该对象,所以我不认为它是我的绘图函数。我唯一能想到的是,由于我访问 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();
【问题讨论】:
glGetError
说什么?我也建议不要使用GL_TRIANGLE_FAN
,因为它是历史。
@ybungalobill glGetError
显示为 0,因此它没有报告任何错误。
如果将Triangle t; t = Triangle(triPoints2, blue_opaque);
行更改为Triangle t(triPoints2, blue_opaque);
会发生什么?
似乎是一回事。只是一个空荡荡的白色窗口。我在那里有一些cout
,它显示了正确的顶点数被传递给三角形构造函数和可绘制显示函数。
【参考方案1】:
你的函数得到一个 vec4 triPoints[3]
参数,但根据 C++ 规则,它等效于 vec4 *triPoints
作为函数参数。因此,sizeof(triPoints)
不是数据的大小,而是指针本身的大小(4 或 8)。相反,将其更改为:
glBufferData(GL_ARRAY_BUFFER, sizeof(*triPoints)*numVertices, triPoints, GL_STATIC_DRAW);
【讨论】:
非常感谢!非常感谢您的帮助。以上是关于为啥我的三角形对象没有被绘制?的主要内容,如果未能解决你的问题,请参考以下文章
为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?
我的OpenGL学习进阶之旅介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果