2009-12-27 32 views
6

Tôi khá mới đối với OpenGL và dường như tôi đang gặp một số khó khăn. Tôi đã viết một shader đơn giản trong GLSL, đó là nghĩa vụ phải chuyển đổi đỉnh bằng các ma trận chung cho sẵn, cho phép hoạt hình xương đơn giản. Mỗi đỉnh có tối đa hai ảnh hưởng xương (được lưu trữ như thành phần x và y của Vec2), chỉ số và trọng số tương ứng được liên kết với một mảng ma trận chuyển đổi và được chỉ định là "Biến thuộc tính" trong trình đổ bóng của tôi, sau đó đặt sử dụng chức năng "glVertexAttribPointer".Cocoa và OpenGL, Làm cách nào để đặt thuộc tính đỉnh GLSL bằng mảng?

Đây là nơi phát sinh sự cố ... Tôi đã đặt đúng ma trận ma trận "Đồng bộ", khi tôi kiểm tra các giá trị đó trong trình đổ bóng, tất cả các giá trị được nhập chính xác và chúng chứa dữ liệu chính xác. Tuy nhiên, khi tôi cố gắng thiết lập biến Indices chung, các đỉnh được nhân với ma trận chuyển đổi tùy ý! Chúng nhảy đến các vị trí dường như ngẫu nhiên trong không gian (mỗi lần khác nhau) từ điều này, tôi giả định rằng các chỉ số được đặt không đúng và trình đổ bóng của tôi đang đọc qua phần cuối của mảng ma trận chung vào bộ nhớ sau. Tôi không chắc chắn lý do tại sao, bởi vì khi đọc tất cả các thông tin tôi có thể tìm thấy về chủ đề này, tôi đã ngạc nhiên khi thấy cùng một mã (nếu không phải là rất giống nhau) trong ví dụ của họ, và nó dường như làm việc cho họ.

Tôi đã cố gắng giải quyết vấn đề này trong một thời gian và thực sự bắt đầu lo lắng ... Tôi biết rằng ma trận là chính xác và khi tôi thay đổi giá trị chỉ mục trong trình đổ bóng thành tùy ý số nguyên, nó đọc giá trị ma trận chính xác và hoạt động theo cách cần, chuyển đổi tất cả các đỉnh của ma trận đó, nhưng khi tôi thử và sử dụng mã tôi đã viết để đặt biến thuộc tính, nó dường như không hoạt động.

Mã Tôi đang sử dụng để thiết lập các biến như sau ...

// this works properly... 
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices"); 
glUniformMatrix4fv(boneMatLoc, matCount, GL_TRUE, currentBoneMatrices); 

GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; 

// this however, does not... 
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices"); 
glEnableVertexAttribArray(boneIndexLoc); 
glVertexAttribPointer(boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices); 

Và vertex shader của tôi trông như thế này ...

// this shader is supposed to transform the bones by a skeleton, a maximum of two 
// bones per vertex with varying weights... 

uniform mat4 boneMatrices[32]; // matrices for the bones 
attribute vec2 boneIndices; // x for the first bone, y for the second 

//attribute vec2 boneWeight; // the blend weights between the two bones 

void main(void) 
{ 
gl_TexCoord[0] = gl_MultiTexCoord0; // just set up the texture coordinates... 


vec4 vertexPos1 = 1.0 * boneMatrices[ int(boneIndex.x) ] * gl_Vertex; 
//vec4 vertexPos2 = 0.5 * boneMatrices[ int(boneIndex.y) ] * gl_Vertex; 

gl_Position = gl_ModelViewProjectionMatrix * (vertexPos1); 
} 

này được thực sự bắt đầu làm thất bại tôi và mọi trợ giúp sẽ được đánh giá cao,

-Andrew Gotow

Trả lời

2

Ok, tôi đã figu đỏ nó ra. OpenGL vẽ hình tam giác với hàm drawArrays bằng cách đọc mỗi 9 giá trị dưới dạng tam giác (3 đỉnh với 3 thành phần). Bởi vì điều này, đỉnh được repepated giữa tam giác, vì vậy nếu hai hình tam giác liền kề chia sẻ một đỉnh nó đi lên hai lần trong mảng. Vì vậy, khối lập phương của tôi mà tôi nghĩ ban đầu có 8 đỉnh, thực sự có 36 điểm!

sáu cạnh, hai hình tam giác một cạnh, ba đỉnh trên mỗi tam giác, tất cả nhân với tổng số 36 đỉnh độc lập thay vì 8 đỉnh được chia sẻ.

Toàn bộ sự cố là một vấn đề với chỉ định quá ít giá trị. Ngay sau khi tôi mở rộng mảng thử nghiệm của mình để bao gồm 36 giá trị, nó hoạt động hoàn hảo.

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