Вопрос

Некоторое время назад я взял копию супербибного пятого издания Opengl и медленно и мучительно начал обучать себя opengl 3,3 способа, после того, как он использовался в 1,0 способ от школы назад, когда. Делая вещи более сложными, я в первую очередь разработчик .NET, поэтому я работал в Mono с Opentk OpenGlber. На моем ноутбуке я собрал программу, которая позволяет пользователю ходить по простому ландшафту, используя пару шейдеров, которые реализовали раскраски для переносчика, а также отображение освещения и текстур. Все работало блестяще, пока я не запустил ту же программу на своем рабочем столе.

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

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

Мой ноутбук - старый Lenovo T61P с дуэтом Centrino (Core 2) и графической картой nvidia Quadro, управляющей Ubuntu 10.10. У моего рабочего стола есть i7 с Radeon HD 4850 x2 (однократная карта, двойная графический процессор) от Dual Booting Saphire в Ubuntu 10.10 и (одиночная карта, Dual GPU) от Dual Booting в 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 или нет. Только если я прокомментирую строку varyingColor = in_color; правильно ли выводя геометрия. Первоначально шейдеры взяли на входы VEC3, я только изменил их, чтобы взять VEC4s при устранении неполадок.

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top