繁体   English   中英

(OpenGL) 如何在保持相同对象静止的同时变换对象?

[英](OpenGL) How to transform an object while keeping an identical object stationary?

所以我有一个关于分配给我的 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);



}

与其将动画逻辑放入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++;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM