Question

Il y a quelque temps, je pris une copie de la cinquième édition OpenGL SuperBible et lentement et péniblement commencé à me enseigner, OpenGL 3.3 la manière, après avoir été utilisé à la manière 1.0 de rebrousserez chemin de l'école quand. Rendre les choses plus difficiles, je suis avant tout un développeur .NET, donc je travaillais en Mono avec l'emballage OpenGL OpenTK. Sur mon ordinateur portable, je mis en place un programme qui laisse la marche de l'utilisateur autour d'un paysage simple en utilisant un couple shaders coloration mis en œuvre par vertex et de l'éclairage et la cartographie de texture. Tout fonctionnait avec brio jusqu'à ce que je courais le même programme sur mon bureau.

Désastre! Rien ne rendre! J'ai coupé mon programme jusqu'au point où la caméra se trouve près de l'origine, pointant à l'origine, et rend un carré (techniquement, un ventilateur de triangle). Le quad rend parfaitement sur mon ordinateur portable, la coloration, l'éclairage, texturage et tout, mais le bureau rend une petite distorsion non quadrilatérale carrée qui est colorée de manière incorrecte, pas affectée par les lumières, et non texturés.

Je soupçonne que la carte graphique est en faute, parce que je reçois le même résultat si je démarrais dans Ubuntu 10.10 ou Win XP. Je ne trouve que si je PARÉ le vertex shader vers le bas pour seulement sortir les données de position et le fragment shader à seulement produire une couleur unie (blanc), le quad rend correctement. Mais dès que je commence à passer dans les données de couleur (si je l'utilise dans le fragment shader) la sortie du vertex shader est déformée à nouveau. Les shaders suivent. Je suis parti le code préexistant, mais elle est commentée afin que vous puissiez avoir une idée de ce que je voulais faire. Je suis un noob à GLSL de sorte que le code pourrait probablement beaucoup mieux.

Mon ordinateur portable est un vieux lenovo T61p avec un Centrino (Core 2) Duo et une carte graphique nVidia Quadro exécutant Ubuntu 10.10 Mon bureau a un Core i7 avec x2 Radeon HD 4850 (une seule carte, double GPU) de double démarrage Saphire dans Ubuntu 10.10 et Windows XP. Le problème se produit dans XP et Ubuntu.

Quelqu'un peut-il voir quelque chose de mal que je suis absent? "Spécial" au sujet de mon 4850x2 HD?

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);
}";

Notez que dans ce code les données de couleur est acceptée, mais pas vraiment utilisé. La géométrie est émis le même (faux) si le fragment shader utilise varyingColor ou non. Seulement si je commente la varyingColor = in_color; ligne fait correctement la sortie de la géométrie. A l'origine les shaders ont pris en vec3 entrées, je les modifia que de prendre vec4s pendant le dépannage.

Était-ce utile?

La solution

Il se trouve pilotes nVidia laissent des entrées dans l'ordre où ils apparaissent dans il Shaders, alors que les pilotes AMD sorte les par ordre alphabétique. Je l'ai utilisé GetAttribLocation pour obtenir les emplacements.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top