Frage

Vor einiger Zeit nahm ich eine Kopie der OpenGL SuperBible fünften Auflage und langsam und schmerzlich begann Lehre ich OpenGL die 3.3 Art und Weise, nach, wenn sie von der Schule Weg zurück zum 1.0 Art und Weise verwendet wurde. Die Dinge mehr herausfordernd, ich bin in erster Linie ein .NET-Entwickler, so dass ich in Mono mit dem OpenTK OpenGL-Wrapper arbeitet. Auf meinem Laptop habe ich zusammen ein Programm, das den Benutzer zu Fuß um eine einfache Landschaft mit ein paar Shadern, dass pro-Vertex implementiert ließ Farbgebung und Beleuchtung und Textur-Mapping. Alles funktioniert hervorragend, bis ich das gleiche Programm auf meinem Desktop lief.

Katastrophe! Nichts machen würde! Ich habe mein Programm gehackt bis zu dem Punkt, wo die Kamera nahe dem Ursprung sitzt, zeigt in Ursprung, und mache ein Quadrat (technisch, ein Dreieck Lüfter). Die Quad macht perfekt auf meinem Laptop, Färbung, Beleuchtung, Texturierung und alles, aber der Desktop macht ein kleines verzerrte nicht quadratisches Viereck, das falsch gefärbt ist, nicht durch die Lichter betroffen, und nicht texturiert.

Ich vermute, dass die Grafikkarte fehlerhaft ist, weil ich das gleiche Ergebnis, ob ich in Ubuntu 10.10 oder Win XP gebootet bin. Ich fand, dass, wenn ich die Vertex-Shader abspecken, um nur die Positionsdaten ausgeben, und die Fragment-Shader nur eine Farbe ausgibt (weiß) das Quad richtig macht. Aber sobald ich in Farbdaten beginnen vorbei (ob ich es im Fragment-Shader verwenden), um die Ausgabe von dem Vertex-Shader wieder verzerrt. Die Shadern folgen. Ich verließ den bereits vorhandenen Code in, aber kommentiert, so dass Sie eine Idee bekommen, was ich zu tun versuchte. Ich bin ein Noob in GLSL so könnte der Code wahrscheinlich viel besser sein.

Mein Laptop ist ein altes lenovo T61p mit einem Centrino (Core 2) Duo und eine nVidia Quadro-Grafikkarte läuft Ubuntu 10.10 Mein Desktop hat einen i7 mit einer Radeon HD 4850 X2 (einzelne Karte, Dual-GPU) von Saphire Dual-Boot in Ubuntu 10.10 und Windows XP. Das Problem tritt sowohl in XP und Ubuntu.

Kann jemand etwas sehen falsch, dass ich fehle? Was ist "special" über meine 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);
}";

Beachten Sie, dass in diesem Code die Farbdaten akzeptiert, aber nicht tatsächlich verwendet wird. Die Geometrie ist das gleiche (falsch) ausgegeben, ob die Fragment-Shader verwendet varyingColor oder nicht. Nur wenn ich die Linie varyingColor = in_color; kommentieren Sie hat die Geometrie korrekt ausgegeben. Ursprünglich waren die Shadern in vec3 Eingänge nahm ich sie nur geändert vec4s bei der Fehlersuche zu nehmen.

War es hilfreich?

Lösung

Es stellt sich heraus nVidia Treiber-Eingänge in der Reihenfolge verlassen sie in er Shadern aufgeführt sind, während AMD-Treiber sortieren sie alphabetisch. Ich hätte GetAttribLocation verwendet, um die Standorte zu bekommen.

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