У меня есть небольшой класс, который позволяет мне загружать шейдеры и использовать их в моей программе. Я умею компилировать шейдеры, но когда приходит время их связывать, они просто не хотят. Используя glGetProgramInfoLog я получил следующий журнал ошибок. Я не понимаю, почему он говорит, что не определено ни одной программы, поскольку компиляция работала нормально ...
Vertex info
-----------
(0) : error C3001: no program defined
Fragment info
-------------
(0) : error C3001: no program defined
Приведенный ниже код выполняет связывание GLSL:
program_ = glCreateProgramObjectARB();
if (vertex_) {
glAttachObjectARB(program_, vertex_);
}
if (fragment_) {
glAttachObjectARB(program_, fragment_);
}
glLinkProgramARB(program_);
vertex_ и фрагмент_ - вершинный и фрагментный шейдер, а program_ - это ProgramObjectARB.
Я бы хотел знать, какие необходимые модификации мне нужно сделать, чтобы запустить этот прогон.
Вершинный шейдер:
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;
}
Фрагмент шейдера:
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;
}
РЕДАКТИРОВАТЬ - РЕШЕНИЕ
Кажется, метод, который я использовал для чтения исходного файла, был неверным. Шейдер будет компилироваться, но при компоновке он работает неправильно. Теперь я использую этот метод для чтения моего файла, и ссылки верны:
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;
}