Domanda

Qualche tempo fa, ho preso una copia della quinta edizione OpenGL SuperBible e lentamente e dolorosamente iniziato a insegnare me stesso OpenGL 3.3 il modo, dopo essere stato utilizzato per il modo in cui 1,0 da scuola via del ritorno quando. Rendere le cose più impegnative, sono in primo luogo uno sviluppatore .NET, quindi stavo lavorando in Mono con l'involucro OpenTK OpenGL. Sul mio portatile, ho messo insieme un programma che permette all'utente di passeggiata intorno un paesaggio semplice utilizzando un paio di shader che ha implementato per vertice la colorazione e l'illuminazione e texture mapping. Tutto stava funzionando brillantemente fino a quando mi sono imbattuto lo stesso programma sul mio desktop.

Disaster! Niente renderebbe! Ho tagliato il mio programma fino al punto in cui la telecamera si trova vicino all'origine, indicando a l'origine, e rende una piazza (tecnicamente, un ventilatore triangolo). Il quad rende perfettamente sul mio portatile, la colorazione, illuminazione, texturing e tutti, ma rende il desktop di un piccolo quadrilatero non quadrati distorta che è colorato in modo non corretto, non influenzato dalle luci, e non strutturato.

ho il sospetto la scheda grafica è in colpa, perché ho lo stesso risultato se sto avvio in Ubuntu 10.10 o Win XP. Ho trovato che se io Pare il vertex shader verso il basso per l'output solo i dati di posizione e lo shader frammento SOLO output di un colore solido (bianco) il quad rende correttamente. Ma appena comincio passando dati di colore (anche se non lo uso nello shader frammento) l'uscita dal vertex è distorto nuovamente. Gli shader seguono. Ho lasciato il codice pre-esistente, ma commentata in modo da poter avere un'idea di ciò che stavo cercando di fare. Sono un noob a GLSL modo che il codice probabilmente potrebbe essere molto meglio.

Il mio portatile è un vecchio Lenovo T61p con un Centrino (Core 2) Duo e una scheda grafica nVidia Quadro con Ubuntu 10.10 Il mio desktop ha un i7 con una Radeon HD 4850 x2 (scheda singola, doppia GPU) da Saphire dual boot in Ubuntu 10.10 e Windows XP. Il problema si verifica sia in XP e Ubuntu.

Qualcuno può vedere qualcosa di sbagliato che mi manca? Che cosa è "speciale" per il mio HD 4850x2?

string vertexShaderSource = @"
#version 330

precision highp float;

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
//uniform mat4 normal_matrix;
//uniform mat4 cmv_matrix;  //Camera modelview.  Light sources are transformed by this matrix.
//uniform vec3 ambient_color;
//uniform vec3 diffuse_color;
//uniform vec3 diffuse_direction;

in vec4 in_position;
in vec4 in_color;
//in vec3 in_normal;
//in vec3 in_tex_coords;

out vec4 varyingColor;
//out vec3 varyingTexCoords; 

void main(void)
{
  //Get surface normal in eye coordinates
  //vec4 vEyeNormal = normal_matrix * vec4(in_normal, 0);

  //Get vertex position in eye coordinates
  //vec4 vPosition4 = modelview_matrix * vec4(in_position, 0);
  //vec3 vPosition3 = vPosition4.xyz / vPosition4.w;

  //Get vector to light source in eye coordinates
  //vec3 lightVecNormalized = normalize(diffuse_direction);
  //vec3 vLightDir = normalize((cmv_matrix * vec4(lightVecNormalized, 0)).xyz);

  //Dot product gives us diffuse intensity
  //float diff = max(0.0, dot(vEyeNormal.xyz, vLightDir.xyz));

  //Multiply intensity by diffuse color, force alpha to 1.0
  //varyingColor.xyz = in_color * diff * diffuse_color.xyz;
  varyingColor = in_color;

  //varyingTexCoords = in_tex_coords;
  gl_Position = projection_matrix * modelview_matrix * in_position;
}";

        string fragmentShaderSource = @"
#version 330
//#extension GL_EXT_gpu_shader4 : enable

precision highp float;

//uniform sampler2DArray colorMap;

//in vec4 varyingColor;
//in vec3 varyingTexCoords;

out vec4 out_frag_color;

void main(void)
{
  out_frag_color = vec4(1,1,1,1);
  //out_frag_color = varyingColor;
  //out_frag_color = vec4(varyingColor, 1) * texture(colorMap, varyingTexCoords.st);
  //out_frag_color = vec4(varyingColor, 1) * texture(colorMap, vec3(varyingTexCoords.st, 0));
  //out_frag_color = vec4(varyingColor, 1) * texture2DArray(colorMap, varyingTexCoords);
}";

Si noti che in questo codice i dati del colore è accettato, ma non effettivamente utilizzato. La geometria viene emesso lo stesso (sbagliato) se lo shader frammento utilizza varyingColor o meno. Solo se io commento la linea di varyingColor = in_color; fa correttamente l'uscita geometria. In origine gli shader hanno preso in vec3 ingressi, solo ho modificato loro di prendere vec4s mentre la risoluzione dei problemi.

È stato utile?

Soluzione

Si scopre driver nVidia lasciano ingressi nell'ordine in cui sono elencati in lui shader, mentre i conducenti AMD sorta in ordine alfabetico. Ho dovuto usare GetAttribLocation per ottenere le posizioni.

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