Не удается отправить преобразование в вершинный шейдер - PullRequest
0 голосов
/ 12 октября 2018

Я делаю первые шаги с OpenGL и в настоящее время не могу отправить некоторые преобразования в мой вершинный шейдер.Когда я использую следующую программу шейдера, все работает нормально, и я вижу свой объект (простой треугольник):

layout (location = 0) in vec3 aPos;
void main()
{
   gl_Position = vec4(aPos, 1.0);
}

На следующем шаге я изменил программу шейдера, чтобы принимать преобразования извне:

layout (location = 0) in vec3 aPos;
uniform mat4 inputTransform;
void main()
{
   gl_Position = inputTransform * vec4(aPos, 1.0);
}

... и мой основной цикл для отправки данных преобразования в шейдер:

unsigned int transformLoc = glGetUniformLocation(shaderProgram,"inputTransform");
glUseProgram(shaderProgram);
GLfloat trans[4] = {1.0, 0.0, 0.0, 1.0};
glUniformMatrix4fv(transformLoc, 1, GL_FALSE,trans);

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

Итак, есть идеи, что здесь может быть не так?

1 Ответ

0 голосов
/ 12 октября 2018

Униформа mat4 inputTransform представляет собой матрицу 4 * 4, а не вектор с 4 компонентами.
См. Тип данных (GLSL) - Матрицы

Вы должны инициализировать еес массивом из 16 чисел с плавающей запятой, например, Матрица идентификации :

GLfloat trans[16] = {
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 1.0
};
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, trans);

Матрица содержит перевод, ориентацию (и масштаб).В GLSL mat4 может быть инициализирован:

mat4 m44 = mat4(
    vec4( Xx, Xy, Xz, 0.0),
    vec4( Yx, Xy, Yz, 0.0),
    vec4( Zx  Zy  Zz, 0.0),
    vec4( Tx, Ty, Tz, 1.0) ); 

Это означает, что если вы хотите инициализировать матрицу с вектором перевода, то вы можете сделать это вручную, инициализируя компонент перевода матрицы:

Glfloat Tx = 1.0;
Glfloat Ty = 0.0;
Glfloat Tz = 0.0;

GLfloat trans[16] = {
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    Tx,  Ty,  Tz,  1.0
};

В C ++ я рекомендую использовать библиотеку GLM для матричных и векторных операций, связанных с OpenGL и GLSL.

...