6
votes

0 (3): Erreur C1013: Fonction "Main" est déjà définie à 0 (4)

J'ai un peu et je ne peux pas comprendre ce qui ne va pas. Mon shader: xxx

Ce shader je connais fonctionne, mais quand j'essaie de lier le programme, je reçois: xxx

J'ai vérifié Pour vous assurer que les viles se mettent en mémoire correctement et que ce n'est pas le cas. Ils compilent juste bien. C'est l'étape de liaison que quelque chose ne va pas. Je suis désemparé de quoi et j'ai frappé ma tête à ce sujet pendant un certain temps. Tous les conseils?

EDIT:

Voici le code que j'utilise pour créer le shader. Il obtient tout le chemin du conditionnel, il complète en fait l'exécution entièrement, mais le journal imprime ce que vous avez vu ci-dessus. xxx


6 commentaires

void principal () n'est pas valide C ++ et un style médiocre dans C.


@Kerreksb: Je suppose que c'est une bonne chose que ce n'est ni C ++ ni C code C.


Pouvez-vous montrer votre code de chargement de shader? Le code que vous utilisez pour charger le shader pour OpenGL afin qu'il puisse la compiler et le lier?


Où est le reste? La partie où vous construisez ces objets de shader?


Ça construit juste bien. J'utilise la création de Shader Création ici: en.wikibooks.org/wiki/opengl_programmer/...


@Narcolapser: Oui, mais comment vas-tu appelez it? Montrez-nous le code que vous utilisez réellement, pas de ce que vous avez copié. Ne pas poster que le code demandé ne va pas nous aider à vous aider. Être capable de suivre comment vs et fs est créé est crucial .


3 Réponses :


0
votes

GLSL n'est pas C ou C ++. Void ne peut pas être utilisé comme seul paramètre, comme dans vide (void) . Ce que vous voulez, c'est void principal () .

L'erreur est certes cryptique cependant.


1 commentaires

Je viens d'essayer, je n'ai pas fonctionné. La chose est ces shaders je doute du problème. Ce sont des shaders travailleurs connus. Je les ai utilisés dans un autre programme, un didacticiel et reconstruisant en fait que l'un et l'utilisation de ces shaders exacts réussit.



23
votes

L'erreur sonne comme si vous essayez peut-être de relier deux copies du shader? Vérifiez le code de création d'objets de shader, de chargement de code et de les relier à l'objet de programme. C'est-à-dire, vérifiez tous les appels à GlCreateShader, Glshadersource, GLCreateProgram et GLATTACHSHADER pour vous assurer qu'ils ont un sens.

Modifier

Vous avez ajouté le code qui appelle GLCreateProgram ci-dessus, mais pas le code qui appelle GLCreathader. Votre erreur est cohérente avec accidentellement (incorrectement) transmission GL_VERTEX_SHADER à GLCREATHADER pour le shader de fragment.


3 commentaires

Non, Nicol Bolas a déjà souligné le problème. La chose est la suivante: le compilateur silencieusement prédeclamé un symbole void principal () , c'est-à-dire la fonction principale que vous écrivez dans un shader est la définition de la fonction, mais ne déclare pas. L'OP a écrit principal d'une manière qui s'afframe avec le symbole prédeclared, mais le compilateur ne dit pas "mauvaise signature", mais crache une erreur qui signifie "symbole a déjà été déclarée, mais avec un type différent".


Choisir ma réponse pour moi datenwolf? : P De toute façon. Le code de chargement a du sens, j'ai utilisé ce didacticiel pour créer Shader et Shader Source: en.wikibooks.org / Wiki / OpenGL_Programmer / ... Je vais ajouter mon programme Crear et relier là-bas.


+1 à votre édition. J'avais ce problème tout en travaillant dans certains tutoriels OpenGL et j'avais fait exactement ce que vous avez dit: gl_vertex_shader au lieu de GL_FRAGENT_SHADER pour le GLCREATHADER .



11
votes

J'ai eu cette erreur aujourd'hui. C'est arrivé parce que je copie / collé trop de code. J'ai appelé GLCREATHADER (GL_VERTEX_SHADER); Pour mon sommet et mon shader de fragment. Ils ont bien compilé, mais ils ne relieraient pas, car ils étaient tous deux des sommets de sommet.


2 commentaires

Merci! J'ai fait exactement la même chose.


Arrive toujours en 2020!