OpenGL 3 и Radeon HD 4850x2 - PullRequest
       31

OpenGL 3 и Radeon HD 4850x2

0 голосов
/ 14 января 2011

Некоторое время назад я взял копию пятого издания OpenGL SuperBible и медленно и мучительно начал учить себя OpenGL 3.3, после того, как привык к 1.0 из школы, когда.Делая все более сложным, я в первую очередь разработчик .NET, поэтому я работал в Mono с оболочкой OpenTK OpenGL.На своем ноутбуке я собрал программу, которая позволяет пользователю ходить по простому ландшафту, используя пару шейдеров, которые реализуют раскраску по вершинам, а также освещение и отображение текстур.Все работало блестяще, пока я не запустил ту же программу на своем рабочем столе.

Бедствие!Ничего не сделает!Я сократил свою программу до точки, где камера находится около начала координат, указывая на исходную точку, и визуализирует квадрат (технически, треугольный веер).Квадрат отлично отрисовывает на моем ноутбуке цвета, освещение, текстурирование и все такое, но на рабочем столе отображается небольшой искаженный неквадратный четырехугольник, который окрашен неправильно, не подвержен влиянию света и не текстурирован.

Я подозреваю, что видеокарта виновата, потому что я получаю тот же результат, загружаюсь ли я в Ubuntu 10.10 или Win XP.Я обнаружил, что если я урежу вершинный шейдер до ТОЛЬКО вывода данных о положении, а фрагментного шейдера - ТОЛЬКО для вывода сплошного цвета (белого), то квад рендера будет отображаться правильно.Но как только я начну передавать цветовые данные (независимо от того, использую ли я их в фрагментном шейдере), выходные данные вершинного шейдера снова искажаются.Шейдеры следуют.Я оставил ранее существовавший код, но закомментировал, чтобы вы могли понять, что я пытался сделать.Я новичок в glsl, так что код, вероятно, мог бы быть намного лучше.

Мой ноутбук - это старый lenovo T61p с Centrino (Core 2) Duo и видеокартой nVidia Quadro с Ubuntu 10.10.i7 с Radeon HD 4850 x2 (одиночная карта, двойной графический процессор) от двойной загрузки Saphire в Ubuntu 10.10 и Windows XP.Проблема возникает как в XP, так и в Ubuntu.

Кто-нибудь может увидеть что-то не так, что мне не хватает?Что особенного в моем 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);
}";

Обратите внимание, что в этом коде данные о цвете принимаются, но фактически не используются.Геометрия выводится одинаково (неправильно) независимо от того, использует ли фрагментный шейдер переменный цвет или нет.Только если я закомментирую строку varyingColor = in_color;, геометрия будет выводиться правильно.Первоначально шейдеры принимали входные данные vec3, я только изменил их, чтобы они использовали vec4 при устранении неполадок.

1 Ответ

1 голос
/ 21 января 2011

Оказывается, драйверы nVidia оставляют входные данные в порядке их перечисления в шейдерах, а драйверы AMD сортируют их по алфавиту.Я должен был использовать GetAttribLocation, чтобы получить местоположения.

...