2014-06-17 58 views
2

我試圖與在頂點着色器的旋轉,這是我的着色器的代碼:OpenGL的旋轉與頂點不工作

"#version 150 core\n" 
"in vec2 position;" 
"in vec3 color;" 
"out vec3 Color;" 
"uniform mat4 rotation;" 
"void main() {" 
" Color = color;" 
" gl_Position = rotation*vec4(position, 0.0, 2.0);" 
"}"; 

我使用它在四元,這裏是生產代碼矩陣的計算方法,並在着色器爲之傾倒:

glm::quat rotation(x,0.0,0.0,0.5); 
x+=0.001; 
ctm = glm::mat4_cast(rotation); 
    GLint matrix_loc; 

// get from shader pointer to global data 
    matrix_loc = glGetUniformLocation(shaderProgram, "rotation"); 
    if (matrix_loc == -1) 
     std::cout << "pointer for rotation of shader not found" << matrix_loc << std::endl; 
// put local data in shader : 
    glUniformMatrix4fv(matrix_loc, 1, GL_FALSE, glm::value_ptr(ctm)); 

但是,當它旋轉時,物體變得越來越大,我知道我不需要GetUniformLocation每次我在我的循環迭代的時間,但是這是一個代碼測試。據我所知,GlUniformMatrix應該使旋轉發生。在這些調用之後,我只需繪製我的頂點數組。

+0

'旋轉四元體如何使它成爲'ctm'? – genpfault

+0

呵呵,嘿,上帝,我想我只是忘了做鏈接,我是專注於我的代碼,我沒有注意到它,我明天會試試看,我會讓你知道。 – aze

+0

它似乎在工作,但我的對象正在旋轉和變大,我已經將四元數變成(x,0,0,1),認爲它會圍繞一個斧頭旋轉,但它仍然變得越來越大,旋轉。對此有何想法? – aze

回答

1

鑑於它仍然繪製,着色器中的rotation可能是一個有效的矩陣。如果這是制服的問題,它可能全部爲零,沒有任何東西可以畫出來。

由於@genpfault說,CTM需要進行初始化:

ctm = glm::mat4_cast(rotation); 

參見:Converting glm quaternion to rotation matrix and using it with opengl

而且,不應該在vec4(position, 0.0, 2.0)2.01.0

+0

關於1.0,它並不重要,是嗎?這只是一個問題,從參考權利中可以得出多遠?我想我只是爲了看看我的程序如何受到影響而改爲1.0,無論如何它可能會在開發後期計算。 – aze

+0

你是對的,實際上這個參數是用於裁剪的,默認情況下設置爲1.0,但我不知道它實際發生了什麼變化,我想我會在開發中進一步回答。 – aze

+0

@ user3714670您所說的最明顯的變化是縮放矩陣的平移。它也會影響內部透視分割('.xyz/.w'),但在此之前'gl_Position'期望插值和剔除的非標準化頂點。關於擴展問題,我認爲這是由於非標準化的四元數。構造函數不是角度/軸。你想['angleAxis'](http://glm.g-truc.net/0.9.0/api/a00184.html#a4412b01c376d9cfc9cc06b2d511d0f16)。 – jozxyqk