2013-05-15 153 views
1

編輯

我已經確定這不是我的矩陣的一個問題,而glGetUniformLocation沒有找到請求的變量投影和視圖矩陣

編輯2

我已經解決了上述的錯誤和單位矩陣現在工作。所以現在我認爲這個錯誤可以追溯到我的矩陣。


我有一些問題讓我的投影和視圖矩陣正確。我已經檢查了幾個例子,並且不知道我哪裏錯了。除非我禁用着色器,否則屏幕上什麼也看不到。

我計算模型矩陣,如下所示:

float aspect = (float)width/std::max(1.0f, (float)height); 
float top = tan(Maths::toRadian(FOV * 0.5f)) * near; 
float bottom = -top; 
float right = top * aspect; 
float left = -right; 

projMatrix.reset(); 
projMatrix(0, 0) = (2.0f * near)/(right - left); 
projMatrix(1, 1) = (2.0f * near)/(top - bottom); 
projMatrix(2, 2) = -(far + near)/(far - near); 
projMatrix(2, 3) = -1.0f; 
projMatrix(3, 2) = (-2.0f * far * near)/(far - near); 
projMatrix(3, 3) = 0.0f; 

我計算像這樣視圖矩陣:

Camera::Camera(const Maths::Vector3& pos) 
    : position(pos), target(0.0f, 0.0f, 0.0f), up(0.0f, 1.0f, 0.0f) { 
    target.normalize(); 
    up.normalize(); 
} 

Maths::Matrix4 Camera::getMatrix() const { 
    Maths::Matrix4 mat; 
    Maths::Vector3 z = position - target; 
    Maths::Vector3 x = Maths::crossProduct(up, z); 
    Maths::Vector3 y = Maths::crossProduct(z, x); 

    z.normalize(); 
    x.normalize(); 

    mat(0, 0) = x.x; mat(0, 1) = y.x; mat(0, 2) = y.z; 
    mat(1, 0) = x.y; mat(1, 1) = y.y; mat(1, 2) = y.z; 
    mat(2, 0) = x.z; mat(1, 2) = y.z; mat(2, 2) = y.z; 

    mat(3, 0) = -Maths::dotProduct(x, position); 
    mat(3, 1) = -Maths::dotProduct(y, position); 
    mat(3, 2) = -Maths::dotProduct(z, position); 

    return mat; 
} 

然後,我將其傳遞到着色器最終像這樣:

glGetUniformLocation(viewMatrix, "view"); 
glGetUniformLocation(projMatrix, "proj"); 

glUniformMatrix4fv(viewMatrix, 1, GL_TRUE, view.asArray()); 
glUniformMatrix4fv(projMatrix, 1, GL_TRUE, proj.asArray()); 

最後我的着色器:

頂點:

#version 330 

layout (location = 0) in vec3 position; 

uniform mat4 view; 
uniform mat4 proj; 

void main() 
{ 
    gl_Position = proj * view * vec4(position, 1.0); 
}; 

片段:

#version 330 

out vec4 gl_FragColor; 

void main() 
{ 
    gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f); 
} 

,並覆蓋所有基地這裏是我計算的點積和叉積方法:

float dotProduct(const Vector3& a, const Vector3& b) { 
    return a.x * b.x + a.y * b.y + a.z * b.z; 
} 

Vector3 crossProduct(const Vector3& a, const Vector3& b) { 
    return Vector3(a.y * b.z - a.z * b.y, 
        a.z * b.x - a.x * b.z, 
        a.x * b.y - a.y * b.z); 
} 
+0

是故意的,你沒有使用GLM庫? –

+0

你實際上是在畫什麼嗎?某種三角形或其他模型?我假設你編輯了這個,但想確定。 –

+1

是的,我繪製了一個三角形,但只有在禁用着色器時纔會顯示。 @ Need4Sleep自從我做了這樣的數學已經有一段時間了,所以我想提醒自己這一切。制定我自己的實施方案迫使我重新學習它。如果我已經瞭解了所有的東西,如果這不是爲了學習,或者我有閱讀文章而沒有在最後獲得「嘿它有用」的小獎勵的紀律,我會使用GLM。 – Lerp

回答

2

賓果!我的觀點矩陣是錯誤的。請注意,我是如何設置的最後一列所有y.z ...

這裏是我的修正觀點矩陣:

Maths::Matrix4 mat; 
Maths::Vector3 z = Maths::normalize(target - position); 
Maths::Vector3 x = Maths::normalize(Maths::crossProduct(z, up)); 
Maths::Vector3 y = Maths::crossProduct(x, z); 

mat(0, 0) = x.x; mat(0, 1) = y.x; mat(0, 2) = -z.x; 
mat(1, 0) = x.y; mat(1, 1) = y.y; mat(1, 2) = -z.y; 
mat(2, 0) = x.z; mat(1, 2) = y.z; mat(2, 2) = -z.z; 

mat(3, 0) = -Maths::dotProduct(x, position); 
mat(3, 1) = -Maths::dotProduct(y, position); 
mat(3, 2) = Maths::dotProduct(z, position); 
+0

很高興你解決它! –

+0

我也是!感謝你的幫助! – Lerp

2

編輯:

看着你的源碼,我注意到了一些東西,你是voxel.draw()函數被稱爲af你可以禁用你的attrib數組,這意味着當你調用函數時,沒有任何東西被髮送到你的着色器。如果我沒有記錯的話,應該是這樣的:

void Engine::draw() { 
    light.enable(); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, triangle); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    //glDisableVertexAttribArray(0); disable attrib array before calling draw? 

    voxel.draw(); 
    glDisableVertexAttribArray(0); //NOW disable it, so your draw function works! 
} 

另注:我知道你不希望使用GLM,但我HIGHLY建議使用它。這裏是你使用glm的全部代碼:

#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 
//projection matrix 
glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
//camera matrix 
glm::mat4 View = glm::lookAt(
    glm::vec3(4,3,3), //camera is at (4,3,3) in world 
    glm::vec3(0,0,0), //look at origin 
    glm::vec3(0,1,0) //head up 
); 
+0

它不使用二維數組,它使用一維數組,它確實將引用返回給第一個元素。這可能是使用一維數組的問題嗎? – Lerp

+1

@lerp儘量不要轉置你的數組,將你的值設置爲GL_FALSE並從那裏重新編譯。 –

+0

不,仍然沒有工作。我嘗試將單位矩陣傳遞給着色器,並且我遇到同樣的問題,因此代碼和着色器之間存在問題。 – Lerp