Problema di ombreggiatura GLSL: perché la mia sfera in scala di grigi è anziché in rosso? (vedi codice)

StackOverflow https://stackoverflow.com/questions/4930940

Domanda

Sto lavorando a un programma GLSL shader a livello principiante. Sto seguendo questo Tutorial. Ma la mia sfera appare sempre in scala di grigio e non di rosso colorato come mi aspettavo.

Vertex Shader:

varying vec3 normal, lightDir;

void main() {

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    normal = gl_NormalMatrix * gl_Normal;

    vec4 vertex_in_modelview_space = gl_ModelViewMatrx * gl_Vertex;

    lightDir = vec3(gl_LightSource[0].position – vertex_in_modelview_space);

}

Fram shader:

varying vec3 normal, lightDir;

void main()
{

    const vec4 AmbientColor = vec4(0.1, 0.0, 0.0, 1.0);
    const vec4 DiffuseColor = vec4(1.0, 0.0, 0.0, 1.0);

    vec3 normalized_normal = normalize(normal);
    vec3 normalized_lightDir = normalize(lightDir);

    float DiffuseTerm = clamp(dot(normal, lightDir), 0.0, 1.0);
    gl_FragColor = AmbientColor + DiffuseColor * DiffuseTerm;
}

Il codice è solo copia e incolla il tutorial.

Dal fram shader, il colore diffuso è rosso, ma la mia sfera è in scala di grigio. So che gli shader vengono caricati correttamente perché se estraggo il codice nello shader Frag e utilizzo quanto segue:

GL_FRAGCOLOR = VEC4 (0,0,1,0,0,0,1,0);

Quindi la mia sfera è verde solido come previsto. Non so se sia qualcosa nel codice OpenGL (come, renderer.cpp) che sta causando un conflitto o se c'è qualcos'altro che non va.

Questa è la mia prima volta a codifica in GLSL, e sono abbastanza confuso su ciò che ho bisogno di GL_ENABLE per accendere/spegnere per far funzionare correttamente lo shader.

Grazie per qualsiasi feedback!

MODIFICARE:Ok, se chiamo Glcolor3f prima di rendering, posso ottenere il colore giusto. Ma il colore della luce non provoca direttamente un cambio di colore nella sfera? Sono preoccupato di non chiamarmi davvero le funzioni nello shader ...

EDIT2:Quindi si scopre che ogni volta che metto qualsiasi codice nello shader vertice o nello shader fram (diverso da gl_color = ...), il colore solido che ottengo scompare ... Immagino che questo significhi che c'è qualcosa di orribilmente sbagliato con i miei shader?

EDIT3:Ecco il codice per impostare il mio shader (fornito dal mio TA):

char *vs = NULL,*fs = NULL;

v = glCreateShader(GL_VERTEX_SHADER);

f = glCreateShader(GL_FRAGMENT_SHADER);

vs = textFileRead(vert);
fs = textFileRead(frag);

const char * ff = fs;
const char * vv = vs;

glShaderSource(v, 1, &vv,NULL);
glShaderSource(f, 1, &ff,NULL);

free(vs);
free(fs);

glCompileShader(v);
glCompileShader(f);

p = glCreateProgram();
glAttachShader(p,f);
glAttachShader(p,v);

glLinkProgram(p);

int infologLength = 0;
int charsWritten  = 0;
char *infoLog;

glGetProgramiv(p, GL_INFO_LOG_LENGTH,&infologLength);
if (infologLength > 0)
{
    infoLog = (char *)malloc(infologLength);
    glGetProgramInfoLog(p, infologLength, &charsWritten, infoLog);
    printf("%s\n",infoLog);
    free(infoLog);
}

EDIT4:Usando i registri shader come suggerito da Kvark, sono riuscito a correggere gli insetti negli shader (si scopre che c'erano un paio di errori). Se desideri vedere il codice finale, lascia un commento o inviami un messaggio (questa domanda sta diventando lunga).

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top