Почему glGetUniformLocation не работает? - PullRequest
10 голосов
/ 08 сентября 2011

Я нашел Гвен несколько дней назад и подумал, что это похоже на идеальный инструментарий GUI для моего проекта.Но, дорогой, посмотрите на весь этот код OpenGL 2 в рендере.Поэтому я решил написать рендерер OpenGL 3, чтобы я мог его использовать, но я гораздо лучше знаком с CG, чем с GLSL, и застрял в написании примера.Я думаю, что если я смогу просто установить эти однородные переменные, это должно быть в основном сделано.

Шейдеры компилируются и связываются без проблем.Я сузил его до glGetUniformLocation, возвращая -1 для орфографической матрицы и сэмплера текстуры, но я не знаю, почему именно он это делает.Типичная проблема заключается в том, что если вы на самом деле не используете их, они оптимизируются, но я использовал их обоих.

Если у кого-то есть какие-либо идеи, я весь в ушах.Буду более чем рад опубликовать / связать полную вещь, как только она будет работать должным образом.Это мой первый удар в GLSL, так что я легко мог сделать что-то глупое.Я только что закончил настройку CG для другого проекта, так что я не полностью невежественный.

Код инициализации шейдера вызывается после настройки контекста OpenGL:

void InitializeShaders(void)
{
    g_ShaderProgram = glCreateProgram();
    g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
    g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(g_VertexShader, 1, (const GLchar **)&VertexShaderData, 0);
    glShaderSource(g_FragmentShader, 1, (const GLchar **)&FragmentShaderData, 0);

    glCompileShader(g_VertexShader);
    CheckShaderCompile(g_VertexShader);

    glCompileShader(g_FragmentShader);
    CheckShaderCompile(g_FragmentShader);

    glAttachShader(g_ShaderProgram, g_VertexShader);
    glAttachShader(g_ShaderProgram, g_FragmentShader);

    glBindAttribLocation(g_ShaderProgram, 0, "position");
    glBindAttribLocation(g_ShaderProgram, 1, "color");
    glBindAttribLocation(g_ShaderProgram, 2, "texCoord");

    glBindFragDataLocation(g_ShaderProgram, 0, "color");

    glLinkProgram(g_ShaderProgram);
    CheckShaderLink();

    g_OrthoTransformLocation = glGetUniformLocation(g_ShaderProgram, "orthoTransform");
    g_TextureLocation = glGetUniformLocation(g_ShaderProgram, "textureSampler");
}

Шейдеры хранятся в виде строки в заголовочном файле, но я убрал все новые строки и обратные слэши, чтобы на них не было так больно смотреть.

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

#version 330

in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{
    outPosition = position * orthoTransform;
}

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

#version 330

in vec2 texCoord;
in vec4 color;
out vec4 outColor;
uniform sampler2D textureSampler;
void main(void)
{
    //outColor = texture(textureSampler, texCoord) * color;
    outColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

Ответы [ 2 ]

29 голосов
/ 08 сентября 2011

Проблема действительно проста: ваш вершинный шейдер ничего не делает, поэтому OpenGL оптимизирует его.

Чтобы отобразить треугольник, OpenGL требуется позиция в пространстве клипа для каждой вершины треугольника. Задача вершинного шейдера - обеспечить это. Так как OpenGL не может сказать, какой вывод вершинного шейдера вы планируете занять в позиции в пространстве клипа, OpenGL требует, чтобы вы записали в gl_Position вывод. Это допустимо, поэтому ваш шейдер компилирует и ссылается. Но, как вы обнаружили, рендеринг не выполняется.

3 голосов
/ 08 сентября 2011

Прежде всего, glBindFragDatalocation должен связывать outColor, а не color в этом случае.Во-вторых, вы даете программе шейдера атрибуты vertex , а не атрибуты фрагмента.out s вершинного шейдера должны соответствовать in s фрагментного шейдера.

Причина, по которой расположение textureSampler равно -1, заключается в том, что вы закомментировали код.Причина, по которой местоположение orthoTransform равно -1, заключается в том, что он фактически никогда не используется и не оптимизируется.out outPosition никогда не используется фрагментным шейдером, что, в свою очередь, приводит к оптимизации униформы orthoTransform.

Я думаю, что вы ищете gl_Position.

...