0 (3): ошибка C1013: функция «main» уже определена в 0 (4) - PullRequest
5 голосов
/ 22 января 2012

Я немного погуглил и не могу понять, что не так.Мой шейдер:

#version 120

attribute vec2 coord2d;
void main(void) 
{
    gl_Position = vec4(coord2d, 0.0, 1.0);
}

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

glLinkProgram:Vertex info
-----------
0(3) : error C1013: function "main" is already defined at 0(4)

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

Редактировать:

Вот код, который я использую для создания шейдера.он проходит весь путь до условного, фактически завершает выполнение полностью, но журнал выводит на печать то, что вы видели выше.

GLuint updateProg()
{
    prog = glCreateProgram();
    if (vs == 0 || fs == 0) return 0;
    glAttachShader(prog, vs);
    glAttachShader(prog, fs);
    int link_ok;
    glLinkProgram(prog);
    glGetProgramiv(prog, GL_LINK_STATUS, &link_ok);
    if (!link_ok) 
    {
        fprintf(stderr, "glLinkProgram:");
        print_log(prog);
        return 0;
    }
    return prog;
}

Ответы [ 3 ]

19 голосов
/ 22 января 2012

Ошибка звучит так, как будто вы пытаетесь связать две копии шейдера? Проверьте код для создания шейдерных объектов, загрузки кода в них и связывания их с программным объектом. То есть, дважды проверьте все вызовы glCreateShader, glShaderSource, glCreateProgram и glAttachShader, чтобы убедиться, что они имеют смысл.

редактировать

Вы добавили код, который вызывает glCreateProgram выше, но не код, который вызывает glCreateShader. Ваша ошибка соответствует случайной (неправильной) передаче GL_VERTEX_SHADER в glCreateShader для фрагментного шейдера.

4 голосов
/ 07 марта 2016

У меня была эта ошибка сегодня.Это произошло потому, что я скопировал / вставил слишком много кода.Я вызвал glCreateShader (GL_VERTEX_SHADER);для моего вершинного и фрагментного шейдеров.Они скомпилированы просто отлично, но они не будут связываться, потому что они оба были вершинными шейдерами.

1 голос
/ 22 января 2012

GLSL не является C или C ++.void нельзя использовать в качестве единственного параметра, как в void main(void).То, что вы хотите, это void main().

Ошибка, по общему признанию, загадочная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...