2012-01-26 25 views
5

Tôi đã đọc một vài hướng dẫn cơ bản về trình đổ bóng. Cho đến nay họ đã trình bày cách thiết lập các biến trong trình đổ bóng của bạn. Nhưng điều này chỉ là về ints, float hoặc vectơ. Tôi không thể tìm thấy bất cứ điều gì về làm thế nào để thiết lập một biến mat4. Trình đổ bóng của tôi hy vọng như sau:Đặt mat4 trong OpenGL

uniform vec3 CameraPos; 
uniform mat4 ModelWorld4x4; 

Vị trí máy ảnh và ma trận thế giới của mô hình. Tôi nghĩ rằng tôi có quyền CameraPos, nhưng làm thế nào trên trái đất để tôi thiết lập các biến ModelWorld4x4 ??


Đây là cách tôi đặt vector3

campos = glGetUniformLocation(shader.id(), "CameraPos"); 
glUniform3f(campos, 0.0f, 0.0f, 3.0f); 

Đây là (một trong những phương pháp) làm thế nào tôi đã cố gắng để thiết lập các mat4

glGetFloatv(GL_MODELVIEW_MATRIX, modelworld); 
modelw = glGetUniformLocation(shader.id(), "ModelWorld4x4"); 
glUniformMatrix4fv(g_modelworld4x4, modelworld); // Not working 

Tôi đang sử dụng thư viện Assimp để tải một mô hình, vì vậy hiện tại ma trận thế giới được lưu trữ trong cấu trúc aiMatrix4x4.

// world matrix of the model 
aiMatrix4x4 m = nd->mTransformation; 

// Save in a global variable 
g_modelworld4x4 = m; 

Trả lời

10

Đảm bảo rằng bạn đang sử dụng ModelWorld4x4 trong trình đổ bóng của mình để nó không đơn giản được biên dịch. Giả sử g_modelworld4x4 là một * float, công trình này cho tôi:

int location = glGetUniformLocationARB(program, "ModelWorld4x4"); 
glUniformMatrix4fvARB(location, 1 /*only setting 1 matrix*/, false /*transpose?*/, g_modelworld4x4; 

Bạn có thể cần phải thả các ARB từ tên hàm tùy thuộc vào cách gọi hàm của bạn được khai báo.

5

Bạn không thể gọi glUniformMatrix4fv cách bạn đã viết. Các chức năng được định nghĩa là

void glUniformMatrix4fv( GLint location, 
GLsizei  count, 
GLboolean transpose, 
const GLfloat *  value); 

Trong trường hợp của bạn, bạn phải gọi nó với glUniformMatrix4fv (modelw, 1, GL_FALSE, modelworld) mà nên làm việc (giả sử ma trận được lưu giữ cột lớn trên máy chủ.) Nếu không, vượt qua GL_TRUE để transpose nó trên đồng ruộng bay.

Các vấn đề liên quan