Какао и OpenGL, Как я устанавливаю атрибут вершины GLSL с помощью массива?

Я довольно плохо знаком с OpenGL, и я, кажется, испытываю некоторые трудности. Я записал простую программу построения теней в GLSL, который, как предполагается, преобразовывает вершины данными совместными матрицами, позволяя простую скелетную анимацию. Каждая вершина имеет максимум двух влияний кости (сохраненный как компоненты X и Y Vec2), индексы и соответствующие веса, которые связаны с массивом матриц преобразования, и указаны как "Переменные атрибута" в моей программе построения теней, затем устанавливает использование функции "glVertexAttribPointer".

Вот то, где проблема возникает... Мне удалось установить "Универсальный Переменный" массив матриц правильно, когда я проверяю те значения в программу построения теней, все они импортируются правильно, и они содержат корректные данные. Однако, когда я пытаюсь установить совместную Индексную переменную, вершины умножаются на произвольные матрицы преобразования! Они переходят к на вид случайным позициям в пространстве (которые отличаются каждый раз) от этого, я предполагаю, что индексы установлены неправильно, и моя программа построения теней читает мимо конца моего совместного матричного массива в следующую память. Я не абсолютно уверен, почему, потому что после чтения всей информации я мог найти на предмете, я был удивлен видеть, что то же (если не очень похожий) кодирует в их примерах, и это, казалось, работало на них.

Я попытался решить эту проблему в течение достаточно долгого времени теперь, и она действительно начинает действовать на мои нервы... Я знаю, что матрицы корректны, и когда я вручную изменяю индексное значение в программе построения теней к произвольному целому числу, это читает корректные матричные значения и работы путем, это должно, преобразовывая все вершины той матрицей, но когда я пытаюсь использовать код, я записал для установки переменных атрибута, это, кажется, не работает.

Код, который я использую для установки переменных, следующие...

// 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 );

И мой вершинный шейдер похож на это...

// 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);
}

Это действительно начинает расстраивать меня, и любой и вся справка будут цениться,

- Andrew Gotow

6
задан Andrew Gotow 27 December 2009 в 20:23
поделиться

1 ответ

Хорошо, я понял. OpenGL рисует треугольники с функцией drawArrays, считывая каждые 9 значений в виде треугольника (3 вершины по 3 компоненты). Из-за этого вершины перечисляются между треугольниками, поэтому если два соседних треугольника делят вершину, то она появляется в массиве дважды. Так что мой куб, который, как я изначально думал, имел 8 вершин, на самом деле имеет 36!

шесть сторон, два треугольника со стороной, по три вершины на треугольник, все умножается в сумме на 36 независимых вершин вместо 8 общих.

Вся проблема заключалась в том, что было указано слишком малое количество значений. Как только я расширил свой тестовый массив до 36 значений, он отлично работал

.
2
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: