C++ (OpenGL)如何在保持相同对象静止的同时变换对象?
所以我有一个关于我被分配给OpenGL课程的家庭作业的快速问题。在课堂上,我们制作了两个三角形变换(变大和变小),因为它们跟随正弦波,我们的作业是使其只变换一个,而另一个保持静态,同时只使用一个顶点着色器、一个片段着色器和统一变量。当我尝试时,我的想法是以某种方式将1的值返回到一个比例变量,以防止其中一个三角形移动。我能够使其中一个三角形是静止的,但没有附加着色器,所以它是纯白的。我有一种感觉,我必须使用OOP来创建三角形的另一个实例,但我真的无法在仅使用一个顶点着色器的情况下思考如何区分这两个三角形。有人能解释一下吗?这是课程中最难的一节课,所以哪怕是一个暗示都会很可爱!非常感谢。如果你们都愿意,我可以发布我的代码,但我对它做了一些更改,这让我的程序大失所望,所以我将尝试回溯我的步骤,明天发布它!谢谢大家! [编辑]好的,这是我的代码。试图使它只有红色三角形是静态的。我有一种感觉,答案以“if语句”的形式出现在提供的类中,尽管我可能对这个问题的复杂性有所误解。再次感谢你们帮助我C++ (OpenGL)如何在保持相同对象静止的同时变换对象?,c++,opengl,syntax,logic,C++,Opengl,Syntax,Logic,所以我有一个关于我被分配给OpenGL课程的家庭作业的快速问题。在课堂上,我们制作了两个三角形变换(变大和变小),因为它们跟随正弦波,我们的作业是使其只变换一个,而另一个保持静态,同时只使用一个顶点着色器、一个片段着色器和统一变量。当我尝试时,我的想法是以某种方式将1的值返回到一个比例变量,以防止其中一个三角形移动。我能够使其中一个三角形是静止的,但没有附加着色器,所以它是纯白的。我有一种感觉,我必须使用OOP来创建三角形的另一个实例,但我真的无法在仅使用一个顶点着色器的情况下思考如何区分这两个
#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);
}
不要将动画逻辑放入
三角形
类,而是将其移动到调用方。因此,首先提取比例因子作为参数:
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++;
}
你是分开画三角形的吗?您有一个或两个绘制命令吗?如果三角形完全由顶点或片段着色器移动,只需传递一个统一的命令,以区分不同三角形之间的差异。然后,您可以使用它来“if out”静态版本的移动,或者简单地传递转换的身份矩阵。在任何情况下:显示一些代码!所以不仅正弦波和三角形是在同一个类中建立的,而且我们的教授给了我们一些代码,他用迭代器画三角形。它看起来有点像这样:void display(){glClear(GL_COLOR_BUFFER_BIT);for(vector::iterator It=triangles.begin();It!=triangles.end();++It){It->Draw();}glutSwapBuffers()}我该怎么做你说的,但是通过迭代器,因为我不熟悉它们。谢谢