Incapable de lien compilé les shaders (GLSL)
J'ai une petite classe qui me permet de charger les shaders et les utiliser dans mon programme. Je suis en mesure de compiler les shaders, mais quand il est temps de faire le lien entre eux, ils ne veulent tout simplement pas. À l'aide de glGetProgramInfoLog j'ai obtenu l'erreur suivante du journal. Je ne comprends pas pourquoi il me dit qu'il n'y a pas de programme défini depuis la compilation a bien fonctionné...
Vertex info
-----------
(0) : error C3001: no program defined
Fragment info
-------------
(0) : error C3001: no program defined
Le code ci-dessous ne le GLSL liens:
program_ = glCreateProgramObjectARB();
if (vertex_) {
glAttachObjectARB(program_, vertex_);
}
if (fragment_) {
glAttachObjectARB(program_, fragment_);
}
glLinkProgramARB(program_);
vertex_ et fragment_ sont les vertex et fragment shader, et program_ est le ProgramObjectARB.
Je voudrais savoir quelles sont les adaptations nécessaires, j'ai besoin de faire afin de faire de cette course.
Vertex shader:
varying vec4 OCPosition; //surface positon in world's coordinates
varying vec4 ECposition; //surface position in eye coordinates
varying vec4 ECballCenter; //ball center in eye coordinates
uniform vec4 BallCenter; //ball center in modelling coordinates
void main()
{
OCPosition = gl_Vertex;
ECposition = gl_ModelViewMatrix * OCPosition;
ECballCenter = gl_ModelViewMatrix * BallCenter;
gl_Position = gl_ProjectionMatrix * ECposition;
}
Fragment shader:
varying vec4 OCPosition; //surface position in world coordinates
varying vec4 ECposition; //surface position in eye coordinates
varying vec4 ECballCenter; //ball center in eye coordinates
uniform vec4 LightDir; //light direction, should be normalized
uniform vec4 HVector; //reflection vector for infinite light source
uniform vec4 SpecularColor;
uniform vec4 BaseColor, StripeColor;
uniform float StripeWidth; //= 0.3
uniform float FWidth; //= 0.005
void main()
{
vec3 normal; //Analytically computed normal
vec4 p; //Point in shader space
vec4 surfColor; //Computed color of the surface
float intensity; //Computed light intensity
vec4 distance; //Computed distance values
float inorout; //Counter for computing star pattern
p.xyz = normalize(OCPosition.xyz); //Calculate p
p.w = 1.0;
distance.y = StripeWidth - abs(p.z);
distance.xy = smoothstep(-FWidth, FWidth, distance.xy);
surfColor = mix(BaseColor, StripeColor, distance.y);
//normal = point on surface for sphere at (0,0,0)
normal = normalize(ECposition.xyz - ECballCenter.xyz);
//Per fragment diffuse lighting
intensity = 0.2; //ambient
intensity += 0.8 * clamp(dot(LightDir.xyz, normal), 0.0, 1.0);
surfColor *= intensity;
//Per fragment specular lighting
intensity = clamp(dot(HVector.xyz, normal), 0.0, 1.0);
intensity = pow(intensity, SpecularColor.a);
surfColor += SpecularColor * intensity;
gl_FragColor = surfColor;
}
EDIT - SOLUTION
Il semble que la méthode que j'ai utilisé pour lire le fichier source est incorrecte. Le shader de dresser, mais à la liaison, il ne fonctionnait pas correctement. Maintenant, j'utilise cette méthode pour lire mon fichier et le lien est correct:
char *textFileRead(char *fn) {
FILE *fp;
char *content = NULL;
int count=0;
if (fn != NULL) {
fp = fopen(fn,"rt");
if (fp != NULL) {
fseek(fp, 0, SEEK_END);
count = ftell(fp);
rewind(fp);
if (count > 0) {
content = (char *)malloc(sizeof(char) * (count+1));
count = fread(content,sizeof(char),count,fp);
content[count] = 'char *textFileRead(char *fn) {
FILE *fp;
char *content = NULL;
int count=0;
if (fn != NULL) {
fp = fopen(fn,"rt");
if (fp != NULL) {
fseek(fp, 0, SEEK_END);
count = ftell(fp);
rewind(fp);
if (count > 0) {
content = (char *)malloc(sizeof(char) * (count+1));
count = fread(content,sizeof(char),count,fp);
content[count] = '\0';
}
fclose(fp);
}
}
return content;
}
';
}
fclose(fp);
}
}
return content;
}
OriginalL'auteur tomzx | 2009-12-21
Vous devez vous connecter pour publier un commentaire.
Que le code d'erreur spécifique à partir de la GLSL compilateur dans le pilote Nvidia signifie qu'il ne trouve pas une fonction appelée "main" dans votre shader (vertex ou fragment dans ce cas)
La raison la plus commune est que vous n'êtes pas vraiment faire le programme pour le conducteur quand vous pensez que vous êtes, la chaîne vous êtes de passage n'a pas été initialisé, ou vous êtes de passage dans une longueur de 0, et vous n'êtes pas en train de compiler quoi que ce soit.
Modifier
Ma meilleure supposition est qu'il y a quelque chose de subtilement de mal avec le glCreateShader ou glSetShaderSource appels. La plupart du temps, les erreurs ne s'affiche lorsque vous essayez de lier les shaders (plutôt que de compiler), comme c'est la première fois que le pilote sait que c'est complet shaders et pas seulement partielle, incomplète shaders qui ont besoin d'un autre shader lié à être complet.
OriginalL'auteur Chris Dodd
Vos shaders beau travail pour moi, j'ai fait un petit programme de test pour le compiler, et ai pas de problèmes:
Faites-vous la même chose?
Pouvez-vous montrer comment vous appelez
glShaderSourceARB
? Quel type de carte graphique avez-vous et quel pilote?glShaderSourceARB(fragment_shader, 1, (const GLcharARB**)&cstr, 0); cstr est un pointeur vers un char allouée dynamiquement (char* cstr = new char[]). J'ai une nVidia GeForce 8800GT, les conducteurs sont par défaut, la version 191.07.
Je suppose qu'il y a quelque chose de subtilement de mal avec les données dans
cstr
. Choses à vérifier: 1. Est-il nulle terminée? 2. Est-il un saut de ligne à la fin de la source (ce n'est pas grave, mais parfois, il n'est de toute façon ;)?OriginalL'auteur Andreas Brinck
Essayez d'utiliser glGetError après votre glAttachObjectARB appelle pour voir si ceux-ci sont défaillants.
Vous pouvez aussi essayer: bool fragCompiled, vertCompiled; glGetShaderiv(fragment_, GL_COMPILE_STATUS, &fragCompiled); glGetShaderiv(vertex_, GL_COMPILE_STATUS, &vertCompiled);
J'ai changé votre bool d'un Éclair, et ils ont tous deux de retour de 1, donc ils sont compilés.
Semble que vous pourriez avoir trébuché à un pilote de bug.
OriginalL'auteur tkerwin