gpt4 book ai didi

c++ - 为什么我的 Triangle 对象没有被绘制?

转载 作者:行者123 更新时间:2023-11-28 01:54:06 26 4
gpt4 key购买 nike

我正在创建一个 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();

最佳答案

您的函数获得一个 vec4 triPoints[3] 参数,但根据 C++ 规则,它等同于 vec4 *triPoints 作为函数参数。因此,sizeof(triPoints) 不是数据的大小,而是指针本身的大小(4 或 8)。相反,将其更改为:

glBufferData(GL_ARRAY_BUFFER, sizeof(*triPoints)*numVertices, triPoints, GL_STATIC_DRAW);

关于c++ - 为什么我的 Triangle 对象没有被绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41852578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com