Не могу получить доступ к массиву vec4 в GLSL - PullRequest
0 голосов
/ 16 февраля 2019

Когда я пытаюсь скомпилировать этот код GLSL в OpenGL 4.0, я получаю ошибку 1282

Вершинный шейдер:

#version 330 core
layout(location = 0) in vec2 aPos;

uniform mat4 model[100];
uniform mat4 projection;

out int instanceID;

void main()
{
    instanceID = gl_InstanceID;
    gl_Position = projection * model[gl_InstanceID] * vec4(aPos.x, aPos.y, 0.0, 1.0);
}

Фрагментный шейдер:

#version 330 core

in int instanceID;
out vec4 FragColor;

uniform vec4 color[100];

void main()
{
    FragColor = color[instanceID];
}

Кодявляется обычным созданием ShaderProgram, потому что я получаю ошибку перед рисованием или чем-то подобным, но на всякий случай вот код:

    unsigned int vertex, fragment;

    vertex = glCreateShader(GL_VERTEX_SHADER);
    std::string vShaderCode = ReadEntireTextFile(vertPath);
    const char* c_vShaderCode = vShaderCode.c_str();
    glShaderSource(vertex, 1, &c_vShaderCode, NULL);
    glCompileShader(vertex);


    std::string fShaderCode = ReadEntireTextFile(fragPath);
    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    const char* c_fShaderCode = fShaderCode.c_str();
    glShaderSource(fragment, 1, &c_fShaderCode, NULL);
    glCompileShader(fragment);
    // shader Program
    m_RendererID = glCreateProgram();
    glAttachShader(m_RendererID, vertex);
    glAttachShader(m_RendererID, fragment);

    glLinkProgram(m_RendererID);
    // delete the shaders as they're linked into our program now and no longer necessery
    glDeleteShader(vertex);
    glDeleteShader(fragment);
    glUseProgram(m_RendererID);

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

ОБНОВЛЕНИЕ:

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

Мне удалось точно определить, где произошла ошибка, и это была функция glUseProgram.

Я думаю, что ошибка из-за instanceID, потому что, когда я изменяю:

FragColor = color[instanceID];

до

FragColor = color[0];

программа работает.

ОБНОВЛЕНИЕ (2):

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

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

Спасибо за помощь!

1 Ответ

0 голосов
/ 16 февраля 2019
uniform mat4 model[100];

Это далеко от того, что гарантировано спецификацией.Предел здесь равен GL_MAX_VERTEX_UNIFORM_COMPONENTS, который, согласно спецификации, должен быть не менее 1024. Поскольку mat4 потребляет 16 компонентов, это максимум 64 матрицы.Теперь ваш конкретный лимит может быть выше, но у вас также есть другие формы в вашей программе, например color[100].

(из комментариев):

Он ничего не возвращает дляфрагментные и вершинные шейдеры, а glGetShaderiv(shader, GL_COMPILE_STATUS, &output); возвращает true для обоих шейдеров.

Но это не означает, что программный объект успешно связан.Такие ограничения ресурсов обычно применяются во время компоновки.

Я почти уверен, что программа - это объект, успешно созданный openGL, но я не совсем уверен в других.вы видите, если я изменю основную функцию фрагментного шейдера на FragColor = color[0];, она будет работать, поэтому проблема с instanceID Я думаю.

Этот вывод не следует.Если вы напишите color[0], он оптимизирует ваш массив vec4r[100] до vec4[1], и вы, возможно, получите ваш конкретный предел ниже.

...