2016-10-04 102 views
-1

所以我有一個關於我被分配給我的OpenGL類的家庭作業的快速問題。在課堂上,我們做了兩個三角形隨着正弦波變換(變得越來越小),我們的作業就是讓其中一個變換而另一個保持靜態,同時只使用一個頂點着色器,一個片段着色器,統一變量。當我嘗試它時,我的心態是以某種方式將1的值返回到Scale變量以防止其中一個三角形移動。我能夠做到這樣,其中一個三角形是靜止的,但沒有着色器,所以它是純白色的。我有一種感覺,我必須使用一些OOP來創建另一個三角形實例,但我實際上無法圍繞我如何區分這兩個三角形而僅使用一個頂點着色器。任何人都可以對此有所瞭解嗎?這是課程中最難的課程,所以即使提示也會很可愛!謝謝!如果你們都想要,我可以發佈我的代碼,但是我對它做了一些修改,這讓我的程序哭了起來,所以我會盡量追溯我的步驟,並且明天發佈!謝謝你們!(OpenGL)如何在保持相同對象靜止的同時轉換對象?

[編輯]好的,這是我的代碼。試圖讓它只有紅色三角形是靜態的。我有一種感覺,答案是以「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); 



} 
+1

你單獨繪製三角形?你有一個或兩個繪畫命令嗎? – vesan

+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++; 
} 
+0

因此,不僅正弦波與三角形建立在相同的類中,而且我們的教授給了我們一些代碼來處理它,並且他使用迭代器繪製三角形。它看起來有點像這樣:void display() { \t glClear(GL_COLOR_BUFFER_BIT); \t爲(矢量:迭代它= triangles.begin();!它= triangles.end(); ++它){ \t \t它 - >繪製(); \t} \t glutSwapBuffers(); }我怎麼做你說的,但通過迭代器,因爲我不熟悉它們。謝謝! – Aidan