所以我有一个关于我为OpenGL课程分配的家庭作业的快速问题。在课堂上,我们制作了两个三角形变换(变大和变小),因为它们遵循正弦波,我们的功课是使它只有一个变换而另一个保持静态,同时只使用一个顶点着色器,一个片段着色器和统一变量。当我尝试它时,我的思维方式是以某种方式将值1返回给Scale变量以防止其中一个三角形移动。我能够做到这一点,其中一个三角形是静止的,但没有着色器连接到它,所以它是纯白色。我有一种感觉,我必须使用一些OOP来创建三角形的另一个实例,但我真的无法理解我应该如何区分两个三角形而只使用一个顶点着色器。任何人都可以对此有所了解吗?这是课程中最难的课程,所以即使提示也很可爱!谢谢!如果你们都想要的话我可以发布我的代码,但是我对它做了一些改动让我的程序哭了,所以我会试着回溯我的步骤并明天发布!谢谢大家!
[编辑]好的,这是我的代码。试图使它只有红色三角形是静态的。我有一种感觉答案是在提供的类中以“if语句”的形式,尽管我可能错误地解决了这个问题的复杂性。再次感谢大家帮助我。
#include "Triangle.h"
Triangle::Triangle(vec3 points[], vec4 color[], GLuint pID)
{
ProgramID = pID;
memcpy(Points, points, sizeof(Points));
memcpy(Colors, color, sizeof(Colors));
glUseProgram(ProgramID);
glGenVertexArrays(1, &VBO);
glBindVertexArray(VBO);
glGenBuffers(1, &VB);
glBindBuffer(GL_ARRAY_BUFFER, VB);
glBufferData(GL_ARRAY_BUFFER, sizeof(Points), Points, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glGenBuffers(1, &CB);
glBindBuffer(GL_ARRAY_BUFFER, CB);
glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(1);
Scale = 90.0f;
gScaleLocation = glGetUniformLocation(ProgramID, "Scale");
}
void Triangle::Draw()
{
glUseProgram(ProgramID);
glBindVertexArray(VBO);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
if ()
{
Scale += 0.0f;
}
else
{
Scale += 0.01f;
}
glUniform1f(gScaleLocation, sinf(Scale));
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
}
答案 0 :(得分:0)
不是将动画逻辑放入Triangle
类,而是将其移动到调用者。因此,首先将比例因子作为参数提取:
void Triangle::Draw(double scale)
{
glUseProgram(ProgramID);
glBindVertexArray(VBO);
glUniform1f(gScaleLocation, scale);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
接下来在不同的三角形实例上使用不同的参数调用Draw
:
// your triangles. I assume you have two instances based on the little code you provided.
Triangle tri0, tri1;
// add this to some context, initialized to 0
int frame;
// Your rendering function, you didn't post it.
void render()
{
tri0.Draw(1); // triangle 0 is not animating
tri1.Draw(sin(frame*0.01)); // triangle 1 follows a sine wave
frame++;
}