Frage

Ich habe eine kleine Klasse, die mich zu Last-Shadern ermöglicht und sie in meinem Programm. Ich bin in der Lage, die Shadern zu kompilieren, aber wenn es an der Zeit, sie zu verknüpfen, sie wollen einfach nicht zu. Mit glGetProgramInfoLog bekam ich das folgende Fehlerprotokoll. Ich verstehe nicht, warum es mir sagt, dass es kein Programm definiert, da die Zusammenstellung gut funktioniert ...

Vertex info
-----------
(0) : error C3001: no program defined
Fragment info
-------------
(0) : error C3001: no program defined

Der folgende Code funktioniert die GLSL Verknüpfung:

program_ = glCreateProgramObjectARB();

if (vertex_) {
   glAttachObjectARB(program_, vertex_);
}

if (fragment_) {
   glAttachObjectARB(program_, fragment_);
}

glLinkProgramARB(program_); 

vertex_ und fragment_ sind die Vertex- und Fragment-Shader und program_ ist die ProgramObjectARB.

Ich möchte wissen, was sind die notwendigen Änderungen muss ich tun, um diesen Lauf zu machen.

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 - LÖSUNG Es scheint, die Methode, die ich zu lesen, die Quelldatei nicht korrekt verwendet wurde. Der Shader würde kompilieren, aber zu verknüpfen, wurde es nicht richtig funktioniert. Jetzt benutze ich diese Methode meine Datei zu lesen und die Verknüpfung korrekt ist:

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;
}
War es hilfreich?

Lösung

Der spezifischen Fehlercode aus den GLSL-Compiler in den Nvidia-Treiber, bedeuten, dass es nicht eine Funktion namens ‚main‘ in Ihrem Shader (entweder Vertex oder Fragmente in diesem Fall)

finden konnte,

Der häufigste Grund dafür ist, dass Sie nicht wirklich das Programm in den Fahrer bekommen, wenn Sie denken, Sie sind - entweder die Zeichenfolge, die Sie in sind vorbei wurde nicht initialisiert, oder du bist vorbei in einer Länge von 0, und sind Kompilieren Sie nicht wirklich etwas.

Bearbeiten

Meine beste Vermutung ist, es mit den glCreateShader oder glSetShaderSource Anrufe etwas subtil falsch ist. Ein großer Teil der Zeit, zeigen Fehler nur auf, wenn Sie versuchen, die Shadern zu verknüpfen (statt der Kompilierung), wie das erste Mal ist der Fahrer weiß, dass es komplett Shadern hat und nicht nur teilweise, unvollständig Shadern, die einen anderen Shader müssen verknüpft werden komplett .

Andere Tipps

Ihre Shadern arbeiten gut für mich, ich habe ein kleines Testprogramm, sie zu kompilieren und bekam keine Probleme:

GLuint program = glCreateProgramObjectARB();
assert(program);

GLuint vertex_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
assert(vertex_shader);
glShaderSourceARB(vertex_shader, 1, /*your vertex shader*/, 0);
glCompileShaderARB(vertex_shader);

GLint compile_status;
glGetObjectParameterivARB(vertex_shader, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);
assert(1 == compile_status);

GLuint fragment_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
assert(fragment_shader);
glShaderSourceARB(fragment_shader, 1, /*your fragment shader*/, 0);
glCompileShaderARB(fragment_shader);

glGetObjectParameterivARB(vertex_shader, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);
assert(1 == compile_status);

glAttachObjectARB(program, vertex_shader);
assert(GL_NO_ERROR == glGetError());

glAttachObjectARB(program, fragment_shader);
assert(GL_NO_ERROR == glGetError());

glLinkProgramARB(program);  
assert(GL_NO_ERROR == glGetError());

GLint link_status;
glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &link_status);
assert(1 == link_status);

Machst du das Gleiche?

Versuchen Sie es mit glGetError nach dem glAttachObjectARB ruft, um zu sehen, wenn diese versagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top